diff --git a/res/drawable-hdpi/ic_wps_dark.png b/res/drawable-hdpi/ic_wps_dark.png
deleted file mode 100644
index 918b0cc..0000000
--- a/res/drawable-hdpi/ic_wps_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_wps_light.png b/res/drawable-hdpi/ic_wps_light.png
deleted file mode 100644
index 5ad9f3e..0000000
--- a/res/drawable-hdpi/ic_wps_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_wps_dark.png b/res/drawable-mdpi/ic_wps_dark.png
deleted file mode 100644
index 77d73a8..0000000
--- a/res/drawable-mdpi/ic_wps_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_wps_light.png b/res/drawable-mdpi/ic_wps_light.png
deleted file mode 100644
index ef560fa..0000000
--- a/res/drawable-mdpi/ic_wps_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_wps_dark.png b/res/drawable-xhdpi/ic_wps_dark.png
deleted file mode 100644
index 3ea4a3b..0000000
--- a/res/drawable-xhdpi/ic_wps_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_wps_light.png b/res/drawable-xhdpi/ic_wps_light.png
deleted file mode 100644
index f913d2c..0000000
--- a/res/drawable-xhdpi/ic_wps_light.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_wps_dark.png b/res/drawable-xxhdpi/ic_wps_dark.png
deleted file mode 100644
index 8b38db8..0000000
--- a/res/drawable-xxhdpi/ic_wps_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/ic_wps_light.png b/res/drawable-xxhdpi/ic_wps_light.png
deleted file mode 100644
index 0084175..0000000
--- a/res/drawable-xxhdpi/ic_wps_light.png
+++ /dev/null
Binary files differ
diff --git a/res/layout/wifi_wps_dialog.xml b/res/layout/wifi_wps_dialog.xml
deleted file mode 100644
index a86823d..0000000
--- a/res/layout/wifi_wps_dialog.xml
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2012 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.
--->
-
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
-         android:layout_width="300sp"
-         android:layout_height="wrap_content">
-
-    <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:padding="8dip"
-            android:orientation="vertical">
-
-        <TextView
-                android:id="@+id/wps_dialog_txt"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="8dip" />
-
-        <ImageView
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_gravity="center"
-                android:layout_marginTop="8dip"
-                android:src="?attr/ic_wps" />
-
-        <ProgressBar
-                android:id="@+id/wps_timeout_bar"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="20dip"
-                style="?android:attr/progressBarStyleHorizontal" />
-
-        <ProgressBar
-                android:id="@+id/wps_progress_bar"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:layout_marginTop="20dip"
-                style="?android:attr/progressBarStyle" />
-
-        <RelativeLayout
-                android:gravity="center"
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content">
-
-            <Button
-                    android:id="@+id/wps_dialog_btn"
-                    android:layout_width="wrap_content"
-                    android:layout_height="wrap_content"
-                    android:text="@string/cancel" />
-        </RelativeLayout>
-    </LinearLayout>
-</ScrollView>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5fbbf4d..e75bb24 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1845,12 +1845,8 @@
     <string name="wifi_configure_settings_preference_summary_wakeup_off">Wi\u2011Fi doesn\u0027t turn back on automatically</string>
     <!-- Header for the list of wifi networks-->
     <string name="wifi_access_points">Wi\u2011Fi networks</string>
-    <!-- Menu option to do WPS Push Button [CHAR LIMIT=25]-->
-    <string name="wifi_menu_wps_pbc">WPS Push Button</string>
     <!-- Content description for menu button in Wifi setup. Not shown on the screen. [CHAR LIMIT=NONE] -->
     <string name="wifi_menu_more_options">More options</string>
-    <!-- Menu option to do WPS Pin Entry [CHAR LIMIT=25]-->
-    <string name="wifi_menu_wps_pin">WPS Pin Entry</string>
     <!-- Menu option to launch Wi-Fi Direct settings [CHAR LIMIT=20]-->
     <string name="wifi_menu_p2p">Wi\u2011Fi Direct</string>
     <!-- Menu option to scan Wi-Fi networks -->
