diff --git a/res/drawable/ic_battery_saver_accent_24dp.xml b/res/drawable/ic_battery_saver_accent_24dp.xml
deleted file mode 100644
index c8def54..0000000
--- a/res/drawable/ic_battery_saver_accent_24dp.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<!--
-  Copyright (C) 2018 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.
-  -->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0"
-        android:tint="?android:attr/colorAccent">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M15,14l-2,0l0,2l-2,0l0,-2l-2,0l0,-2l2,0l0,-2l2,0l0,2l2,0z"/>
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M16.2,22.5H7.8c-1.3,0 -2.3,-1 -2.3,-2.3V5.8c0,-1.3 1,-2.3 2.3,-2.3h0.7v-2h7v2h0.7c1.3,0 2.3,1.1 2.3,2.3v14.3C18.5,21.5 17.5,22.5 16.2,22.5zM7.8,5.5c-0.2,0 -0.3,0.2 -0.3,0.3v14.3c0,0.2 0.2,0.3 0.3,0.3h8.3c0.2,0 0.3,-0.1 0.3,-0.3V5.8c0,-0.2 -0.1,-0.3 -0.3,-0.3h-2.7v-2h-3v2H7.8z"/>
-</vector>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index d042ebc..545b6f9 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -9019,12 +9019,6 @@
     <!-- Summary of condition that do not disturb is on [CHAR LIMIT=36] -->
     <string name="condition_zen_summary">Impacts what you hear and see</string>
 
-    <!-- Title of condition that battery saver is on [CHAR LIMIT=30] -->
-    <string name="condition_battery_title">Battery Saver is on</string>
-
-    <!-- Summary of condition that battery saver is on [CHAR LIMIT=NONE] -->
-    <string name="condition_battery_summary">Features restricted</string>
-
     <!-- Title of condition that cellular data is off [CHAR LIMIT=50] -->
     <string name="condition_cellular_title">Mobile data is off</string>
 
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/BatterySaverConditionController.java b/src/com/android/settings/homepage/contextualcards/conditional/BatterySaverConditionController.java
deleted file mode 100644
index bce7c5d..0000000
--- a/src/com/android/settings/homepage/contextualcards/conditional/BatterySaverConditionController.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2018 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.homepage.contextualcards.conditional;
-
-import android.content.Context;
-import android.os.PowerManager;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.R;
-import com.android.settings.core.SubSettingLauncher;
-import com.android.settings.fuelgauge.BatterySaverReceiver;
-import com.android.settings.fuelgauge.batterysaver.BatterySaverSettings;
-import com.android.settings.homepage.contextualcards.ContextualCard;
-import com.android.settingslib.fuelgauge.BatterySaverUtils;
-
-import java.util.Objects;
-
-public class BatterySaverConditionController implements ConditionalCardController,
-        BatterySaverReceiver.BatterySaverListener {
-    static final int ID = Objects.hash("BatterySaverConditionController");
-
-    private final Context mAppContext;
-    private final ConditionManager mConditionManager;
-    private final BatterySaverReceiver mReceiver;
-    private final PowerManager mPowerManager;
-
-    public BatterySaverConditionController(Context appContext, ConditionManager conditionManager) {
-        mAppContext = appContext;
-        mConditionManager = conditionManager;
-        mPowerManager = appContext.getSystemService(PowerManager.class);
-        mReceiver = new BatterySaverReceiver(appContext);
-        mReceiver.setBatterySaverListener(this);
-    }
-
-    @Override
-    public long getId() {
-        return ID;
-    }
-
-    @Override
-    public boolean isDisplayable() {
-        return mPowerManager.isPowerSaveMode();
-    }
-
-    @Override
-    public void onPrimaryClick(Context context) {
-        new SubSettingLauncher(context)
-                .setDestination(BatterySaverSettings.class.getName())
-                .setSourceMetricsCategory(MetricsProto.MetricsEvent.DASHBOARD_SUMMARY)
-                .setTitleRes(R.string.battery_saver)
-                .launch();
-    }
-
-    @Override
-    public void onActionClick() {
-        BatterySaverUtils.setPowerSaveMode(mAppContext, false,
-                /*needFirstTimeWarning*/ false);
-    }
-
-    @Override
-    public ContextualCard buildContextualCard() {
-        return new ConditionalContextualCard.Builder()
-                .setConditionId(ID)
-                .setMetricsConstant(MetricsProto.MetricsEvent.SETTINGS_CONDITION_BATTERY_SAVER)
-                .setActionText(mAppContext.getText(R.string.condition_turn_off))
-                .setName(mAppContext.getPackageName() + "/"
-                        + mAppContext.getText(R.string.condition_battery_title))
-                .setTitleText(mAppContext.getText(R.string.condition_battery_title).toString())
-                .setSummaryText(mAppContext.getText(R.string.condition_battery_summary).toString())
-                .setIconDrawable(mAppContext.getDrawable(R.drawable.ic_battery_saver_accent_24dp))
-                .setIsHalfWidth(true)
-                .build();
-    }
-
-    @Override
-    public void startMonitoringStateChange() {
-        mReceiver.setListening(true);
-    }
-
-    @Override
-    public void stopMonitoringStateChange() {
-        mReceiver.setListening(false);
-    }
-
-    @Override
-    public void onPowerSaveModeChanged() {
-        mConditionManager.onConditionChanged();
-    }
-
-    @Override
-    public void onBatteryChanged(boolean pluggedIn) {
-
-    }
-}
diff --git a/src/com/android/settings/homepage/contextualcards/conditional/ConditionManager.java b/src/com/android/settings/homepage/contextualcards/conditional/ConditionManager.java
index c741b98..39f4903 100644
--- a/src/com/android/settings/homepage/contextualcards/conditional/ConditionManager.java
+++ b/src/com/android/settings/homepage/contextualcards/conditional/ConditionManager.java
@@ -154,7 +154,6 @@
         mCardControllers.add(new AirplaneModeConditionController(mAppContext, this /* manager */));
         mCardControllers.add(
                 new BackgroundDataConditionController(mAppContext, this /* manager */));
