diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index 664916a..94c3fb5 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -16,95 +16,64 @@
 
 package com.android.settings;
 
+import static android.net.ConnectivityManager.TETHERING_BLUETOOTH;
+import static android.net.ConnectivityManager.TETHERING_USB;
+
 import android.app.Activity;
-import android.app.Dialog;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothPan;
 import android.bluetooth.BluetoothProfile;
 import android.content.BroadcastReceiver;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
 import android.hardware.usb.UsbManager;
 import android.net.ConnectivityManager;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiManager;
 import android.os.Bundle;
 import android.os.Environment;
 import android.os.Handler;
 import android.os.UserManager;
 import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.Preference;
-import android.util.Log;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.datausage.DataSaverBackend;
-import com.android.settings.wifi.WifiApDialog;
-import com.android.settings.wifi.WifiApEnabler;
 import com.android.settings.wifi.tether.WifiTetherPreferenceController;
-import com.android.settings.wifi.tether.WifiTetherSettings;
 import com.android.settingslib.TetherUtil;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.concurrent.atomic.AtomicReference;
 
-import static android.net.ConnectivityManager.TETHERING_BLUETOOTH;
-import static android.net.ConnectivityManager.TETHERING_USB;
-import static android.net.ConnectivityManager.TETHERING_WIFI;
-
 /*
  * Displays preferences for Tethering.
  */
 public class TetherSettings extends RestrictedSettingsFragment
-        implements DialogInterface.OnClickListener, Preference.OnPreferenceChangeListener,
-        DataSaverBackend.Listener {
+        implements DataSaverBackend.Listener {
 
     private static final String USB_TETHER_SETTINGS = "usb_tether_settings";
-    private static final String ENABLE_WIFI_AP = "enable_wifi_ap";
     private static final String ENABLE_BLUETOOTH_TETHERING = "enable_bluetooth_tethering";
     private static final String DATA_SAVER_FOOTER = "disabled_on_data_saver";
 
-    private static final int DIALOG_AP_SETTINGS = 1;
-
     private static final String TAG = "TetheringSettings";
 
     private SwitchPreference mUsbTether;
 
-    private WifiApEnabler mWifiApEnabler;
-    private SwitchPreference mEnableWifiAp;
-
     private SwitchPreference mBluetoothTether;
 
     private BroadcastReceiver mTetherChangeReceiver;
 
     private String[] mUsbRegexs;
-
-    private String[] mWifiRegexs;
-
     private String[] mBluetoothRegexs;
-    private AtomicReference<BluetoothPan> mBluetoothPan = new AtomicReference<BluetoothPan>();
+    private AtomicReference<BluetoothPan> mBluetoothPan = new AtomicReference<>();
 
     private Handler mHandler = new Handler();
     private OnStartTetheringCallback mStartTetheringCallback;
-
-    private static final String WIFI_AP_SSID_AND_SECURITY = "wifi_ap_ssid_and_security";
-    private static final int CONFIG_SUBTEXT = R.string.wifi_tether_configure_subtext;
-
-    private String[] mSecurityType;
-    private Preference mCreateNetwork;
-
-    private WifiApDialog mDialog;
-    private WifiManager mWifiManager;
-    private WifiConfiguration mWifiConfig = null;
     private ConnectivityManager mCm;
 
     private WifiTetherPreferenceController mWifiTetherPreferenceController;
 
-    private boolean mRestartWifiApAfterConfigChange;
-
     private boolean mUsbConnected;
     private boolean mMassStorageActive;
 
@@ -157,24 +126,17 @@
                     BluetoothProfile.PAN);
         }
 
-        mEnableWifiAp =
-                (SwitchPreference) findPreference(ENABLE_WIFI_AP);
-
-        Preference wifiApSettings = findPreference(WIFI_AP_SSID_AND_SECURITY);
         mUsbTether = (SwitchPreference) findPreference(USB_TETHER_SETTINGS);
         mBluetoothTether = (SwitchPreference) findPreference(ENABLE_BLUETOOTH_TETHERING);
 
         mDataSaverBackend.addListener(this);
 
         mCm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
-        mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
 
         mUsbRegexs = mCm.getTetherableUsbRegexs();