@@ -1887,32 +1883,6 @@
     <string name="wifi_advanced_toggle_description_expanded">Drop down list Advanced Options. Double-tap to collapse.</string>
     <!-- Message for talkback to say when Advanced Options is collapsed [CHAR LIMIT=NONE] -->
     <string name="wifi_advanced_toggle_description_collapsed">Drop down list Advanced Options. Double-tap to expand.</string>
-    <!-- Title for the WPS setup dialog [CHAR LIMIT=50] -->
-    <string name="wifi_wps_setup_title">Wi\u2011Fi Protected Setup</string>
-    <!-- Message in WPS dialog at start up [CHAR LIMIT=150] -->
-    <string name="wifi_wps_setup_msg">Starting WPS\u2026</string>
-    <!-- Message in WPS dialog for PBC after start up [CHAR LIMIT=150] -->
-    <string name="wifi_wps_onstart_pbc">Press the Wi\u2011Fi Protected Setup button on your router. It may be called \u201cWPS\u201d or marked with this symbol:</string>
-    <!-- Message in WPS dialog for PIN after start up [CHAR LIMIT=150] -->
-    <string name="wifi_wps_onstart_pin">Enter pin <xliff:g id="number">%1$s</xliff:g> on your Wi\u2011Fi router. The setup can take up to two minutes to complete.</string>
-    <!-- Text displayed when WPS succeeds [CHAR LIMIT=150] -->
-    <string name="wifi_wps_complete">WPS succeeded. Connecting to the network\u2026</string>
-    <!-- Text displayed when Wi-Fi is connected through WPS [CHAR LIMIT=150] -->
-    <string name="wifi_wps_connected">Connected to Wi\u2011Fi network <xliff:g id="network_name">%s</xliff:g></string>
-    <!-- Text displayed when WPS setup is in progress [CHAR LIMIT=150] -->
-    <string name="wifi_wps_in_progress">WPS is already in progress and can take up to two minutes to complete</string>
-    <!-- Text displayed when WPS fails to start [CHAR LIMIT=150] -->
-    <string name="wifi_wps_failed_generic">WPS failed. Please try again in a few minutes.</string>
-    <!-- Text displayed when WPS fails due to WEP [CHAR LIMIT=150] -->
-    <string name="wifi_wps_failed_wep">The wireless router security setting (WEP) is not supported</string>
-    <!-- Text displayed when WPS fails to TKIP [CHAR LIMIT=150] -->
-    <string name="wifi_wps_failed_tkip">The wireless router security setting (TKIP) is not supported</string>
-    <!-- Text displayed when WPS fails due to authentication issues [CHAR LIMIT=150] -->
-    <string name="wifi_wps_failed_auth">Authentication failure. Please try again.</string>
-    <!-- Text displayed when WPS fails due to another session [CHAR LIMIT=150] -->
-    <string name="wifi_wps_failed_overlap">Another WPS session was detected. Please try again in a few minutes.</string>
-    <!-- Text displayed when WPS fails due to wifi disconnected [CHAR LIMIT=150] -->
-    <string name="wifi_wps_failed_wifi_disconnected">Wi\u2011Fi disconnected. WPS setup canceled.</string>
     <!-- Label for the SSID of the network -->
     <string name="wifi_ssid">Network name</string>
     <!-- Hint for a text field to enter the SSID of a hidden wifi network. [CHAR LIMIT=35] -->
diff --git a/res/values/themes.xml b/res/values/themes.xml
index e0f3989..d960654 100644
--- a/res/values/themes.xml
+++ b/res/values/themes.xml
@@ -17,7 +17,6 @@
 <resources>
     <attr name="fingerprint_layout_theme" format="reference" />
     <attr name="ic_menu_moreoverflow" format="reference" />
-    <attr name="ic_wps" format="reference" />
     <attr name="side_margin" format="reference|dimension" />
     <attr name="wifi_signal_color" format="reference" />
 
@@ -28,7 +27,6 @@
         <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
         <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
         <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
-        <item name="ic_wps">@drawable/ic_wps_dark</item>
         <item name="side_margin">0dip</item>
         <item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
         <item name="wifi_signal">@drawable/wifi_signal</item>
