diff --git a/res/values/custom_arrays.xml b/res/values/custom_arrays.xml
index 837eaab..87aa59f 100644
--- a/res/values/custom_arrays.xml
+++ b/res/values/custom_arrays.xml
@@ -135,19 +135,6 @@
         <item>#FFFF0000</item>
     </string-array>
 
-    <!-- show battery percent -->
-    <string-array name="entries_battery_percent" translatable="false">
-        <item>@string/battery_percent_none</item>
-        <item>@string/battery_percent_always</item>
-        <!--<item>@string/battery_percent_expanded</item>-->
-    </string-array>
-
-    <string-array name="values_battery_percent" translatable="false">
-        <item>0</item>
-        <item>1</item>
-        <!--<item>2</item>-->
-    </string-array>
-
     <string-array name="navbar_recents_style_entries" translatable="false">
         <item>@string/keys_action_app_switch_card</item>
         <item>@string/keys_action_app_switch_grid</item>
diff --git a/res/values/custom_strings.xml b/res/values/custom_strings.xml
index 0f2d2da..9e282f7 100644
--- a/res/values/custom_strings.xml
+++ b/res/values/custom_strings.xml
@@ -182,9 +182,6 @@
     <string name="statusbar_battery_summary">Set style of status bar battery display</string>
     <string name="battery_style_title">Style</string>
     <string name="battery_percent_title">Show percent</string>
-    <string name="battery_percent_none">Never</string>
-    <string name="battery_percent_always">Always</string>
-    <string name="battery_percent_expanded">Expanded</string>
     <string name="statusbar_percent_inside_title">Percent overlay</string>
     <string name="statusbar_percent_inside_summary">Display percent on top of the the battery image</string>
     <string name="statusbar_charging_image_title">Charging indicator</string>
diff --git a/res/xml/statusbar_battery_settings.xml b/res/xml/statusbar_battery_settings.xml
index 1e3c7b0..95b10eb 100644
--- a/res/xml/statusbar_battery_settings.xml
+++ b/res/xml/statusbar_battery_settings.xml
@@ -17,13 +17,11 @@
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:settings="http://schemas.android.com/apk/res/com.android.settings">
 
-        <ListPreference
+        <SwitchPreference
             android:key="statusbar_battery_enable"
             android:title="@string/battery_enable_title"
-            android:entries="@array/entries_battery_percent"
-            android:entryValues="@array/values_battery_percent"
             android:persistent="false"
-            android:defaultValue="1"/>
+            android:defaultValue="true"/>
         <ListPreference
             android:key="statusbar_battery_style"
             android:title="@string/battery_style_title"
@@ -31,13 +29,11 @@
             android:entryValues="@*android:array/values_battery_styles"
             android:persistent="false"
             android:defaultValue="0"/>
-        <ListPreference
+        <CheckBoxPreference
             android:key="statusbar_battery_percent"
             android:title="@string/battery_percent_title"
-            android:entries="@array/entries_battery_percent"
-            android:entryValues="@array/values_battery_percent"
             android:persistent="false"
-            android:defaultValue="1"/>
+            android:defaultValue="false"/>
         <org.omnirom.omnigears.preference.SystemCheckBoxPreference
             android:key="statusbar_battery_percent_inside"
             android:title="@string/statusbar_percent_inside_title"
diff --git a/src/org/omnirom/omnigears/interfacesettings/StatusbarBatterySettings.java b/src/org/omnirom/omnigears/interfacesettings/StatusbarBatterySettings.java
index 326e46e..00dc9d6 100644
--- a/src/org/omnirom/omnigears/interfacesettings/StatusbarBatterySettings.java
+++ b/src/org/omnirom/omnigears/interfacesettings/StatusbarBatterySettings.java
@@ -32,6 +32,7 @@
 import android.support.v7.preference.PreferenceScreen;
 import android.support.v7.preference.PreferenceCategory;
 import android.support.v14.preference.PreferenceFragment;
+import android.support.v14.preference.SwitchPreference;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
 import android.provider.Settings.SettingNotFoundException;
@@ -67,13 +68,13 @@
     private static final String STATUSBAR_CATEGORY_CHARGING = "statusbar_category_charging";
 
     private ListPreference mBatteryStyle;
-    private ListPreference mBatteryPercent;
+    private CheckBoxPreference mBatteryPercent;
     private ColorPickerPreference mChargingColor;
     private CheckBoxPreference mPercentInside;
     private CheckBoxPreference mShowBolt;
     private int mShowPercent;
     private int mBatteryStyleValue;
-    private ListPreference mBatteryEnable;
+    private SwitchPreference mBatteryEnable;
     private int mShowBattery = 1;
     private PreferenceCategory mChargingCategory;
 
@@ -98,12 +99,10 @@
         mBatteryStyle.setSummary(mBatteryStyle.getEntry());
         mBatteryStyle.setOnPreferenceChangeListener(this);
 