-        mWifiRegexs = mCm.getTetherableWifiRegexs();
         mBluetoothRegexs = mCm.getTetherableBluetoothRegexs();
 
         final boolean usbAvailable = mUsbRegexs.length != 0;
-        final boolean wifiAvailable = mWifiRegexs.length != 0;
         final boolean bluetoothAvailable = mBluetoothRegexs.length != 0;
 
         if (!usbAvailable || Utils.isMonkeyRunning()) {
@@ -182,18 +144,6 @@
         }
 
         mWifiTetherPreferenceController.displayPreference(getPreferenceScreen());
-        if (WifiTetherSettings.isTetherSettingPageEnabled()) {
-            removePreference(ENABLE_WIFI_AP);
-            removePreference(WIFI_AP_SSID_AND_SECURITY);
-        } else {
-            if (wifiAvailable && !Utils.isMonkeyRunning()) {
-                mWifiApEnabler = new WifiApEnabler(activity, mDataSaverBackend, mEnableWifiAp);
-                initWifiTethering();
-            } else {
-                getPreferenceScreen().removePreference(mEnableWifiAp);
-                getPreferenceScreen().removePreference(wifiApSettings);
-            }
-        }
 
         if (!bluetoothAvailable) {
             getPreferenceScreen().removePreference(mBluetoothTether);
@@ -225,7 +175,6 @@
     @Override
     public void onDataSaverChanged(boolean isDataSaving) {
         mDataSaverEnabled = isDataSaving;
-        mEnableWifiAp.setEnabled(!mDataSaverEnabled);
         mUsbTether.setEnabled(!mDataSaverEnabled);
         mBluetoothTether.setEnabled(!mDataSaverEnabled);
         mDataSaverFooter.setVisible(mDataSaverEnabled);
@@ -239,47 +188,6 @@
     public void onBlacklistStatusChanged(int uid, boolean isBlacklisted)  {
     }
 
-    private void initWifiTethering() {
-        final Activity activity = getActivity();
-        mWifiConfig = mWifiManager.getWifiApConfiguration();
-        mSecurityType = getResources().getStringArray(R.array.wifi_ap_security);
-
-        mCreateNetwork = findPreference(WIFI_AP_SSID_AND_SECURITY);
-
-        mRestartWifiApAfterConfigChange = false;
-
-        if (mWifiConfig == null) {
-            final String s = activity.getString(
-                    com.android.internal.R.string.wifi_tether_configure_ssid_default);
-            mCreateNetwork.setSummary(String.format(activity.getString(CONFIG_SUBTEXT),
-                    s, mSecurityType[WifiApDialog.OPEN_INDEX]));
-        } else {
-            int index = WifiApDialog.getSecurityTypeIndex(mWifiConfig);
-            mCreateNetwork.setSummary(String.format(activity.getString(CONFIG_SUBTEXT),
-                    mWifiConfig.SSID,
-                    mSecurityType[index]));
-        }
-    }
-
-    @Override
-    public Dialog onCreateDialog(int id) {
-        if (id == DIALOG_AP_SETTINGS) {
-            final Activity activity = getActivity();
-            mDialog = new WifiApDialog(activity, this, mWifiConfig);
-            return mDialog;
-        }
-
-        return null;
-    }
-
-    @Override
-    public int getDialogMetricsCategory(int dialogId) {
-        if (dialogId == DIALOG_AP_SETTINGS) {
-            return MetricsEvent.DIALOG_AP_SETTINGS;
-        }
-        return 0;
-    }
-
     private class TetherChangeReceiver extends BroadcastReceiver {
         @Override
         public void onReceive(Context content, Intent intent) {
@@ -295,20 +203,6 @@
                 updateState(available.toArray(new String[available.size()]),
                         active.toArray(new String[active.size()]),
                         errored.toArray(new String[errored.size()]));
-                if (mWifiManager.getWifiApState() == WifiManager.WIFI_AP_STATE_DISABLED
-                        && mRestartWifiApAfterConfigChange) {
-                    mRestartWifiApAfterConfigChange = false;
-                    Log.d(TAG, "Restarting WifiAp due to prior config change.");
-                    startTethering(TETHERING_WIFI);
-                }
-            } else if (action.equals(WifiManager.WIFI_AP_STATE_CHANGED_ACTION)) {
-                int state = intent.getIntExtra(WifiManager.EXTRA_WIFI_AP_STATE, 0);
-                if (state == WifiManager.WIFI_AP_STATE_DISABLED
-                        && mRestartWifiApAfterConfigChange) {
-                    mRestartWifiApAfterConfigChange = false;
-                    Log.d(TAG, "Restarting WifiAp due to prior config change.");
-                    startTethering(TETHERING_WIFI);
-                }
             } else if (action.equals(Intent.ACTION_MEDIA_SHARED)) {
                 mMassStorageActive = true;
                 updateState();
@@ -360,7 +254,6 @@
         mMassStorageActive = Environment.MEDIA_SHARED.equals(Environment.getExternalStorageState());
         mTetherChangeReceiver = new TetherChangeReceiver();
         IntentFilter filter = new IntentFilter(ConnectivityManager.ACTION_TETHER_STATE_CHANGED);
-        filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
         Intent intent = activity.registerReceiver(mTetherChangeReceiver, filter);
 
         filter = new IntentFilter();
@@ -378,10 +271,6 @@
         activity.registerReceiver(mTetherChangeReceiver, filter);
 
         if (intent != null) mTetherChangeReceiver.onReceive(activity, intent);
-        if (mWifiApEnabler != null) {
-            mEnableWifiAp.setOnPreferenceChangeListener(this);
-            mWifiApEnabler.resume();
-        }
 
         updateState();
     }
@@ -396,10 +285,6 @@
         getActivity().unregisterReceiver(mTetherChangeReceiver);
         mTetherChangeReceiver = null;
         mStartTetheringCallback = null;
-        if (mWifiApEnabler != null) {
-            mEnableWifiAp.setOnPreferenceChangeListener(null);
-            mWifiApEnabler.pause();
-        }
     }
 
     private void updateState() {
@@ -415,7 +300,6 @@
         updateBluetoothState();
     }
 
-
     private void updateUsbState(String[] available, String[] tethered,
             String[] errored) {
         boolean usbAvailable = mUsbConnected && !mMassStorageActive;
@@ -477,18 +361,6 @@
         }
     }
 
-    @Override
-    public boolean onPreferenceChange(Preference preference, Object value) {
-        boolean enable = (Boolean) value;
-
-        if (enable) {
-            startTethering(TETHERING_WIFI);
-        } else {
-            mCm.stopTethering(TETHERING_WIFI);
-        }
-        return false;
-    }
-
     public static boolean isProvisioningNeededButUnavailable(Context context) {
         return (TetherUtil.isProvisioningNeeded(context)
                 && !isIntentAvailable(context));
@@ -541,37 +413,11 @@
                 // connected. Need to update state manually.
                 updateState();
             }
-        } else if (preference == mCreateNetwork) {
-            showDialog(DIALOG_AP_SETTINGS);
         }
 
         return super.onPreferenceTreeClick(preference);
     }
 