@@ -47,7 +45,6 @@
         <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
         <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
         <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
-        <item name="ic_wps">@drawable/ic_wps_light</item>
         <item name="side_margin">0dip</item>
         <item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
         <item name="wifi_signal">@drawable/wifi_signal</item>
@@ -65,7 +62,6 @@
         <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
         <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
         <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
-        <item name="ic_wps">@drawable/ic_wps_dark</item>
         <item name="side_margin">0dip</item>
         <item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
         <item name="wifi_signal">@drawable/wifi_signal</item>
@@ -84,7 +80,6 @@
         <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
         <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
         <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
-        <item name="ic_wps">@drawable/ic_wps_light</item>
         <item name="side_margin">0dip</item>
         <item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
         <item name="wifi_signal">@drawable/wifi_signal</item>
@@ -102,7 +97,6 @@
         <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
         <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
         <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
-        <item name="ic_wps">@drawable/ic_wps_dark</item>
         <item name="side_margin">0dip</item>
         <item name="wifi_signal_color">@color/setup_wizard_wifi_color_dark</item>
         <item name="wifi_signal">@drawable/wifi_signal</item>
@@ -121,7 +115,6 @@
         <item name="*android:preferencePanelStyle">@*android:style/PreferencePanel.Dialog</item>
         <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
         <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_material</item>
-        <item name="ic_wps">@drawable/ic_wps_light</item>
         <item name="side_margin">0dip</item>
         <item name="wifi_signal_color">@color/setup_wizard_wifi_color_light</item>
         <item name="wifi_signal">@drawable/wifi_signal</item>
@@ -221,7 +214,6 @@
 
         <item name="fingerprint_layout_theme">@style/FingerprintLayoutTheme</item>
         <item name="ic_menu_moreoverflow">@*android:drawable/ic_menu_moreoverflow_holo_dark</item>
-        <item name="ic_wps">@drawable/ic_wps_light</item>
         <item name="wifi_signal">@drawable/wifi_signal</item>
         <item name="wifi_signal_color">?android:attr/colorAccent</item>
         <item name="wifi_friction">@drawable/wifi_friction</item>
diff --git a/res/xml/wifi_configure_settings.xml b/res/xml/wifi_configure_settings.xml
index 6993f26..eae6faa 100644
--- a/res/xml/wifi_configure_settings.xml
+++ b/res/xml/wifi_configure_settings.xml
@@ -64,14 +64,6 @@
             android:fragment="com.android.settings.wifi.p2p.WifiP2pSettings"/>
 
     <Preference
-            android:key="wps_push_button"
-            android:title="@string/wifi_menu_wps_pbc" />
-
-    <Preference
-            android:key="wps_pin_entry"
-            android:title="@string/wifi_menu_wps_pin" />
-
-    <Preference
             android:key="mac_address"
             android:title="@string/wifi_advanced_mac_address_title"/>
 
diff --git a/src/com/android/settings/wifi/ConfigureWifiSettings.java b/src/com/android/settings/wifi/ConfigureWifiSettings.java
index b359bf3..1607b74 100644
--- a/src/com/android/settings/wifi/ConfigureWifiSettings.java
+++ b/src/com/android/settings/wifi/ConfigureWifiSettings.java
@@ -92,8 +92,6 @@
         controllers.add(new WifiInfoPreferenceController(context, getLifecycle(), wifiManager));
         controllers.add(new CellularFallbackPreferenceController(context));
         controllers.add(new WifiP2pPreferenceController(context, getLifecycle(), wifiManager));
-        controllers.add(new WpsPreferenceController(
-                context, getLifecycle(), wifiManager, getFragmentManager()));
         return controllers;
     }
 
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 22f8c43..8e2ea63 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -85,16 +85,12 @@
 
     private static final String TAG = "WifiSettings";
 
