diff --git a/res/values/custom_arrays.xml b/res/values/custom_arrays.xml
index e288c42..adfe514 100644
--- a/res/values/custom_arrays.xml
+++ b/res/values/custom_arrays.xml
@@ -223,4 +223,16 @@
         <item>3</item>
         <item>4</item>
     </string-array>
+
+    <string-array name="button_back_kill_timeout_entries" translatable="false">
+        <item>@string/button_back_kill_timeout_500ms</item>
+        <item>@string/button_back_kill_timeout_1000ms</item>
+        <item>@string/button_back_kill_timeout_1500ms</item>
+    </string-array>
+
+    <string-array name="button_back_kill_timeout_values" translatable="false">
+        <item>500</item>
+        <item>1000</item>
+        <item>1500</item>
+    </string-array>
 </resources>
diff --git a/res/values/custom_strings.xml b/res/values/custom_strings.xml
index d8f0e61..ea453a9 100644
--- a/res/values/custom_strings.xml
+++ b/res/values/custom_strings.xml
@@ -63,9 +63,15 @@
     <string name="button_home_wake_summary">Pressing the home button will wake the device</string>
     <string name="button_home_answers_call_title">Button answers call</string>
     <string name="button_home_answers_call_summary">Pressing the home button will answer incoming call</string>
-    <string name="button_other_title">Recents</string>
+    <string name="button_other_title">Other</string>
     <string name="keys_action_app_switch_short">Default</string>
     <string name="keys_action_omniswitch_short">OmniSwitch</string>
+    <string name="button_back_kill_enable_title">Kill app back button</string>
+    <string name="button_back_kill_enable_summary">Kill the foreground app by long-pressing the back button</string>
+    <string name="button_back_kill_timeout_title">Kill app timeout</string>
+    <string name="button_back_kill_timeout_500ms">500 ms</string>
+    <string name="button_back_kill_timeout_1000ms">1000 ms</string>
+    <string name="button_back_kill_timeout_1500ms">1500 ms</string>
 
     <!-- Double tap to sleep -->
     <string name="double_tap_to_sleep_title">Double-tap to sleep</string>
@@ -266,8 +272,8 @@
     <!-- Dashboard columns -->
     <string name="dashboard_columns_title">Settings columns</string>
     <string name="dashboard_columns_phone_default">Default</string>
-    <string name="dashboard_columns_two">Two</string>
+    <string name="dashboard_columns_two">2</string>
     <string name="dashboard_columns_tablet_default">Default</string>
-    <string name="dashboard_columns_three">Three</string>
-    <string name="dashboard_columns_four">Four</string>
+    <string name="dashboard_columns_three">3</string>
+    <string name="dashboard_columns_four">4</string>
 </resources>
diff --git a/res/xml/button_settings.xml b/res/xml/button_settings.xml
index 9a11f8b..efc4112 100644
--- a/res/xml/button_settings.xml
+++ b/res/xml/button_settings.xml
@@ -258,6 +258,20 @@
             android:entries="@array/navbar_recents_style_entries"
             android:entryValues="@array/navbar_recents_style_values"
             android:persistent="false"/>
+
+        <com.android.settings.preference.SystemCheckBoxPreference
+            android:key="button_back_kill_enable"
+            android:title="@string/button_back_kill_enable_title"
+            android:summary="@string/button_back_kill_enable_summary"
+            android:defaultValue="true"/>
+
+        <ListPreference
+            android:key="button_back_kill_timeout"
+            android:title="@string/button_back_kill_timeout_title"
+            android:entries="@array/button_back_kill_timeout_entries"
+            android:entryValues="@array/button_back_kill_timeout_values"
+            android:persistent="false"
+            android:dependency="button_back_kill_enable"/>
     </PreferenceCategory>
 
 <!--    <PreferenceCategory
diff --git a/src/org/omnirom/omnigears/ButtonBrightnessSettings.java b/src/org/omnirom/omnigears/ButtonBrightnessSettings.java
index ccaa12f..fd778c8 100644
--- a/src/org/omnirom/omnigears/ButtonBrightnessSettings.java
+++ b/src/org/omnirom/omnigears/ButtonBrightnessSettings.java
@@ -72,6 +72,7 @@
     private ManualButtonBrightnessDialog mManualBrightnessDialog;
     private IPowerManager mPowerService;
     private SeekBarPreference mButtonTimoutBar;
