diff --git a/res/layout/device_admin_add.xml b/res/layout/device_admin_add.xml
index 4e8a6ac..b42b694 100644
--- a/res/layout/device_admin_add.xml
+++ b/res/layout/device_admin_add.xml
@@ -149,6 +149,15 @@
                 android:text="@string/cancel"
                 style="?android:attr/buttonBarButtonStyle"
                 android:layout_height="wrap_content" />
+            <Button android:id="@+id/uninstall_button"
+                android:layout_width="0dip"
+                android:layout_gravity="end"
+                android:layout_weight="1"
+                android:maxLines="2"
+                android:text="@string/uninstall_device_admin"
+                style="?android:attr/buttonBarButtonStyle"
+                android:layout_height="wrap_content"
+                android:visibility="gone" />
             <Button android:id="@+id/action_button"
                 android:layout_width="0dip"
                 android:layout_gravity="start"
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index e070505..b048b71 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -15,9 +15,6 @@
 -->
 
 <resources>
-    <declare-styleable name="WifiEncryptionState">
-        <attr name="state_encrypted" format="boolean" />
-    </declare-styleable>
     <declare-styleable name="IconPreferenceScreen">
         <attr name="icon" />
     </declare-styleable>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 6140c78..30aa52f 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -207,7 +207,6 @@
 
     <!-- WiFi Preferences -->
     <dimen name="wifi_divider_height">1px</dimen>
-    <dimen name="wifi_preference_badge_padding">8dip</dimen>
 
     <!-- Color picker -->
     <dimen name="color_swatch_size">16dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index e3c105f..af9da69 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1020,6 +1020,15 @@
     <!-- Summary specifying that this is the current screen lock setting [CHAR LIMIT=45] -->
     <string name="current_screen_lock">Current screen lock</string>
 
+    <!-- Title for preference that guides the user through creating a backup unlock pattern for fingerprint [CHAR LIMIT=45]-->
+    <string name="fingerprint_unlock_set_unlock_pattern">Fingerprint + Pattern</string>
+
+    <!-- Title for preference that guides the user through creating a backup unlock PIN for fingerprint [CHAR LIMIT=45]-->
+    <string name="fingerprint_unlock_set_unlock_pin">Fingerprint + PIN</string>
+
+    <!-- Title for preference that guides the user through creating a backup unlock password for fingerprint [CHAR LIMIT=45]-->
+    <string name="fingerprint_unlock_set_unlock_password">Fingerprint + Password</string>
+
     <!-- Summary for preference that has been disabled by because of the DevicePolicyAdmin, or because device encryption is enabled, or because there are credentials in the credential storage [CHAR LIMIT=50] -->
     <string name="unlock_set_unlock_disabled_summary">Disabled by administrator, encryption policy, or credential storage</string>
 
@@ -4523,6 +4532,8 @@
     <string name="active_device_admin_msg">Device administrator</string>
     <!-- Label for button to remove the active device admin -->
     <string name="remove_device_admin">Deactivate</string>
+    <!-- Label for button to uninstall the device admin application [CHAR LIMIT=40] -->
+    <string name="uninstall_device_admin">Uninstall</string>
     <!-- Label for screen showing to select device policy -->
     <string name="select_device_admin_msg">Device administrators</string>
     <!-- Message when there are no available device admins to display -->
diff --git a/res/values/themes.xml b/res/values/themes.xml
index f3a9369..da74348 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -24,7 +24,6 @@
     <attr name="setup_divider_color" format="reference" />
     <attr name="side_margin" format="reference|dimension" />
     <attr name="wifi_signal_color" format="reference" />
-    <attr name="wifi_signal" format="reference" />
 
     <style name="SetupWizardDisableAppStartingTheme">
         <!-- Theme to disable the app starting window. The actual theme of the activity needs to