-    public void onClick(DialogInterface dialogInterface, int button) {
-        if (button == DialogInterface.BUTTON_POSITIVE) {
-            mWifiConfig = mDialog.getConfig();
-            if (mWifiConfig != null) {
-                /**
-                 * if soft AP is stopped, bring up
-                 * else restart with new config
-                 * TODO: update config on a running access point when framework support is added
-                 */
-                if (mWifiManager.getWifiApState() == WifiManager.WIFI_AP_STATE_ENABLED) {
-                    Log.d("TetheringSettings",
-                            "Wifi AP config changed while enabled, stop and restart");
-                    mRestartWifiApAfterConfigChange = true;
-                    mCm.stopTethering(TETHERING_WIFI);
-                }
-                mWifiManager.setWifiApConfiguration(mWifiConfig);
-                int index = WifiApDialog.getSecurityTypeIndex(mWifiConfig);
-                mCreateNetwork.setSummary(String.format(getActivity().getString(CONFIG_SUBTEXT),
-                        mWifiConfig.SSID,
-                        mSecurityType[index]));
-            }
-        }
-    }
-
     @Override
     public int getHelpResource() {
         return R.string.help_url_tether;
@@ -592,7 +438,7 @@
         final WeakReference<TetherSettings> mTetherSettings;
 
         OnStartTetheringCallback(TetherSettings settings) {
-            mTetherSettings = new WeakReference<TetherSettings>(settings);
+            mTetherSettings = new WeakReference<>(settings);
         }
 
         @Override
diff --git a/src/com/android/settings/wifi/WifiApDialog.java b/src/com/android/settings/wifi/WifiApDialog.java
deleted file mode 100644
index 1316a49..0000000
--- a/src/com/android/settings/wifi/WifiApDialog.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright (C) 2010 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.Context;
-import android.content.DialogInterface;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiConfiguration.AuthAlgorithm;
-import android.net.wifi.WifiConfiguration.KeyMgmt;
-import android.net.wifi.WifiManager;
-import android.os.Bundle;
-import android.text.Editable;
-import android.text.InputType;
-import android.text.TextWatcher;
-import android.util.Log;
-import android.view.View;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.CheckBox;
-import android.widget.EditText;
-import android.widget.Spinner;
-import android.widget.TextView;
-
-import com.android.settings.R;
-
-import java.nio.charset.Charset;
-
-/**
- * Dialog to configure the SSID and security settings
- * for Access Point operation
- */
-public class WifiApDialog extends AlertDialog implements View.OnClickListener,
-        TextWatcher, AdapterView.OnItemSelectedListener {
-
-    static final int BUTTON_SUBMIT = DialogInterface.BUTTON_POSITIVE;
-
-    private final DialogInterface.OnClickListener mListener;
-
-    public static final int OPEN_INDEX = 0;
-    public static final int WPA2_INDEX = 1;
-
-    private View mView;
-    private TextView mSsid;
-    private int mSecurityTypeIndex = OPEN_INDEX;
-    private EditText mPassword;
-    private int mBandIndex = OPEN_INDEX;
-
-    WifiConfiguration mWifiConfig;
-    WifiManager mWifiManager;
-    private Context mContext;
-
-    private static final String TAG = "WifiApDialog";
-
-    public WifiApDialog(Context context, DialogInterface.OnClickListener listener,
-            WifiConfiguration wifiConfig) {
-        super(context);
-        mListener = listener;
-        mWifiConfig = wifiConfig;
-        if (wifiConfig != null) {
-            mSecurityTypeIndex = getSecurityTypeIndex(wifiConfig);
-        }
-        mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
-        mContext =  context;
-    }
-
-    public static int getSecurityTypeIndex(WifiConfiguration wifiConfig) {
-        if (wifiConfig.allowedKeyManagement.get(KeyMgmt.WPA2_PSK)) {
-            return WPA2_INDEX;
-        }
-        return OPEN_INDEX;
-    }
-
-    public WifiConfiguration getConfig() {
-
-        WifiConfiguration config = new WifiConfiguration();
-
-        /**
-         * TODO: SSID in WifiConfiguration for soft ap
-         * is being stored as a raw string without quotes.
-         * This is not the case on the client side. We need to
-         * make things consistent and clean it up
-         */
-        config.SSID = mSsid.getText().toString();
-
-        config.apBand = mBandIndex;
-
-        switch (mSecurityTypeIndex) {
-            case OPEN_INDEX:
-                config.allowedKeyManagement.set(KeyMgmt.NONE);
-                return config;
-
-            case WPA2_INDEX:
-                config.allowedKeyManagement.set(KeyMgmt.WPA2_PSK);
-                config.allowedAuthAlgorithms.set(AuthAlgorithm.OPEN);
-                if (mPassword.length() != 0) {
-                    String password = mPassword.getText().toString();
-                    config.preSharedKey = password;
-                }
-                return config;
-        }
-        return null;
-    }
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        boolean mInit = true;
-        mView = getLayoutInflater().inflate(R.layout.wifi_ap_dialog, null);
-        Spinner mSecurity = ((Spinner) mView.findViewById(R.id.security));
-        final Spinner mChannel = (Spinner) mView.findViewById(R.id.choose_channel);
-
-        setView(mView);
-        setInverseBackgroundForced(true);
-
-        Context context = getContext();
-
-        setTitle(R.string.wifi_tether_configure_ap_text);
-        mView.findViewById(R.id.type).setVisibility(View.VISIBLE);
-        mSsid = (TextView) mView.findViewById(R.id.ssid);
-        mPassword = (EditText) mView.findViewById(R.id.password);
-
-        ArrayAdapter <CharSequence> channelAdapter;
-        String countryCode = mWifiManager.getCountryCode();
-        if (!mWifiManager.isDualBandSupported() || countryCode == null) {
-            //If no country code, 5GHz AP is forbidden
-            Log.i(TAG,(!mWifiManager.isDualBandSupported() ? "Device do not support 5GHz " :"") 
-                    + (countryCode == null ? " NO country code" :"") +  " forbid 5GHz");
-            channelAdapter = ArrayAdapter.createFromResource(mContext,
-                    R.array.wifi_ap_band_config_2G_only, android.R.layout.simple_spinner_item);
-            mWifiConfig.apBand = 0;
-        } else {
-            channelAdapter = ArrayAdapter.createFromResource(mContext,
-                    R.array.wifi_ap_band_config_full, android.R.layout.simple_spinner_item);
-        }
-
-        channelAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
-
-        setButton(BUTTON_SUBMIT, context.getString(R.string.wifi_save), mListener);
-        setButton(DialogInterface.BUTTON_NEGATIVE,
-        context.getString(R.string.wifi_cancel), mListener);
-
-        if (mWifiConfig != null) {
-            mSsid.setText(mWifiConfig.SSID);
-            if (mWifiConfig.apBand == 0) {
-               mBandIndex = 0;
-            } else {
-               mBandIndex = 1;
-            }
-
-            mSecurity.setSelection(mSecurityTypeIndex);
-            if (mSecurityTypeIndex == WPA2_INDEX) {
-                mPassword.setText(mWifiConfig.preSharedKey);
-            }
-        }
-
-        mChannel.setAdapter(channelAdapter);
-        mChannel.setOnItemSelectedListener(
-                new AdapterView.OnItemSelectedListener() {
-                    boolean mInit = true;
-                    @Override
-                    public void onItemSelected(AdapterView<?> adapterView, View view, int position,
-                                               long id) {
-                        if (!mInit) {
-                            mBandIndex = position;
-                            mWifiConfig.apBand = mBandIndex;
-                            Log.i(TAG, "config on channelIndex : " + mBandIndex + " Band: " +
-                                    mWifiConfig.apBand);
-                        } else {
-                            mInit = false;
-                            mChannel.setSelection(mBandIndex);
-                        }
-
-                    }
-
-                    @Override
-                    public void onNothingSelected(AdapterView<?> adapterView) {
-
-                    }
-                }
-        );
-
-        mSsid.addTextChangedListener(this);
-        mPassword.addTextChangedListener(this);
-        ((CheckBox) mView.findViewById(R.id.show_password)).setOnClickListener(this);
-        mSecurity.setOnItemSelectedListener(this);
-
-        super.onCreate(savedInstanceState);
-
-        showSecurityFields();
-        validate();
-    }
-
-    public void onRestoreInstanceState(Bundle savedInstanceState) {
-        super.onRestoreInstanceState(savedInstanceState);
-        mPassword.setInputType(
-                InputType.TYPE_CLASS_TEXT |
-                (((CheckBox) mView.findViewById(R.id.show_password)).isChecked() ?
-                InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD :
-                InputType.TYPE_TEXT_VARIATION_PASSWORD));
-    }
-
-    private void validate() {
-        String mSsidString = mSsid.getText().toString();
-        if ((mSsid != null && mSsid.length() == 0)
-                || ((mSecurityTypeIndex == WPA2_INDEX) && mPassword.length() < 8)
-                || (mSsid != null &&
-                Charset.forName("UTF-8").encode(mSsidString).limit() > 32)) {
-            getButton(BUTTON_SUBMIT).setEnabled(false);
-        } else {
-            getButton(BUTTON_SUBMIT).setEnabled(true);
-        }
-    }
-
-    public void onClick(View view) {
-        mPassword.setInputType(
-                InputType.TYPE_CLASS_TEXT | (((CheckBox) view).isChecked() ?
-                InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD :
-                InputType.TYPE_TEXT_VARIATION_PASSWORD));
-    }
-
-    public void onTextChanged(CharSequence s, int start, int before, int count) {
-    }
-
-    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
-    }
-
-    public void afterTextChanged(Editable editable) {
-        validate();
-    }
-
-    @Override
-    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-        mSecurityTypeIndex = position;
-        showSecurityFields();
-        validate();
-    }
-
-    @Override
-    public void onNothingSelected(AdapterView<?> parent) {
-    }
-
-    private void showSecurityFields() {
-        if (mSecurityTypeIndex == OPEN_INDEX) {
-            mView.findViewById(R.id.fields).setVisibility(View.GONE);
-            return;
-        }
-        mView.findViewById(R.id.fields).setVisibility(View.VISIBLE);
-    }
-}
diff --git a/src/com/android/settings/wifi/WifiApEnabler.java b/src/com/android/settings/wifi/WifiApEnabler.java
deleted file mode 100644
index 675bf28..0000000
--- a/src/com/android/settings/wifi/WifiApEnabler.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Copyright (C) 2010 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.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.ConnectivityManager;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiManager;
-import android.provider.Settings;
-import android.support.v14.preference.SwitchPreference;
-import android.text.BidiFormatter;
-
-import com.android.settings.R;
-import com.android.settings.datausage.DataSaverBackend;
-
-import java.util.ArrayList;
-
-/**
- * @deprecated in favor of WifiTetherPreferenceController and WifiTetherSettings
- */
-@Deprecated
-public class WifiApEnabler {
-    private final Context mContext;
-    private final SwitchPreference mSwitch;
-    private final CharSequence mOriginalSummary;
-    private final DataSaverBackend mDataSaverBackend;
-
-    private WifiManager mWifiManager;
-    private final IntentFilter mIntentFilter;
-
-    ConnectivityManager mCm;
-    private String[] mWifiRegexs;
-
-    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (WifiManager.WIFI_AP_STATE_CHANGED_ACTION.equals(action)) {
-                int state = intent.getIntExtra(
-                        WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_FAILED);
-                if (state == WifiManager.WIFI_AP_STATE_FAILED) {
-                    int reason = intent.getIntExtra(WifiManager.EXTRA_WIFI_AP_FAILURE_REASON,
-                            WifiManager.SAP_START_FAILURE_GENERAL);
-                    handleWifiApStateChanged(state, reason);
-                } else {
-                    handleWifiApStateChanged(state, WifiManager.SAP_START_FAILURE_GENERAL);
-                }
-            } else if (ConnectivityManager.ACTION_TETHER_STATE_CHANGED.equals(action)) {
-                ArrayList<String> available = intent.getStringArrayListExtra(
-                        ConnectivityManager.EXTRA_AVAILABLE_TETHER);
-                ArrayList<String> active = intent.getStringArrayListExtra(
-                        ConnectivityManager.EXTRA_ACTIVE_TETHER);
-                ArrayList<String> errored = intent.getStringArrayListExtra(
-                        ConnectivityManager.EXTRA_ERRORED_TETHER);
-                updateTetherState(available.toArray(), active.toArray(), errored.toArray());
-            } else if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(action)) {
-                enableWifiSwitch();
-            }
-        }
-    };
-
-    public WifiApEnabler(Context context, DataSaverBackend dataSaverBackend,
-            SwitchPreference switchPreference) {
-        mContext = context;
-        mDataSaverBackend = dataSaverBackend;
-        mSwitch = switchPreference;
-        mOriginalSummary = switchPreference.getSummary();
-        switchPreference.setPersistent(false);
-
-        mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
-        mCm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
-
-        mWifiRegexs = mCm.getTetherableWifiRegexs();
-
-        mIntentFilter = new IntentFilter(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
-        mIntentFilter.addAction(ConnectivityManager.ACTION_TETHER_STATE_CHANGED);
-        mIntentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
-    }
-
-    public void resume() {
-        mContext.registerReceiver(mReceiver, mIntentFilter);
-        enableWifiSwitch();
-    }
-
-    public void pause() {
-        mContext.unregisterReceiver(mReceiver);
-    }
-
-    private void enableWifiSwitch() {
-        boolean isAirplaneMode = Settings.Global.getInt(mContext.getContentResolver(),
-                Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
-        if(!isAirplaneMode) {
-            mSwitch.setEnabled(!mDataSaverBackend.isDataSaverEnabled());
-        } else {
-            mSwitch.setSummary(mOriginalSummary);
-            mSwitch.setEnabled(false);
-        }
-    }
-
-    private void updateConfigSummary(WifiConfiguration wifiConfig) {
-        String s = mContext.getString(
-                com.android.internal.R.string.wifi_tether_configure_ssid_default);
-
-        mSwitch.setSummary(mContext.getString(R.string.wifi_tether_enabled_subtext,
-                BidiFormatter.getInstance().unicodeWrap(
-                        (wifiConfig == null) ? s : wifiConfig.SSID)));
-    }
-
-    private void updateTetherState(Object[] available, Object[] tethered, Object[] errored) {
-        boolean wifiTethered = false;
-        boolean wifiErrored = false;
-
-        for (Object o : tethered) {
-            String s = (String)o;
-            for (String regex : mWifiRegexs) {
-                if (s.matches(regex)) wifiTethered = true;
-            }
-        }
-        for (Object o: errored) {
-            String s = (String)o;
-            for (String regex : mWifiRegexs) {
-                if (s.matches(regex)) wifiErrored = true;
-            }
-        }
-
-        if (wifiTethered) {
-            WifiConfiguration wifiConfig = mWifiManager.getWifiApConfiguration();
-            updateConfigSummary(wifiConfig);
-        } else if (wifiErrored) {
-            mSwitch.setSummary(R.string.wifi_error);
-        } else {
-            mSwitch.setSummary(R.string.wifi_hotspot_off_subtext);
-        }
-    }
-
-    private void handleWifiApStateChanged(int state, int reason) {
-        switch (state) {
-            case WifiManager.WIFI_AP_STATE_ENABLING:
-                mSwitch.setSummary(R.string.wifi_tether_starting);
-                mSwitch.setEnabled(false);
-                break;
-            case WifiManager.WIFI_AP_STATE_ENABLED:
-                /**
-                 * Summary on enable is handled by tether
-                 * broadcast notice
-                 */
-                mSwitch.setChecked(true);
-                /* Doesnt need the airplane check */
-                mSwitch.setEnabled(!mDataSaverBackend.isDataSaverEnabled());
-                break;
-            case WifiManager.WIFI_AP_STATE_DISABLING:
-                mSwitch.setSummary(R.string.wifi_tether_stopping);
-                mSwitch.setChecked(false);
-                mSwitch.setEnabled(false);
-                break;
-            case WifiManager.WIFI_AP_STATE_DISABLED:
-                mSwitch.setChecked(false);
-                mSwitch.setSummary(mOriginalSummary);
-                enableWifiSwitch();
-                break;
-            default:
-                mSwitch.setChecked(false);
-                if (reason == WifiManager.SAP_START_FAILURE_NO_CHANNEL) {
-                    mSwitch.setSummary(R.string.wifi_sap_no_channel_error);
-                } else {
-                    mSwitch.setSummary(R.string.wifi_error);
-                }
-                enableWifiSwitch();
-        }
-    }
-}
diff --git a/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java b/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java
index 4fe01d3..0172b9d 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherPreferenceController.java
@@ -73,7 +73,6 @@
     public boolean isAvailable() {
         return mWifiRegexs != null
                 && mWifiRegexs.length != 0
-                && WifiTetherSettings.isTetherSettingPageEnabled()
                 && !Utils.isMonkeyRunning();
     }
 
diff --git a/src/com/android/settings/wifi/tether/WifiTetherSettings.java b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
index 73fb309..934161e 100644
--- a/src/com/android/settings/wifi/tether/WifiTetherSettings.java
+++ b/src/com/android/settings/wifi/tether/WifiTetherSettings.java
@@ -26,7 +26,6 @@
 import android.net.wifi.WifiConfiguration;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
-import android.os.SystemProperties;
 import android.os.UserManager;
 import android.support.annotation.VisibleForTesting;
 import android.util.Log;
@@ -44,10 +43,6 @@
 public class WifiTetherSettings extends RestrictedDashboardFragment
         implements WifiTetherBasePreferenceController.OnTetherConfigUpdateListener {
 
-    public static boolean isTetherSettingPageEnabled() {
-        return SystemProperties.getBoolean("settings.ui.wifi.tether.enabled", true);
-    }
-
     private static final IntentFilter TETHER_STATE_CHANGE_FILTER;
 
     private WifiTetherSwitchBarController mSwitchBarController;