+    private int mCurrentBrightness;
 
     @Override
     protected int getMetricsCategory() {
@@ -94,6 +95,11 @@
                 Settings.System.CUSTOM_BUTTON_USE_SCREEN_BRIGHTNESS, 0) != 0);
 
         mManualButtonBrightness = (Preference) findPreference(KEY_BUTTON_MANUAL_BRIGHTNESS);
+        final int customButtonBrightness = getResources().getInteger(
+                com.android.internal.R.integer.config_button_brightness_default);
+        mCurrentBrightness = Settings.System.getInt(getContext().getContentResolver(),
+                Settings.System.CUSTOM_BUTTON_BRIGHTNESS, customButtonBrightness);
+        mManualButtonBrightness.setSummary(String.valueOf(mCurrentBrightness));
 
         mButtonTimoutBar = (SeekBarPreference) findPreference(KEY_BUTTON_TIMEOUT);
         int currentTimeout = Settings.System.getInt(resolver,
@@ -184,7 +190,6 @@
 
         private SeekBar mBacklightBar;
         private EditText mBacklightInput;
-        private int mCurrentBrightness;
         private boolean mIsDragging = false;
 
         public ManualButtonBrightnessDialog(Context context) {
@@ -203,11 +208,6 @@
             setCancelable(true);
             setView(v);
 
-            final int customButtonBrightness = getResources().getInteger(
-                    com.android.internal.R.integer.config_button_brightness_default);
-            mCurrentBrightness = Settings.System.getInt(getContext().getContentResolver(),
-                    Settings.System.CUSTOM_BUTTON_BRIGHTNESS, customButtonBrightness);
-
             mBacklightBar.setMax(brightnessToProgress(PowerManager.BRIGHTNESS_ON));
             mBacklightBar.setProgress(brightnessToProgress(mCurrentBrightness));
             mBacklightInput.setText(String.valueOf(mCurrentBrightness));
@@ -233,9 +233,10 @@
         public void onClick(DialogInterface dialog, int which) {
             if (which == DialogInterface.BUTTON_POSITIVE) {
                 try {
-                    int newBacklight = Integer.valueOf(mBacklightInput.getText().toString());
+                    mCurrentBrightness = Integer.valueOf(mBacklightInput.getText().toString());
                     Settings.System.putInt(getContext().getContentResolver(),
-                            Settings.System.CUSTOM_BUTTON_BRIGHTNESS, newBacklight);
+                            Settings.System.CUSTOM_BUTTON_BRIGHTNESS, mCurrentBrightness);
+                    mManualButtonBrightness.setSummary(String.valueOf(mCurrentBrightness));
                 } catch (NumberFormatException e) {
                     Log.d(TAG, "NumberFormatException " + e);
                 }
diff --git a/src/org/omnirom/omnigears/ButtonSettings.java b/src/org/omnirom/omnigears/ButtonSettings.java
index a65bbd7..c2c602e 100644
--- a/src/org/omnirom/omnigears/ButtonSettings.java
+++ b/src/org/omnirom/omnigears/ButtonSettings.java
@@ -108,6 +108,7 @@
     private static final String KEYS_SHOW_NAVBAR_KEY = "navigation_bar_show";
     private static final String KEYS_DISABLE_HW_KEY = "hardware_keys_disable";
     private static final String NAVIGATION_BAR_RECENTS_STYLE = "navbar_recents_style";
+    private static final String BUTTON_BACK_KILL_TIMEOUT = "button_back_kill_timeout";
 
     // Available custom actions to perform on a key press.
     private static final int ACTION_NOTHING = 0;
@@ -164,6 +165,7 @@
     private PreferenceCategory mKeysAppSwitchCategory;
     private PreferenceCategory mKeysAssistCategory;
     private ListPreference mNavbarRecentsStyle;
+    private ListPreference mBackKillTimeout;
 
     @Override
     protected int getMetricsCategory() {
@@ -185,7 +187,7 @@
         final PreferenceCategory volumeCategory =
                 (PreferenceCategory) prefScreen.findPreference(CATEGORY_VOLUME);
 
-        mButtonBrightnessSupport = getResources().getBoolean(com.android.internal.R.bool.config_button_brightness_support);
+        mButtonBrightnessSupport = res.getBoolean(com.android.internal.R.bool.config_button_brightness_support);
 
         if (hasVolumeRocker()) {
             mVolumeWake = (CheckBoxPreference) findPreference(BUTTON_VOLUME_WAKE);
@@ -226,7 +228,7 @@
             prefScreen.removePreference(volumeCategory);
         }
 
-        final int deviceKeys = getResources().getInteger(
+        final int deviceKeys = res.getInteger(
                 com.android.internal.R.integer.config_deviceHardwareKeys);
         final boolean hasBackKey = false; //(deviceKeys & KEY_MASK_BACK) != 0;
         final boolean hasHomeKey = false; //(deviceKeys & KEY_MASK_HOME) != 0;
@@ -321,7 +323,7 @@
                 mKeySettings.put(Settings.System.KEY_HOME_ACTION, homePressAction);
 
                 int homeLongPressAction;
-                int longPressOnHomeBehavior = getResources().getInteger(
+                int longPressOnHomeBehavior = res.getInteger(
                         com.android.internal.R.integer.config_longPressOnHomeBehavior);
 
                 if (longPressOnHomeBehavior == 1) {
@@ -346,7 +348,7 @@
 
                 mKeySettings.put(Settings.System.KEY_HOME_LONG_PRESS_ACTION, homeLongPressAction);
 
-                int doubleTapOnHomeBehavior = getResources().getInteger(
+                int doubleTapOnHomeBehavior = res.getInteger(
                         com.android.internal.R.integer.config_doubleTapOnHomeBehavior);
 
                 int homeDoubleTapAction = Settings.System.getInt(resolver,
@@ -459,8 +461,7 @@
 //                        Settings.System.VIRTUAL_KEYS_HAPTIC_FEEDBACK, 1) == 1);
 //            }
 //
-            boolean hasNavBar = getResources().getBoolean(
-                    com.android.internal.R.bool.config_showNavigationBar);
+            boolean hasNavBar = res.getBoolean(com.android.internal.R.bool.config_showNavigationBar);
 //            mForceShowOverflowMenu.setChecked(Settings.System.getInt(resolver,
 //                    Settings.System.FORCE_SHOW_OVERFLOW_MENU, (!hasNavBar && hasMenuKey) ? 0 : 1) == 1);
 //
@@ -489,6 +490,15 @@
         mNavbarRecentsStyle.setSummary(mNavbarRecentsStyle.getEntry());
         mNavbarRecentsStyle.setOnPreferenceChangeListener(this);
 
+        mBackKillTimeout = (ListPreference) findPreference(BUTTON_BACK_KILL_TIMEOUT);
+        final int backKillTimeoutDefault = res.getInteger(com.android.internal.R.integer.config_backKillTimeout);
+        final int backKillTimeout = Settings.System.getInt(resolver,
+                Settings.System.BUTTON_BACK_KILL_TIMEOUT, backKillTimeoutDefault);
+
+        mBackKillTimeout.setValue(Integer.toString(backKillTimeout));
+        mBackKillTimeout.setSummary(mBackKillTimeout.getEntry());
+        mBackKillTimeout.setOnPreferenceChangeListener(this);
+
 //        final PreferenceCategory headsethookCategory =
 //                (PreferenceCategory) prefScreen.findPreference(CATEGORY_HEADSETHOOK);
 
@@ -708,10 +718,14 @@
                 }
             }
             int index = mNavbarRecentsStyle.findIndexOfValue((String) newValue);
-            mNavbarRecentsStyle.setSummary(
-                    mNavbarRecentsStyle.getEntries()[index]);
-            Settings.System.putInt(getContentResolver(),
-                    Settings.System.NAVIGATION_BAR_RECENTS, value);
+            mNavbarRecentsStyle.setSummary(mNavbarRecentsStyle.getEntries()[index]);
+            Settings.System.putInt(getContentResolver(), Settings.System.NAVIGATION_BAR_RECENTS, value);
+            return true;
+        } else if (preference == mBackKillTimeout) {
+            int value = Integer.valueOf((String) newValue);
+            int index = mBackKillTimeout.findIndexOfValue((String) newValue);
+            mBackKillTimeout.setSummary(mBackKillTimeout.getEntries()[index]);
+            Settings.System.putInt(getContentResolver(), Settings.System.BUTTON_BACK_KILL_TIMEOUT, value);
             return true;
         }
         return false;