diff --git a/res/xml/wifi_settings.xml b/res/xml/wifi_settings.xml
index 99a0c4e..b4ab126 100644
--- a/res/xml/wifi_settings.xml
+++ b/res/xml/wifi_settings.xml
@@ -21,7 +21,7 @@
 
     <!-- Needed so PreferenceGroupAdapter allows AccessPointPreference to be
          recycled. Removed in onResume -->
-    <com.android.settings.wifi.AccessPointPreference
+    <com.android.settings.wifi.LongPressAccessPointPreference
         android:key="dummy" />
 
 </PreferenceScreen>
diff --git a/src/com/android/settings/ChooseLockGeneric.java b/src/com/android/settings/ChooseLockGeneric.java
index 0e6cf3b..6461b93 100644
--- a/src/com/android/settings/ChooseLockGeneric.java
+++ b/src/com/android/settings/ChooseLockGeneric.java
@@ -300,6 +300,7 @@
                 }
                 addPreferencesFromResource(R.xml.security_settings_picker);
                 disableUnusablePreferences(quality, hideDisabledPrefs);
+                updatePreferenceText();
                 updateCurrentPreference();
                 updatePreferenceSummaryIfNeeded();
             } else {
@@ -307,6 +308,19 @@
             }
         }
 
+        private void updatePreferenceText() {
+            if (mForFingerprint) {
+                Preference pattern = findPreference(KEY_UNLOCK_SET_PATTERN);
+                pattern.setTitle(R.string.fingerprint_unlock_set_unlock_pattern);
+
+                Preference pin = findPreference(KEY_UNLOCK_SET_PIN);
+                pin.setTitle(R.string.fingerprint_unlock_set_unlock_pin);
+
+                Preference password = findPreference(KEY_UNLOCK_SET_PASSWORD);
+                password.setTitle(R.string.fingerprint_unlock_set_unlock_password);
+            }
+        }
+
         private void updateCurrentPreference() {
             String currentKey = getKeyForCurrent();
             Preference preference = findPreference(currentKey);
diff --git a/src/com/android/settings/DeviceAdminAdd.java b/src/com/android/settings/DeviceAdminAdd.java
index 3067ca2..1ce72f9 100644
--- a/src/com/android/settings/DeviceAdminAdd.java
+++ b/src/com/android/settings/DeviceAdminAdd.java
@@ -36,6 +36,7 @@
 import android.content.pm.ResolveInfo;
 import android.content.pm.UserInfo;
 import android.content.res.Resources;
+import android.net.Uri;
 import android.os.Binder;
 import android.os.Bundle;
 import android.os.Handler;
@@ -74,6 +75,8 @@
     private static final int MAX_ADD_MSG_LINES_LANDSCAPE = 2;
     private static final int MAX_ADD_MSG_LINES = 15;
 
+    private static final int REQUEST_CODE_UNINSTALL = 1;
+
     Handler mHandler;
 
     DevicePolicyManager mDPM;
@@ -93,6 +96,7 @@
     TextView mSupportMessage;
     ViewGroup mAdminPolicies;
     Button mActionButton;
+    Button mUninstallButton;
     Button mCancelButton;
 
     boolean mAdding;
@@ -285,6 +289,7 @@
         mAdminWarning = (TextView) findViewById(R.id.admin_warning);
         mAdminPolicies = (ViewGroup) findViewById(R.id.admin_policies);
         mSupportMessage = (TextView) findViewById(R.id.admin_support_message);
+
         mCancelButton = (Button) findViewById(R.id.cancel_button);
         mCancelButton.setFilterTouchesWhenObscured(true);
         mCancelButton.setOnClickListener(new View.OnClickListener() {
@@ -294,6 +299,17 @@
                 finish();
             }
         });
+
+        mUninstallButton = (Button) findViewById(R.id.uninstall_button);
+        mUninstallButton.setFilterTouchesWhenObscured(true);
+        mUninstallButton.setOnClickListener(new View.OnClickListener() {
+            public void onClick(View v) {
+                EventLog.writeEvent(EventLogTags.EXP_DET_DEVICE_ADMIN_UNINSTALLED_BY_USER,
+                        mDeviceAdmin.getActivityInfo().applicationInfo.uid);
+                uninstall();
+            }
+        });
+
         mActionButton = (Button) findViewById(R.id.action_button);
         mActionButton.setFilterTouchesWhenObscured(true);
         mActionButton.setOnClickListener(new View.OnClickListener() {
@@ -448,6 +464,18 @@
         }
     }
 