-        mCardControllers.add(new BatterySaverConditionController(mAppContext, this /* manager */));
         mCardControllers.add(new CellularDataConditionController(mAppContext, this /* manager */));
         mCardControllers.add(new DndConditionCardController(mAppContext, this /* manager */));
         mCardControllers.add(new HotspotConditionController(mAppContext, this /* manager */));
diff --git a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/BatterySaverConditionControllerTest.java b/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/BatterySaverConditionControllerTest.java
deleted file mode 100644
index e4ca6c0..0000000
--- a/tests/robotests/src/com/android/settings/homepage/contextualcards/conditional/BatterySaverConditionControllerTest.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2018 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.homepage.contextualcards.conditional;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.content.IntentFilter;
-import android.os.PowerManager;
-
-import com.android.settings.fuelgauge.BatterySaverReceiver;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-import org.robolectric.Shadows;
-import org.robolectric.shadows.ShadowPowerManager;
-
-@RunWith(RobolectricTestRunner.class)
-public class BatterySaverConditionControllerTest {
-    @Mock
-    private ConditionManager mConditionManager;
-
-    private ShadowPowerManager mPowerManager;
-    private Context mContext;
-    private BatterySaverConditionController mController;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-        mContext = spy(RuntimeEnvironment.application);
-        mPowerManager = Shadows.shadowOf(mContext.getSystemService(PowerManager.class));
-        mController = new BatterySaverConditionController(mContext, mConditionManager);
-    }
-
-    @Test
-    public void startMonitor_shouldRegisterReceiver() {
-        mController.startMonitoringStateChange();
-
-        verify(mContext).registerReceiver(any(BatterySaverReceiver.class), any(IntentFilter.class));
-    }
-
-    @Test
-    public void stopMonitor_shouldUnregisterReceiver() {
-        mController.startMonitoringStateChange();
-        mController.stopMonitoringStateChange();
-
-        verify(mContext).unregisterReceiver(any(BatterySaverReceiver.class));
-    }
-
-    @Test
-    public void isDisplayable_PowerSaverOn_true() {
-        mPowerManager.setIsPowerSaveMode(true);
-
-        assertThat(mController.isDisplayable()).isTrue();
-    }
-
-    @Test
-    public void isDisplayable_PowerSaverOff_false() {
-        mPowerManager.setIsPowerSaveMode(false);
-
-        assertThat(mController.isDisplayable()).isFalse();
-    }
-}
