diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index c0c92f0..309830b 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -344,23 +344,20 @@
             final List<BatterySipper> usageList = getCoalescedUsageList(
                     USE_FAKE_DATA ? getFakeStats() : mStatsHelper.getUsageList());
 
-            final double screenPowerMah = removeScreenBatterySipper(usageList);
+            final double hiddenPowerMah = removeHiddenBatterySippers(usageList);
 
             final int dischargeAmount = USE_FAKE_DATA ? 5000
                     : stats != null ? stats.getDischargeAmount(mStatsType) : 0;
             final int numSippers = usageList.size();
             for (int i = 0; i < numSippers; i++) {
                 final BatterySipper sipper = usageList.get(i);
-                if (shouldHideSipper(sipper)) {
-                    continue;
-                }
-
-                // Deduct the screen power from total power, used to calculate percentOfTotal
+                // Deduct the power of hidden items from total power, which is used to
+                // calculate percentOfTotal
                 double totalPower = USE_FAKE_DATA ?
-                        4000 : mStatsHelper.getTotalPower() - screenPowerMah;
+                        4000 : mStatsHelper.getTotalPower() - hiddenPowerMah;
 
                 // With deduction in totalPower, percentOfTotal is higher because it adds the part
-                // used in screen
+                // used in screen, system, etc
                 final double percentOfTotal =
                         ((sipper.totalPowerMah / totalPower) * dischargeAmount);
 
@@ -451,7 +448,8 @@
         final int uid = sipper.getUid();
 
         return drainType == DrainType.IDLE || drainType == DrainType.CELL
-                || uid == Process.ROOT_UID || uid == Process.SYSTEM_UID
+                || drainType == DrainType.SCREEN || uid == Process.ROOT_UID
+                || uid == Process.SYSTEM_UID
                 || (sipper.totalPowerMah * SECONDS_IN_HOUR) < MIN_POWER_THRESHOLD_MILLI_AMP;
     }
 
@@ -470,16 +468,17 @@
     }
 
     @VisibleForTesting
-    double removeScreenBatterySipper(List<BatterySipper> sippers) {
-        for (int i = 0, size = sippers.size(); i < size; i++) {
+    double removeHiddenBatterySippers(List<BatterySipper> sippers) {
+        double totalPowerMah = 0;
+        for (int i = sippers.size() - 1; i >= 0; i--) {
             final BatterySipper sipper = sippers.get(i);
-            if (sipper.drainType == DrainType.SCREEN) {
+            if (shouldHideSipper(sipper)) {
                 sippers.remove(i);
-                return sipper.totalPowerMah;
+                totalPowerMah += sipper.totalPowerMah;
             }
         }
 
-        return 0;
+        return totalPowerMah;
     }
 
     private static List<BatterySipper> getFakeStats() {
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
index 63cb5e1..60e1f50 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/PowerUsageSummaryTest.java
@@ -44,7 +44,6 @@
 import static com.android.settings.fuelgauge.PowerUsageSummary.MENU_ADDITIONAL_BATTERY_INFO;
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
@@ -61,6 +60,7 @@
     private static final int UID = 123;
     private static final int POWER_MAH = 100;
     private static final double BATTERY_SCREEN_USAGE = 300;
+    private static final double BATTERY_SYSTEM_USAGE = 600;
     private static final double PRECISION = 0.001;
     private static final Intent ADDITIONAL_BATTERY_INFO_INTENT =
             new Intent("com.example.app.ADDITIONAL_BATTERY_INFO");
@@ -80,6 +80,8 @@
     @Mock
     private BatterySipper mScreenBatterySipper;
     @Mock
+    private BatterySipper mSystemBatterySipper;
+    @Mock
     private PowerGaugePreference mPreference;
 
     private TestFragment mFragment;
@@ -114,6 +116,9 @@
 
         mScreenBatterySipper.drainType = BatterySipper.DrainType.SCREEN;
         mScreenBatterySipper.totalPowerMah = BATTERY_SCREEN_USAGE;
+        mSystemBatterySipper.drainType = BatterySipper.DrainType.APP;
+        mSystemBatterySipper.totalPowerMah = BATTERY_SYSTEM_USAGE;
+        when(mSystemBatterySipper.getUid()).thenReturn(Process.SYSTEM_UID);
     }
 
     @Test
@@ -162,17 +167,6 @@
     }
 
     @Test
-    public void testRemoveScreenBatterySipper_ContainsScreenSipper_RemoveAndReturnValue() {
-        final List<BatterySipper> sippers = new ArrayList<>();
-        sippers.add(mNormalBatterySipper);
-        sippers.add(mScreenBatterySipper);
-
-        final double screenUsage = mPowerUsageSummary.removeScreenBatterySipper(sippers);
-        assertThat(sippers).containsExactly(mNormalBatterySipper);
-        assertThat(screenUsage).isWithin(PRECISION).of(BATTERY_SCREEN_USAGE);
-    }
-
-    @Test
     public void testExtractKeyFromSipper_TypeAPPUidObjectNotNull_ReturnUid() {
         mNormalBatterySipper.uidObj = new BatteryStatsImpl.Uid(new BatteryStatsImpl(), UID);
         mNormalBatterySipper.drainType = BatterySipper.DrainType.APP;
@@ -182,6 +176,18 @@
     }
 
     @Test
+    public void testRemoveHiddenBatterySippers_ContainsHiddenSippers_RemoveAndReturnValue() {
+        final List<BatterySipper> sippers = new ArrayList<>();
+        sippers.add(mNormalBatterySipper);
+        sippers.add(mScreenBatterySipper);
+        sippers.add(mSystemBatterySipper);
+
+        final double totalUsage = mPowerUsageSummary.removeHiddenBatterySippers(sippers);
+        assertThat(sippers).containsExactly(mNormalBatterySipper);
+        assertThat(totalUsage).isWithin(PRECISION).of(BATTERY_SCREEN_USAGE + BATTERY_SYSTEM_USAGE);
+    }
+
+    @Test
     public void testShouldHideSipper_TypeIdle_ReturnTrue() {
         mNormalBatterySipper.drainType = BatterySipper.DrainType.IDLE;
         assertThat(mPowerUsageSummary.shouldHideSipper(mNormalBatterySipper)).isTrue();
@@ -194,6 +200,12 @@
     }
 
     @Test
+    public void testShouldHideSipper_TypeScreen_ReturnTrue() {
+        mNormalBatterySipper.drainType = BatterySipper.DrainType.SCREEN;
+        assertThat(mPowerUsageSummary.shouldHideSipper(mNormalBatterySipper)).isTrue();
+    }
+
+    @Test
     public void testShouldHideSipper_UidRoot_ReturnTrue() {
         mNormalBatterySipper.drainType = BatterySipper.DrainType.APP;
         when(mNormalBatterySipper.getUid()).thenReturn(Process.ROOT_UID);