+    @Override
+    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        switch (requestCode) {
+            case REQUEST_CODE_UNINSTALL:
+                if (resultCode == RESULT_OK) {
+                    finish();
+                }
+                return;
+        }
+        super.onActivityResult(requestCode, resultCode, data);
+    }
+
     void updateInterface() {
         mAdminIcon.setImageDrawable(mDeviceAdmin.loadIcon(getPackageManager()));
         mAdminName.setText(mDeviceAdmin.loadLabel(getPackageManager()));
@@ -516,6 +544,9 @@
                 setTitle(getText(R.string.add_device_admin_msg));
             }
             mActionButton.setText(getText(R.string.add_device_admin));
+            if (isAdminUninstallable()) {
+                mUninstallButton.setVisibility(View.VISIBLE);
+            }
             mSupportMessage.setVisibility(View.GONE);
             mAdding = true;
         }
@@ -564,4 +595,18 @@
                 UserHandle.getUserId(adminInfo.getActivityInfo().applicationInfo.uid));
         return info != null ? info.isManagedProfile() : false;
     }
+
+    private boolean isAdminUninstallable() {
+        // System apps can't be uninstalled.
+        return !mDeviceAdmin.getActivityInfo().applicationInfo.isSystemApp();
+    }
+
+    private void uninstall() {
+        final Uri packageURI = Uri.parse("package:" + mDeviceAdmin.getPackageName());
+        final Intent uninstallIntent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE, packageURI);
+        uninstallIntent.putExtra(Intent.EXTRA_UNINSTALL_ALL_USERS, false);
+        uninstallIntent.putExtra(Intent.EXTRA_RETURN_RESULT, true);
+
+        startActivityForResult(uninstallIntent, REQUEST_CODE_UNINSTALL);
+    }
 }
diff --git a/src/com/android/settings/EventLogTags.logtags b/src/com/android/settings/EventLogTags.logtags
index b21623c..1811866 100644
--- a/src/com/android/settings/EventLogTags.logtags
+++ b/src/com/android/settings/EventLogTags.logtags
@@ -10,3 +10,6 @@
 
 # log whether user declined activation of device admin
 90202 exp_det_device_admin_declined_by_user (app_signature|3)
+
+# log whether user uninstalled device admin on activation screen
+90203 exp_det_device_admin_uninstalled_by_user (app_signature|3)
diff --git a/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java
index beb1a8f..61cecf4 100644
--- a/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/fingerprint/FingerprintEnrollIntroduction.java
@@ -18,11 +18,13 @@
 
 import android.app.admin.DevicePolicyManager;
 import android.content.Intent;
+import android.hardware.fingerprint.FingerprintManager;
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.view.View;
 
 import com.android.internal.logging.MetricsLogger;
+import com.android.settings.ChooseLockGeneric;
 import com.android.settings.ChooseLockSettingsHelper;
 import com.android.settings.HelpUtils;
 import com.android.settings.R;
@@ -32,6 +34,9 @@
  */
 public class FingerprintEnrollIntroduction extends FingerprintEnrollBase {
 
+    private static final int CHOOSE_LOCK_GENERIC_REQUEST = 1;
+    private static final int FINGERPRINT_FIND_SENSOR_REQUEST = 2;
+
     private boolean mHasPassword;
 
     @Override
@@ -43,24 +48,48 @@
         findViewById(R.id.learn_more_button).setOnClickListener(this);
         final int passwordQuality = new ChooseLockSettingsHelper(this).utils()
                 .getActivePasswordQuality(UserHandle.myUserId());
+        updatePasswordQuality();
+    }
+
+    private void updatePasswordQuality() {
+        final int passwordQuality = new ChooseLockSettingsHelper(this).utils()
+                .getActivePasswordQuality(UserHandle.myUserId());
         mHasPassword = passwordQuality != DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
     }
 
     @Override
     protected void onNextButtonClick() {
-        Intent intent;
         if (!mHasPassword) {
             // No fingerprints registered, launch into enrollment wizard.
-            intent = getOnboardIntent();
+            launchChooseLock();
         } else {
             // Lock thingy is already set up, launch directly into find sensor step from wizard.
-            intent = getFindSensorIntent();
+            launchFindSensor(null);
         }
-        startActivityForResult(intent, 0);
     }
 