-        mBatteryPercent = (ListPreference) findPreference(STATUSBAR_BATTERY_PERCENT);
+        mBatteryPercent = (CheckBoxPreference) findPreference(STATUSBAR_BATTERY_PERCENT);
         mShowPercent = Settings.System.getInt(resolver,
                 Settings.System.STATUSBAR_BATTERY_PERCENT, 0);
-
-        mBatteryPercent.setValue(Integer.toString(mShowPercent));
-        mBatteryPercent.setSummary(mBatteryPercent.getEntry());
+        mBatteryPercent.setChecked(mShowPercent == 1);
         mBatteryPercent.setOnPreferenceChangeListener(this);
 
         mChargingColor = (ColorPickerPreference) prefScreen.findPreference(STATUSBAR_CHARGING_COLOR);
@@ -118,12 +117,10 @@
 
         mShowBolt = (CheckBoxPreference) findPreference(STATUSBAR_BATTERY_SHOW_BOLT);
 
-        mBatteryEnable = (ListPreference) findPreference(STATUSBAR_BATTERY_ENABLE);
+        mBatteryEnable = (SwitchPreference) findPreference(STATUSBAR_BATTERY_ENABLE);
         mShowBattery = Settings.System.getInt(resolver,
                 Settings.System.STATUSBAR_BATTERY_ENABLE, 1);
-
-        mBatteryEnable.setValue(Integer.toString(mShowBattery));
-        mBatteryEnable.setSummary(mBatteryEnable.getEntry());
+        mBatteryEnable.setChecked(mShowBattery == 1);
         mBatteryEnable.setOnPreferenceChangeListener(this);
 
         mChargingCategory = (PreferenceCategory) findPreference(STATUSBAR_CATEGORY_CHARGING);
@@ -148,12 +145,10 @@
                     Settings.System.STATUSBAR_BATTERY_STYLE, mBatteryStyleValue);
             updateEnablement();
         } else if (preference == mBatteryPercent) {
-            mShowPercent = Integer.valueOf((String) newValue);
-            int index = mBatteryPercent.findIndexOfValue((String) newValue);
-            mBatteryPercent.setSummary(
-                    mBatteryPercent.getEntries()[index]);
+            Boolean value = (Boolean) newValue;
+            mShowPercent = value ? 1 : 0;
             Settings.System.putInt(getContentResolver(),
-                    Settings.System.STATUSBAR_BATTERY_PERCENT, mShowPercent);
+                    Settings.System.STATUSBAR_BATTERY_PERCENT, value ? 1 : 0);
             updateEnablement();
         } else if (preference == mChargingColor) {
             String hexColor = String.format("#%08X", mChargingColor.getColor());
@@ -161,23 +156,28 @@
             Settings.System.putInt(resolver,
                     Settings.System.STATUSBAR_BATTERY_CHARGING_COLOR, mChargingColor.getColor());
         } else if (preference == mBatteryEnable) {
-            mShowBattery = Integer.valueOf((String) newValue);
-            int index = mBatteryEnable.findIndexOfValue((String) newValue);
-            mBatteryEnable.setSummary(
-                    mBatteryEnable.getEntries()[index]);
+            Boolean value = (Boolean) newValue;
+            mShowBattery = value ? 1 : 0;
             Settings.System.putInt(getContentResolver(),
-                    Settings.System.STATUSBAR_BATTERY_ENABLE, mShowBattery);
+                    Settings.System.STATUSBAR_BATTERY_ENABLE, value ? 1 : 0);
             updateEnablement();
         }
         return true;
     }
 
     private void updateEnablement() {
-        mPercentInside.setEnabled(mShowBattery != 0 && mBatteryStyleValue != 3 && mBatteryStyleValue != 4 && mShowPercent != 0);
-        mShowBolt.setEnabled(mBatteryStyleValue != 3 && mBatteryStyleValue != 4);
+        if (mBatteryStyleValue == 5) {
+            // theme
+            mPercentInside.setEnabled(false);
+            mShowBolt.setEnabled(false);
+            mBatteryPercent.setEnabled(false);
+        } else {
+            mPercentInside.setEnabled(mShowBattery != 0 && mBatteryStyleValue != 3 && mBatteryStyleValue != 4 && mShowPercent != 0);
+            mShowBolt.setEnabled(mBatteryStyleValue != 3 && mBatteryStyleValue != 4);
+            mBatteryPercent.setEnabled(mShowBattery != 0 && mBatteryStyleValue != 3);
+        }
         mBatteryStyle.setEnabled(mShowBattery != 0);
-        mBatteryPercent.setEnabled(mShowBattery != 0 && mBatteryStyleValue != 3);
-        mChargingCategory.setEnabled(mShowBattery != 0);
+        mChargingCategory.setEnabled(mShowBattery != 0 && mBatteryStyleValue != 5);
     }
 
     public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