-    /* package */ static final int MENU_ID_WPS_PBC = Menu.FIRST;
-    private static final int MENU_ID_WPS_PIN = Menu.FIRST + 1;
     private static final int MENU_ID_CONNECT = Menu.FIRST + 6;
     private static final int MENU_ID_FORGET = Menu.FIRST + 7;
     private static final int MENU_ID_MODIFY = Menu.FIRST + 8;
     private static final int MENU_ID_WRITE_NFC = Menu.FIRST + 9;
 
     public static final int WIFI_DIALOG_ID = 1;
-    /* package */ static final int WPS_PBC_DIALOG_ID = 2;
-    private static final int WPS_PIN_DIALOG_ID = 3;
     private static final int WRITE_NFC_DIALOG_ID = 6;
 
     // Instance state keys
@@ -460,24 +456,6 @@
     }
 
     @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        // If the user is not allowed to configure wifi, do not handle menu selections.
-        if (mIsRestricted) {
-            return false;
-        }
-
-        switch (item.getItemId()) {
-            case MENU_ID_WPS_PBC:
-                showDialog(WPS_PBC_DIALOG_ID);
-                return true;
-            case MENU_ID_WPS_PIN:
-                showDialog(WPS_PIN_DIALOG_ID);
-                return true;
-        }
-        return super.onOptionsItemSelected(item);
-    }
-
-    @Override
     public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
             Preference preference = (Preference) view.getTag();
 
@@ -635,10 +613,6 @@
 
                 mSelectedAccessPoint = mDlgAccessPoint;
                 return mDialog;
