diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index fa9f545..86fb1d3 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -39,7 +39,9 @@
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
 import android.util.Log;
+
 import com.android.internal.logging.MetricsProto.MetricsEvent;
+import com.android.settings.datausage.DataSaverBackend;
 import com.android.settings.wifi.WifiApDialog;
 import com.android.settings.wifi.WifiApEnabler;
 import com.android.settingslib.TetherUtil;
@@ -56,12 +58,14 @@
  * Displays preferences for Tethering.
  */
 public class TetherSettings extends RestrictedSettingsFragment
-        implements DialogInterface.OnClickListener, Preference.OnPreferenceChangeListener {
+        implements DialogInterface.OnClickListener, Preference.OnPreferenceChangeListener,
+        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 TETHER_CHOICE = "TETHER_TYPE";
+    private static final String DATA_SAVER_FOOTER = "disabled_on_data_saver";
 
     private static final int DIALOG_AP_SETTINGS = 1;
 
@@ -110,6 +114,10 @@
 
     private boolean mUnavailable;
 
+    private DataSaverBackend mDataSaverBackend;
+    private boolean mDataSaverEnabled;
+    private Preference mDataSaverFooter;
+
     @Override
     protected int getMetricsCategory() {
         return MetricsEvent.TETHER;
@@ -125,6 +133,10 @@
 
         addPreferencesFromResource(R.xml.tether_prefs);
 
+        mDataSaverBackend = new DataSaverBackend(getContext());
+        mDataSaverEnabled = mDataSaverBackend.isDataSaverEnabled();
+        mDataSaverFooter = findPreference(DATA_SAVER_FOOTER);
+
         setIfOnlyAvailableForAdmins(true);
         if (isUiRestricted()) {
             mUnavailable = true;
@@ -145,6 +157,8 @@
         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);
 
@@ -161,7 +175,7 @@
         }
 
         if (wifiAvailable && !Utils.isMonkeyRunning()) {
-            mWifiApEnabler = new WifiApEnabler(activity, mEnableWifiAp);
+            mWifiApEnabler = new WifiApEnabler(activity, mDataSaverBackend, mEnableWifiAp);
             initWifiTethering();
         } else {
             getPreferenceScreen().removePreference(mEnableWifiAp);
@@ -178,6 +192,31 @@
                 mBluetoothTether.setChecked(false);
             }
         }
+        // Set initial state based on Data Saver mode.
+        onDataSaverChanged(mDataSaverBackend.isDataSaverEnabled());
+    }
+
+    @Override
+    public void onDestroy() {
+        mDataSaverBackend.remListener(this);
+        super.onDestroy();
+    }
+
+    @Override
+    public void onDataSaverChanged(boolean isDataSaving) {
+        mDataSaverEnabled = isDataSaving;
+        mEnableWifiAp.setEnabled(!mDataSaverEnabled);
+        mUsbTether.setEnabled(!mDataSaverEnabled);
+        mBluetoothTether.setEnabled(!mDataSaverEnabled);
+        mDataSaverFooter.setVisible(mDataSaverEnabled);
+    }
+
+    @Override
+    public void onWhitelistStatusChanged(int uid, boolean isWhitelisted) {
+    }
+
+    @Override
+    public void onBlacklistStatusChanged(int uid, boolean isBlacklisted)  {
     }
 
     private void initWifiTethering() {
@@ -368,7 +407,7 @@
 
         if (usbTethered) {
             mUsbTether.setSummary(R.string.usb_tethering_active_subtext);
-            mUsbTether.setEnabled(true);
+            mUsbTether.setEnabled(!mDataSaverEnabled);
             mUsbTether.setChecked(true);
         } else if (usbAvailable) {
             if (usbError == ConnectivityManager.TETHER_ERROR_NO_ERROR) {
@@ -376,7 +415,7 @@
             } else {
                 mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);
             }
-            mUsbTether.setEnabled(true);
+            mUsbTether.setEnabled(!mDataSaverEnabled);
             mUsbTether.setChecked(false);
         } else if (usbErrored) {
             mUsbTether.setSummary(R.string.usb_tethering_errored_subtext);
@@ -418,7 +457,7 @@
             if (btState == BluetoothAdapter.STATE_ON && bluetoothPan != null
                     && bluetoothPan.isTetheringOn()) {
                 mBluetoothTether.setChecked(true);
-                mBluetoothTether.setEnabled(true);
+                mBluetoothTether.setEnabled(!mDataSaverEnabled);
                 int bluetoothTethered = bluetoothPan.getConnectedDevices().size();
                 if (bluetoothTethered > 1) {
                     String summary = getString(
@@ -434,7 +473,7 @@
                     mBluetoothTether.setSummary(R.string.bluetooth_tethering_available_subtext);
                 }
             } else {
-                mBluetoothTether.setEnabled(true);
+                mBluetoothTether.setEnabled(!mDataSaverEnabled);
                 mBluetoothTether.setChecked(false);
                 mBluetoothTether.setSummary(R.string.bluetooth_tethering_off_subtext);
             }
diff --git a/src/com/android/settings/wifi/WifiApEnabler.java b/src/com/android/settings/wifi/WifiApEnabler.java
index cb94732..8cfd049 100644
--- a/src/com/android/settings/wifi/WifiApEnabler.java
+++ b/src/com/android/settings/wifi/WifiApEnabler.java
@@ -27,6 +27,7 @@
 import android.support.v14.preference.SwitchPreference;
 
 import com.android.settings.R;
+import com.android.settings.datausage.DataSaverBackend;
 import com.android.settingslib.TetherUtil;
 
 import java.util.ArrayList;
@@ -35,6 +36,7 @@
     private final Context mContext;
     private final SwitchPreference mSwitch;
     private final CharSequence mOriginalSummary;
+    private final DataSaverBackend mDataSaverBackend;
 
     private WifiManager mWifiManager;
     private final IntentFilter mIntentFilter;
@@ -70,14 +72,16 @@
         }
     };
 
-    public WifiApEnabler(Context context, SwitchPreference switchPreference) {
+    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);
+        mCm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
 
         mWifiRegexs = mCm.getTetherableWifiRegexs();
 
@@ -99,7 +103,7 @@
         boolean isAirplaneMode = Settings.Global.getInt(mContext.getContentResolver(),
                 Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
         if(!isAirplaneMode) {
-            mSwitch.setEnabled(true);
+            mSwitch.setEnabled(!mDataSaverBackend.isDataSaverEnabled());
         } else {
             mSwitch.setSummary(mOriginalSummary);
             mSwitch.setEnabled(false);
@@ -162,7 +166,7 @@
                  */
                 mSwitch.setChecked(true);
                 /* Doesnt need the airplane check */
-                mSwitch.setEnabled(true);
+                mSwitch.setEnabled(!mDataSaverBackend.isDataSaverEnabled());
                 break;
             case WifiManager.WIFI_AP_STATE_DISABLING:
                 mSwitch.setSummary(R.string.wifi_tether_stopping);