-    protected Intent getOnboardIntent() {
-        return new Intent(this, FingerprintEnrollOnboard.class);
+    private void launchChooseLock() {
+        Intent intent = getChooseLockIntent();
+        long challenge = getSystemService(FingerprintManager.class).preEnroll();
+        intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.MINIMUM_QUALITY_KEY,
+                DevicePolicyManager.PASSWORD_QUALITY_SOMETHING);
+        intent.putExtra(ChooseLockGeneric.ChooseLockGenericFragment.HIDE_DISABLED_PREFS, true);
+        intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_HAS_CHALLENGE, true);
+        intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE, challenge);
+        intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, true);
+        startActivityForResult(intent, CHOOSE_LOCK_GENERIC_REQUEST);
+    }
+
+    private void launchFindSensor(byte[] token) {
+        Intent intent = getFindSensorIntent();
+        if (token != null) {
+            intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token);
+        }
+        startActivityForResult(intent, FINGERPRINT_FIND_SENSOR_REQUEST);
+    }
+
+    protected Intent getChooseLockIntent() {
+        return new Intent(this, ChooseLockGeneric.class);
     }
 
     protected Intent getFindSensorIntent() {
@@ -70,8 +99,15 @@
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         if (resultCode == RESULT_FINISHED) {
-            setResult(RESULT_OK);
-            finish();
+            if (requestCode == FINGERPRINT_FIND_SENSOR_REQUEST) {
+                setResult(RESULT_OK);
+                finish();
+            } else if (requestCode == CHOOSE_LOCK_GENERIC_REQUEST) {
+                updatePasswordQuality();
+                byte[] token = data.getByteArrayExtra(
+                        ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
+                launchFindSensor(token);
+            }
         } else {
             super.onActivityResult(requestCode, resultCode, data);
         }
diff --git a/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroduction.java b/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroduction.java
index c7e39e5..0f0d35f 100644
--- a/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/fingerprint/SetupFingerprintEnrollIntroduction.java
@@ -23,6 +23,7 @@
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
+import com.android.settings.SetupChooseLockGeneric;
 import com.android.settings.SetupWizardUtils;
 import com.android.setupwizardlib.view.NavigationBar;
 
@@ -30,8 +31,8 @@
         implements NavigationBar.NavigationBarListener {
 
     @Override
-    protected Intent getOnboardIntent() {
-        final Intent intent = new Intent(this, SetupFingerprintEnrollOnboard.class);
+    protected Intent getChooseLockIntent() {
+        Intent intent = new Intent(this, SetupChooseLockGeneric.class);
         SetupWizardUtils.copySetupExtras(getIntent(), intent);
         return intent;
     }
diff --git a/src/com/android/settings/wifi/AccessPointPreference.java b/src/com/android/settings/wifi/AccessPointPreference.java
deleted file mode 100644
index 061055a..0000000
--- a/src/com/android/settings/wifi/AccessPointPreference.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Copyright (C) 2015 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.wifi;
-
-import android.app.Fragment;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.StateListDrawable;
-import android.net.wifi.WifiConfiguration;
-import android.os.Looper;
-import android.os.UserHandle;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceViewHolder;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.SparseArray;
-import android.view.View;
-import android.widget.TextView;
-
-import com.android.settings.R;
-import com.android.settingslib.wifi.AccessPoint;
-
-public class AccessPointPreference extends Preference {
-
-    private static final int[] STATE_SECURED = {
-        R.attr.state_encrypted
-    };
-    private static final int[] STATE_NONE = {};
-
-    private static int[] wifi_signal_attributes = { R.attr.wifi_signal };
-
-    private final StateListDrawable mWifiSld;
-    private final int mBadgePadding;
-    private final UserBadgeCache mBadgeCache;
-
-    private final Fragment mFragment;
-
-    private TextView mTitleView;
-    private boolean mForSavedNetworks = false;
-    private AccessPoint mAccessPoint;
-    private Drawable mBadge;
-    private int mLevel;
-    private CharSequence mContentDescription;
-
-    static final int[] WIFI_CONNECTION_STRENGTH = {
-        R.string.accessibility_wifi_one_bar,
-        R.string.accessibility_wifi_two_bars,
-        R.string.accessibility_wifi_three_bars,
-        R.string.accessibility_wifi_signal_full
-    };
-
-    // Used for dummy pref.
-    public AccessPointPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-        mWifiSld = null;
-        mBadgePadding = 0;
-        mBadgeCache = null;
-        mFragment = null;
-    }
-
-    public AccessPointPreference(AccessPoint accessPoint, Context context, UserBadgeCache cache,
-            boolean forSavedNetworks, Fragment fragment) {
-        super(context);
-        mFragment = fragment;
-        mBadgeCache = cache;
-        mAccessPoint = accessPoint;
-        mForSavedNetworks = forSavedNetworks;
-        mAccessPoint.setTag(this);
-        mLevel = -1;
-
-        mWifiSld = (StateListDrawable) context.getTheme()
-                .obtainStyledAttributes(wifi_signal_attributes).getDrawable(0);
-
-        // Distance from the end of the title at which this AP's user badge should sit.
-        mBadgePadding = context.getResources()
-                .getDimensionPixelSize(R.dimen.wifi_preference_badge_padding);
-        refresh();
-    }
-
-    public AccessPoint getAccessPoint() {
-        return mAccessPoint;
-    }
-
-    @Override
-    public void onBindViewHolder(final PreferenceViewHolder view) {
-        super.onBindViewHolder(view);
-        if (mFragment != null) {
-            view.itemView.setOnCreateContextMenuListener(mFragment);
-            view.itemView.setTag(this);
-            view.itemView.setLongClickable(true);
-        }
-        if (mAccessPoint == null) {
-            // Used for dummy pref.
-            return;
-        }
-        Drawable drawable = getIcon();
-        if (drawable != null) {
-            drawable.setLevel(mLevel);
-        }
-
-        mTitleView = (TextView) view.findViewById(com.android.internal.R.id.title);
-        if (mTitleView != null) {
-            // Attach to the end of the title view
-            mTitleView.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, mBadge, null);
-            mTitleView.setCompoundDrawablePadding(mBadgePadding);
-        }
-        view.itemView.setContentDescription(mContentDescription);
-    }
-
-    protected void updateIcon(int level, Context context) {
-        if (level == -1) {
-            setIcon(null);
-        } else {
-            if (getIcon() == null) {
-                // To avoid a drawing race condition, we first set the state (SECURE/NONE) and then
-                // set the icon (drawable) to that state's drawable.
-                // If sld is null then we are indexing and therefore do not have access to
-                // (nor need to display) the drawable.
-                if (mWifiSld != null) {
-                    mWifiSld.setState((mAccessPoint.getSecurity() != AccessPoint.SECURITY_NONE)
-                            ? STATE_SECURED
-                            : STATE_NONE);
-                    Drawable drawable = mWifiSld.getCurrent();
-                    if (!mForSavedNetworks) {
-                        setIcon(drawable);
-                    } else {
-                        setIcon(null);
-                    }
-                }
-            }
-        }
-    }
-
-    protected void updateBadge(Context context) {
-        WifiConfiguration config = mAccessPoint.getConfig();
-        if (config != null) {
-            // Fetch badge (may be null)
-            // Get the badge using a cache since the PM will ask the UserManager for the list
-            // of profiles every time otherwise.
-            mBadge = mBadgeCache.getUserBadge(config.creatorUid);
-        }
-    }
-
-    /**
-     * Updates the title and summary; may indirectly call notifyChanged().
-     */
-    public void refresh() {
-        if (mForSavedNetworks) {
-            setTitle(mAccessPoint.getConfigName());
-        } else {
-            setTitle(mAccessPoint.getSsid());
-        }
-
-        final Context context = getContext();
-        int level = mAccessPoint.getLevel();
-        if (level != mLevel) {
-            mLevel = level;
-            updateIcon(mLevel, context);
-            notifyChanged();
-        }
-        updateBadge(context);
-
-        setSummary(mForSavedNetworks ? mAccessPoint.getSavedNetworkSummary()
-                : mAccessPoint.getSettingsSummary());
-
-        mContentDescription = getTitle();
-        if (getSummary() != null) {
-            mContentDescription = TextUtils.concat(mContentDescription, ",", getSummary());
-        }
-        if (level >= 0 && level < WIFI_CONNECTION_STRENGTH.length) {
-            mContentDescription = TextUtils.concat(mContentDescription, ",",
-                    getContext().getString(WIFI_CONNECTION_STRENGTH[level]));
-        }
-    }
-
-    @Override
-    protected void notifyChanged() {
-        if (Looper.getMainLooper() != Looper.myLooper()) {
-            // Let our BG thread callbacks call setTitle/setSummary.
-            postNotifyChanged();
-        } else {
-            super.notifyChanged();
-        }
-    }
-
-    public void onLevelChanged() {
-        postNotifyChanged();
-    }
-
-    private void postNotifyChanged() {
-        if (mTitleView != null) {
-            mTitleView.post(mNotifyChanged);
-        } // Otherwise we haven't been bound yet, and don't need to update.
-    }
-
-    private final Runnable mNotifyChanged = new Runnable() {
-        @Override
-        public void run() {
-            notifyChanged();
-        }
-    };
-
-    public static class UserBadgeCache {
-        private final SparseArray<Drawable> mBadges = new SparseArray<>();
-        private final PackageManager mPm;
-
-        UserBadgeCache(PackageManager pm) {
-            mPm = pm;
-        }
-
-        private Drawable getUserBadge(int userId) {
-            int index = mBadges.indexOfKey(userId);
-            if (index < 0) {
-                Drawable badge = mPm.getUserBadgeForDensity(new UserHandle(userId), 0 /* dpi */);
-                mBadges.put(userId, badge);
-                return badge;
-            }
-            return mBadges.valueAt(index);
-        }
-    }
-}
diff --git a/src/com/android/settings/wifi/LongPressAccessPointPreference.java b/src/com/android/settings/wifi/LongPressAccessPointPreference.java
new file mode 100644
index 0000000..46746cb
--- /dev/null
+++ b/src/com/android/settings/wifi/LongPressAccessPointPreference.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2015 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.wifi;
+
+import android.app.Fragment;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.StateListDrawable;
+import android.net.wifi.WifiConfiguration;
+import android.os.Looper;
+import android.os.UserHandle;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceViewHolder;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.SparseArray;
+import android.view.View;
+import android.widget.TextView;
+
+import com.android.settings.R;
+import com.android.settingslib.wifi.AccessPoint;
+import com.android.settingslib.wifi.AccessPointPreference;
+
+public class LongPressAccessPointPreference extends AccessPointPreference {
+
+    private final Fragment mFragment;
+
+    // Used for dummy pref.
+    public LongPressAccessPointPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        mFragment = null;
+    }
+
+    public LongPressAccessPointPreference(AccessPoint accessPoint, Context context,
+            UserBadgeCache cache, boolean forSavedNetworks, Fragment fragment) {
+        super(accessPoint, context, cache, forSavedNetworks);
+        mFragment = fragment;
+    }
+
+    @Override
+    public void onBindViewHolder(final PreferenceViewHolder view) {
+        super.onBindViewHolder(view);
+        if (mFragment != null) {
+            view.itemView.setOnCreateContextMenuListener(mFragment);
+            view.itemView.setTag(this);
+            view.itemView.setLongClickable(true);
+        }
+    }
+}
diff --git a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
index e0ea23a..c5aca20 100644
--- a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
+++ b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java
@@ -31,8 +31,8 @@
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import com.android.settings.search.SearchIndexableRaw;
-import com.android.settings.wifi.AccessPointPreference.UserBadgeCache;
 import com.android.settingslib.wifi.AccessPoint;
+import com.android.settingslib.wifi.AccessPointPreference;
 import com.android.settingslib.wifi.WifiTracker;
 
 import java.util.ArrayList;
@@ -53,7 +53,7 @@
     private Bundle mAccessPointSavedState;
     private AccessPoint mSelectedAccessPoint;
 
-    private UserBadgeCache mUserBadgeCache;
+    private AccessPointPreference.UserBadgeCache mUserBadgeCache;
 
     // Instance state key
     private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state";
@@ -67,7 +67,7 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         addPreferencesFromResource(R.xml.wifi_display_saved_access_points);
-        mUserBadgeCache = new UserBadgeCache(getPackageManager());
+        mUserBadgeCache = new AccessPointPreference.UserBadgeCache(getPackageManager());
     }
 
     @Override