-            case WPS_PBC_DIALOG_ID:
-                return new WpsDialog(getActivity(), WpsInfo.PBC);
-            case WPS_PIN_DIALOG_ID:
-                return new WpsDialog(getActivity(), WpsInfo.DISPLAY);
             case WRITE_NFC_DIALOG_ID:
                 if (mSelectedAccessPoint != null) {
                     mWifiToNfcDialog = new WriteWifiConfigToNfcDialog(
@@ -660,10 +634,6 @@
         switch (dialogId) {
             case WIFI_DIALOG_ID:
                 return MetricsEvent.DIALOG_WIFI_AP_EDIT;
-            case WPS_PBC_DIALOG_ID:
-                return MetricsEvent.DIALOG_WIFI_PBC;
-            case WPS_PIN_DIALOG_ID:
-                return MetricsEvent.DIALOG_WIFI_PIN;
             case WRITE_NFC_DIALOG_ID:
                 return MetricsEvent.DIALOG_WIFI_WRITE_NFC;
             default:
diff --git a/src/com/android/settings/wifi/WpsDialog.java b/src/com/android/settings/wifi/WpsDialog.java
deleted file mode 100644
index 440b72d..0000000
--- a/src/com/android/settings/wifi/WpsDialog.java
+++ /dev/null
@@ -1,297 +0,0 @@
-/*
- * Copyright (C) 2012 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.AlertDialog;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.NetworkInfo;
-import android.net.NetworkInfo.DetailedState;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiManager;
-import android.net.wifi.WpsInfo;
-import android.os.Bundle;
-import android.os.Handler;
-import android.view.View;
-import android.widget.Button;
-import android.widget.ProgressBar;
-import android.widget.TextView;
-
-import com.android.settings.R;
-
-import java.util.Timer;
-import java.util.TimerTask;
-
-
-/**
- * Dialog to show WPS progress.
- */
-public class WpsDialog extends AlertDialog {
-
-    private final static String TAG = "WpsDialog";
-    private static final String DIALOG_STATE = "android:dialogState";
-    private static final String DIALOG_MSG_STRING = "android:dialogMsg";
-
-    private View mView;
-    private TextView mTextView;
-    private ProgressBar mTimeoutBar;
-    private ProgressBar mProgressBar;
-    private Button mButton;
-    private Timer mTimer;
-
-    private static final int WPS_TIMEOUT_S = 120;
-
-    private WifiManager mWifiManager;
-    private WifiManager.WpsCallback mWpsListener;
-    private int mWpsSetup;
-
-    private final IntentFilter mFilter;
-    private BroadcastReceiver mReceiver;
-
-    private Context mContext;
-    private Handler mHandler = new Handler();
-    private String mMsgString = "";
-
-    private enum DialogState {
-        WPS_INIT,
-        WPS_START,
-        WPS_COMPLETE,
-        CONNECTED, //WPS + IP config is done
-        WPS_FAILED
-    }
-    DialogState mDialogState = DialogState.WPS_INIT;
-
-    public WpsDialog(Context context, int wpsSetup) {
-        super(context);
-        mContext = context;
-        mWpsSetup = wpsSetup;
-
-        class WpsListener extends WifiManager.WpsCallback {
-
-            public void onStarted(String pin) {
-                if (pin != null) {
-                    updateDialog(DialogState.WPS_START, String.format(
-                            mContext.getString(R.string.wifi_wps_onstart_pin), pin));
-                } else {
-                    updateDialog(DialogState.WPS_START, mContext.getString(
-                            R.string.wifi_wps_onstart_pbc));
-                }
-            }
-
-            public void onSucceeded() {
-                updateDialog(DialogState.WPS_COMPLETE,
-                        mContext.getString(R.string.wifi_wps_complete));
-            }
-
-            public void onFailed(int reason) {
-                String msg;
-                switch (reason) {
-                    case WifiManager.WPS_OVERLAP_ERROR:
-                        msg = mContext.getString(R.string.wifi_wps_failed_overlap);
-                        break;
-                    case WifiManager.WPS_WEP_PROHIBITED:
-                        msg = mContext.getString(R.string.wifi_wps_failed_wep);
-                        break;
-                    case WifiManager.WPS_TKIP_ONLY_PROHIBITED:
-                        msg = mContext.getString(R.string.wifi_wps_failed_tkip);
-                        break;
-                    case WifiManager.IN_PROGRESS:
-                        msg = mContext.getString(R.string.wifi_wps_in_progress);
-                        break;
-                    default:
-                        msg = mContext.getString(R.string.wifi_wps_failed_generic);
-                        break;
-                }
-                updateDialog(DialogState.WPS_FAILED, msg);
-            }
-        }
-
-        mWpsListener = new WpsListener();
-
-
-        mFilter = new IntentFilter();
-        mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
-        mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
-        mReceiver = new BroadcastReceiver() {
-            @Override
-            public void onReceive(Context context, Intent intent) {
-                handleEvent(context, intent);
-            }
-        };
-        setCanceledOnTouchOutside(false);
-    }
-
-    @Override
-    public Bundle onSaveInstanceState () {
-        Bundle bundle  = super.onSaveInstanceState();
-        bundle.putString(DIALOG_STATE, mDialogState.toString());
-        bundle.putString(DIALOG_MSG_STRING, mMsgString.toString());
-        return bundle;
-    }
-
-    @Override
-    public void onRestoreInstanceState(Bundle savedInstanceState) {
-        if (savedInstanceState != null) {
-            super.onRestoreInstanceState(savedInstanceState);
-            DialogState dialogState = mDialogState.valueOf(savedInstanceState.getString(DIALOG_STATE));
-            String msg = savedInstanceState.getString(DIALOG_MSG_STRING);
-            updateDialog(dialogState, msg);
-            if (dialogState == DialogState.WPS_START) {
-                startWps();
-            }
-        }
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        mView = getLayoutInflater().inflate(R.layout.wifi_wps_dialog, null);
-
-        mTextView = (TextView) mView.findViewById(R.id.wps_dialog_txt);
-        mTextView.setText(R.string.wifi_wps_setup_msg);
-
-        mTimeoutBar = ((ProgressBar) mView.findViewById(R.id.wps_timeout_bar));
-        mTimeoutBar.setMax(WPS_TIMEOUT_S);
-        mTimeoutBar.setProgress(0);
-
-        mProgressBar = ((ProgressBar) mView.findViewById(R.id.wps_progress_bar));
-        mProgressBar.setVisibility(View.GONE);
-
-        mButton = ((Button) mView.findViewById(R.id.wps_dialog_btn));
-        mButton.setText(R.string.wifi_cancel);
-        mButton.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                dismiss();
-            }
-        });
-
-        mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
-
-        setView(mView);
-        if (savedInstanceState == null) {
-            startWps();
-        }
-        super.onCreate(savedInstanceState);
-    }
-
-    @Override
-    protected void onStart() {
-        /*
-         * increment timeout bar per second.
-         */
-        mTimer = new Timer(false);
-        mTimer.schedule(new TimerTask() {
-            @Override
-            public void run() {
-                mHandler.post(new Runnable() {
-
-                    @Override
-                    public void run() {
-                        mTimeoutBar.incrementProgressBy(1);
-                    }
-                });
-            }
-        }, 1000, 1000);
-
-        mContext.registerReceiver(mReceiver, mFilter);
-
-    }
-
-    @Override
-    protected void onStop() {
-        if (mDialogState != DialogState.WPS_COMPLETE) {
-            mWifiManager.cancelWps(null);
-        }
-
-        if (mReceiver != null) {
-            mContext.unregisterReceiver(mReceiver);
-            mReceiver = null;
-        }
-
-        if (mTimer != null) {
-            mTimer.cancel();
-        }
-    }
-
-    private void updateDialog(final DialogState state, final String msg) {
-        if (mDialogState.ordinal() >= state.ordinal()) {
-            //ignore.
-            return;
-        }
-        mDialogState = state;
-        mMsgString = msg;
-
-        mHandler.post(new Runnable() {
-                @Override
-                public void run() {
-                    switch(state) {
-                        case WPS_COMPLETE:
-                            mTimeoutBar.setVisibility(View.GONE);
-                            mProgressBar.setVisibility(View.VISIBLE);
-                            break;
-                        case CONNECTED:
-                        case WPS_FAILED:
-                            mButton.setText(mContext.getString(R.string.dlg_ok));
-                            mTimeoutBar.setVisibility(View.GONE);
-                            mProgressBar.setVisibility(View.GONE);
-                            if (mReceiver != null) {
-                                mContext.unregisterReceiver(mReceiver);
-                                mReceiver = null;
-                            }
-                            break;
-                    }
-                    mTextView.setText(msg);
-                }
-            });
-   }
-
-    private void handleEvent(Context context, Intent intent) {
-        String action = intent.getAction();
-        if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
-            final int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
-                    WifiManager.WIFI_STATE_UNKNOWN);
-            if (state == WifiManager.WIFI_STATE_DISABLED) {
-                if (mTimer != null) {
-                    mTimer.cancel();
-                    mTimer = null;
-                }
-                String msg = mContext.getString(R.string.wifi_wps_failed_wifi_disconnected);
-                updateDialog(DialogState.WPS_FAILED, msg);
-            }
-        } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
-            NetworkInfo info = (NetworkInfo) intent.getParcelableExtra(
-                    WifiManager.EXTRA_NETWORK_INFO);
-            final NetworkInfo.DetailedState state = info.getDetailedState();
-            if (state == DetailedState.CONNECTED &&
-                    mDialogState == DialogState.WPS_COMPLETE) {
-                WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
-                if (wifiInfo != null) {
-                    String msg = String.format(mContext.getString(
-                            R.string.wifi_wps_connected), wifiInfo.getSSID());
-                    updateDialog(DialogState.CONNECTED, msg);
-                }
-            }
-        }
-    }
-
-    private void startWps() {
-        WpsInfo wpsConfig = new WpsInfo();
-        wpsConfig.setup = mWpsSetup;
-        mWifiManager.startWps(wpsConfig, mWpsListener);
-    }
-}
diff --git a/src/com/android/settings/wifi/WpsPreferenceController.java b/src/com/android/settings/wifi/WpsPreferenceController.java
deleted file mode 100644
index f636593..0000000
--- a/src/com/android/settings/wifi/WpsPreferenceController.java
+++ /dev/null
@@ -1,155 +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.wifi;
-
-import android.app.Dialog;
-import android.app.FragmentManager;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.wifi.WifiManager;
-import android.net.wifi.WpsInfo;
-import android.os.Bundle;
-import android.support.annotation.VisibleForTesting;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
-
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.core.PreferenceControllerMixin;
-import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-import com.android.settingslib.core.AbstractPreferenceController;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnPause;
-import com.android.settingslib.core.lifecycle.events.OnResume;
-
-/**
- * {@link PreferenceControllerMixin} that shows Dialog for WPS progress. Disabled when Wi-Fi is off.
- */
-public class WpsPreferenceController extends AbstractPreferenceController
-        implements PreferenceControllerMixin, LifecycleObserver, OnPause, OnResume {
-
-    private static final String KEY_WPS_PUSH = "wps_push_button";
-    private static final String KEY_WPS_PIN = "wps_pin_entry";
-
-    private final WifiManager mWifiManager;
-    private final FragmentManager mFragmentManager;
-    @VisibleForTesting
-    final BroadcastReceiver mReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            togglePreferences();
-        }
-    };
-    private final IntentFilter mFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
-
-    private Preference mWpsPushPref;
-    private Preference mWpsPinPref;
-
-    public WpsPreferenceController(
-            Context context,
-            Lifecycle lifecycle,
-            WifiManager wifiManager,
-            FragmentManager fragmentManager) {
-        super(context);
-        mWifiManager = wifiManager;
-        mFragmentManager = fragmentManager;
-        lifecycle.addObserver(this);
-    }
-
-    @Override
-    public boolean isAvailable() {
-        // Always show preference.
-        return true;
-    }
-
-    @Override
-    public String getPreferenceKey() {
-        // Returns null because this controller contains more than 1 preference.
-        return null;
-    }
-
-    @Override
-    public void displayPreference(PreferenceScreen screen) {
-        super.displayPreference(screen);
-        mWpsPushPref = screen.findPreference(KEY_WPS_PUSH);
-        mWpsPinPref = screen.findPreference(KEY_WPS_PIN);
-        if (mWpsPushPref == null || mWpsPinPref == null) {
-            return;
-        }
-        // WpsDialog: Create the dialog like WifiSettings does.
-        mWpsPushPref.setOnPreferenceClickListener((arg) -> {
-                    WpsFragment wpsFragment = new WpsFragment(WpsInfo.PBC);
-                    wpsFragment.show(mFragmentManager, KEY_WPS_PUSH);
-                    return true;
-                }
-        );
-
-        // WpsDialog: Create the dialog like WifiSettings does.
-        mWpsPinPref.setOnPreferenceClickListener((arg) -> {
-            WpsFragment wpsFragment = new WpsFragment(WpsInfo.DISPLAY);
-            wpsFragment.show(mFragmentManager, KEY_WPS_PIN);
-            return true;
-        });
-        togglePreferences();
-    }
-
-    @Override
-    public void onResume() {
-        mContext.registerReceiver(mReceiver, mFilter);
-    }
-
-    @Override
-    public void onPause() {
-        mContext.unregisterReceiver(mReceiver);
-    }
-
-    private void togglePreferences() {
-        if (mWpsPushPref != null && mWpsPinPref != null) {
-            boolean enabled = mWifiManager.isWifiEnabled();
-            mWpsPushPref.setEnabled(enabled);
-            mWpsPinPref.setEnabled(enabled);
-        }
-    }
-
-    /**
-     * Fragment for Dialog to show WPS progress.
-     */
-    public static class WpsFragment extends InstrumentedDialogFragment {
-        private static int mWpsSetup;
-
-        // Public default constructor is required for rotation.
-        public WpsFragment() {
-            super();
-        }
-
-        public WpsFragment(int wpsSetup) {
-            super();
-            mWpsSetup = wpsSetup;
-        }
-
-        @Override
-        public int getMetricsCategory() {
-            return MetricsEvent.DIALOG_WPS_SETUP;
-        }
-
-        @Override
-        public Dialog onCreateDialog(Bundle savedInstanceState) {
-            return new WpsDialog(getActivity(), mWpsSetup);
-        }
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/wifi/WpsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/WpsPreferenceControllerTest.java
deleted file mode 100644
index e4dfea4..0000000
--- a/tests/robotests/src/com/android/settings/wifi/WpsPreferenceControllerTest.java
+++ /dev/null
@@ -1,140 +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.wifi;
-
-import static android.arch.lifecycle.Lifecycle.Event.ON_PAUSE;
-import static android.arch.lifecycle.Lifecycle.Event.ON_RESUME;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.FragmentManager;
-import android.arch.lifecycle.LifecycleOwner;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.wifi.WifiManager;
-import android.support.v7.preference.Preference;
-import android.support.v7.preference.PreferenceScreen;
-
-import com.android.settings.TestConfig;
-import com.android.settings.testutils.SettingsRobolectricTestRunner;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-
-@RunWith(SettingsRobolectricTestRunner.class)
-@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class WpsPreferenceControllerTest {
-
-    @Mock
-    private Context mContext;
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private WifiManager mWifiManager;
-    @Mock
-    private FragmentManager mFragmentManager;
-    @Mock
-    private PreferenceScreen mScreen;
-    @Mock
-    private Preference mWpsPushPref;
-    @Mock
-    private Preference mWpsPinPref;
-
-    private Lifecycle mLifecycle;
-    private LifecycleOwner mLifecycleOwner;
-    private WpsPreferenceController mController;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mLifecycleOwner = () -> mLifecycle;
-        mLifecycle = new Lifecycle(mLifecycleOwner);
-        when(mContext.getSystemService(WifiManager.class))
-                .thenReturn(mWifiManager);
-        when(mScreen.findPreference(anyString()))
-                .thenReturn(mWpsPushPref)
-                .thenReturn(mWpsPinPref);
-        mController = new WpsPreferenceController(
-                mContext, mLifecycle, mWifiManager, mFragmentManager);
-    }
-
-    @Test
-    public void testIsAvailable_shouldAlwaysReturnTrue() {
-        assertThat(mController.isAvailable()).isTrue();
-    }
-
-    @Test
-    public void testOnResume_shouldRegisterListener() {
-        mLifecycle.handleLifecycleEvent(ON_RESUME);
-        verify(mContext).registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class));
-    }
-    @Test
-    public void testOnPause_shouldUnregisterListener() {
-        mLifecycle.handleLifecycleEvent(ON_RESUME);
-        mLifecycle.handleLifecycleEvent(ON_PAUSE);
-        verify(mContext).unregisterReceiver(any(BroadcastReceiver.class));
-    }
-
-    @Test
-    public void testWifiStateChange_shouldToggleEnabledState() {
-        when(mWifiManager.isWifiEnabled()).thenReturn(true);
-
-        //Sets the preferences.
-        mController.displayPreference(mScreen);
-        verify(mWpsPushPref).setEnabled(true);
-        verify(mWpsPinPref).setEnabled(true);
-
-        Intent dummyIntent = new Intent();
-        mController.mReceiver.onReceive(mContext, dummyIntent);
-        verify(mWpsPushPref, times(2)).setEnabled(true);
-        verify(mWpsPinPref, times(2)).setEnabled(true);
-
-        when(mWifiManager.isWifiEnabled()).thenReturn(false);
-        mController.mReceiver.onReceive(mContext, dummyIntent);
-        verify(mWpsPushPref).setEnabled(false);
-        verify(mWpsPinPref).setEnabled(false);
-    }
-
-    @Test
-    public void testDisplayPreference_shouldSetPreferenceClickListenerAndToggleEnabledState() {
-        when(mWifiManager.isWifiEnabled()).thenReturn(true);
-        mController.displayPreference(mScreen);
-        verify(mWpsPushPref).setOnPreferenceClickListener(any());
-        verify(mWpsPinPref).setOnPreferenceClickListener(any());
-        verify(mWpsPushPref).setEnabled(true);
-        verify(mWpsPinPref).setEnabled(true);
-    }
-
-    @Test
-    public void testDisplayPreference_shouldDisablePreferenceWhenWifiDisabled() {
-        when(mWifiManager.isWifiEnabled()).thenReturn(false);
-        mController.displayPreference(mScreen);
-        verify(mWpsPushPref).setEnabled(false);
-        verify(mWpsPinPref).setEnabled(false);
-    }
-}