@@ -108,8 +108,9 @@
 
         final int accessPointsSize = accessPoints.size();
         for (int i = 0; i < accessPointsSize; ++i){
-            AccessPointPreference preference = new AccessPointPreference(accessPoints.get(i),
-                    context, mUserBadgeCache, true, this);
+            LongPressAccessPointPreference preference =
+                    new LongPressAccessPointPreference(accessPoints.get(i), context,
+                            mUserBadgeCache, true, this);
             preference.setIcon(null);
             preferenceScreen.addPreference(preference);
         }
@@ -119,7 +120,7 @@
         }
     }
 
-    private void showDialog(AccessPointPreference accessPoint, boolean edit) {
+    private void showDialog(LongPressAccessPointPreference accessPoint, boolean edit) {
         if (mDialog != null) {
             removeDialog(WifiSettings.WIFI_DIALOG_ID);
             mDialog = null;
@@ -184,8 +185,8 @@
 
     @Override
     public boolean onPreferenceTreeClick(Preference preference) {
-        if (preference instanceof AccessPointPreference) {
-            showDialog((AccessPointPreference) preference, false);
+        if (preference instanceof LongPressAccessPointPreference) {
+            showDialog((LongPressAccessPointPreference) preference, false);
             return true;
         } else{
             return super.onPreferenceTreeClick(preference);
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 8be0e79..67f1c43 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -63,6 +63,7 @@
 import android.widget.TextView;
 import android.widget.TextView.BufferType;
 import android.widget.Toast;
+
 import com.android.internal.logging.MetricsLogger;
 import com.android.settings.LinkifyUtils;
 import com.android.settings.R;
@@ -73,9 +74,9 @@
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import com.android.settings.search.SearchIndexableRaw;
-import com.android.settings.wifi.AccessPointPreference.UserBadgeCache;
 import com.android.settingslib.wifi.AccessPoint;
 import com.android.settingslib.wifi.AccessPoint.AccessPointListener;
+import com.android.settingslib.wifi.AccessPointPreference;
 import com.android.settingslib.wifi.WifiStatusTracker;
 import com.android.settingslib.wifi.WifiTracker;
 
@@ -154,7 +155,7 @@
 
     private HandlerThread mBgThread;
 
-    private UserBadgeCache mUserBadgeCache;
+    private AccessPointPreference.UserBadgeCache mUserBadgeCache;
     private Preference mAddPreference;
 
     /* End of "used in Wifi Setup context" */
@@ -184,7 +185,7 @@
         mAddPreference.setIcon(ic_add);
         mAddPreference.setTitle(R.string.wifi_add_network);
 
-        mUserBadgeCache = new UserBadgeCache(getPackageManager());
+        mUserBadgeCache = new AccessPointPreference.UserBadgeCache(getPackageManager());
 
         mBgThread = new HandlerThread(TAG, Process.THREAD_PRIORITY_BACKGROUND);
         mBgThread.start();
@@ -446,8 +447,9 @@
     public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
             Preference preference = (Preference) view.getTag();
 
-            if (preference instanceof AccessPointPreference) {
-                mSelectedAccessPoint = ((AccessPointPreference) preference).getAccessPoint();
+            if (preference instanceof LongPressAccessPointPreference) {
+                mSelectedAccessPoint =
+                        ((LongPressAccessPointPreference) preference).getAccessPoint();
                 menu.setHeaderTitle(mSelectedAccessPoint.getSsid());
                 if (mSelectedAccessPoint.isConnectable()) {
                     menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect);
@@ -513,8 +515,8 @@
 
     @Override
     public boolean onPreferenceTreeClick(Preference preference) {
-        if (preference instanceof AccessPointPreference) {
-            mSelectedAccessPoint = ((AccessPointPreference) preference).getAccessPoint();
+        if (preference instanceof LongPressAccessPointPreference) {
+            mSelectedAccessPoint = ((LongPressAccessPointPreference) preference).getAccessPoint();
             if (mSelectedAccessPoint == null) {
                 return false;
             }
@@ -651,7 +653,8 @@
                             getPreferenceScreen().addPreference(pref);
                             continue;
                         }
-                        AccessPointPreference preference = new AccessPointPreference(accessPoint,
+                        LongPressAccessPointPreference
+                                preference = new LongPressAccessPointPreference(accessPoint,
                                 getPrefContext(), mUserBadgeCache, false, this);
                         preference.setOrder(index++);
 
@@ -876,15 +879,6 @@
     }
 
     /**
-     * Refreshes acccess points and ask Wifi module to scan networks again.
-     */
-    /* package */ void refreshAccessPoints() {
-        mWifiTracker.resumeScanning();
-
-        getPreferenceScreen().removeAll();
-    }
-
-    /**
      * Called when "add network" button is pressed.
      */
     /* package */ void onAddNetworkPressed() {
@@ -894,29 +888,6 @@
         showDialog(null, WifiConfigUiBase.MODE_CONNECT);
     }
 
-    /* package */ int getAccessPointsCount() {
-        final boolean wifiIsEnabled = mWifiTracker.isWifiEnabled();
-        if (wifiIsEnabled) {
-            return getPreferenceScreen().getPreferenceCount();
-        } else {
-            return 0;
-        }
-    }
-
-    /**
-     * Requests wifi module to pause wifi scan. May be ignored when the module is disabled.
-     */
-    /* package */ void pauseWifiScan() {
-        mWifiTracker.pauseScanning();
-    }
-
-    /**
-     * Requests wifi module to resume wifi scan. May be ignored when the module is disabled.
-     */
-    /* package */ void resumeWifiScan() {
-        mWifiTracker.resumeScanning();
-    }
-
     @Override
     protected int getHelpResource() {
         return R.string.help_url_wifi;
@@ -924,19 +895,19 @@
 
     @Override
     public void onAccessPointChanged(AccessPoint accessPoint) {
-        ((AccessPointPreference) accessPoint.getTag()).refresh();
+        ((LongPressAccessPointPreference) accessPoint.getTag()).refresh();
     }
 
     @Override
     public void onLevelChanged(AccessPoint accessPoint) {
-        ((AccessPointPreference) accessPoint.getTag()).onLevelChanged();
+        ((LongPressAccessPointPreference) accessPoint.getTag()).onLevelChanged();
     }
 
     public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
         new BaseSearchIndexProvider() {
             @Override
             public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
-                final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>();
+                final List<SearchIndexableRaw> result = new ArrayList<>();
                 final Resources res = context.getResources();
 
                 // Add fragment title
