update
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 3cdb9b3..6f1e495 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -3,15 +3,46 @@
   <component name="DesignSurface">
     <option name="filePathToZoomLevelMap">
       <map>
+        <entry key="../../../../layout/custom_preview.xml" value="0.2526041666666667" />
+        <entry key="app/src/main/res/drawable-v24/ic_launcher_foreground.xml" value="0.3067708333333333" />
+        <entry key="app/src/main/res/drawable/applist_icon.xml" value="0.30885416666666665" />
+        <entry key="app/src/main/res/drawable/bottom_navigation_selector.xml" value="0.3067708333333333" />
+        <entry key="app/src/main/res/drawable/grid_item_background.xml" value="0.30833333333333335" />
+        <entry key="app/src/main/res/drawable/grid_item_background_shape.xml" value="0.3104166666666667" />
+        <entry key="app/src/main/res/drawable/ic_bars_tile.xml" value="0.30885416666666665" />
+        <entry key="app/src/main/res/drawable/ic_homepage_bars.xml" value="0.5109375" />
+        <entry key="app/src/main/res/drawable/ic_launcher_background.xml" value="0.3067708333333333" />
+        <entry key="app/src/main/res/drawable/ic_launcher_foreground.xml" value="0.2869791666666667" />
+        <entry key="app/src/main/res/drawable/ic_settings_buttons.xml" value="0.3078125" />
+        <entry key="app/src/main/res/drawable/ic_settings_more.xml" value="0.30885416666666665" />
+        <entry key="app/src/main/res/drawable/ic_wallpaper.xml" value="0.3098958333333333" />
+        <entry key="app/src/main/res/drawable/settings_icon.xml" value="0.30885416666666665" />
+        <entry key="app/src/main/res/layout/grid_fragment.xml" value="0.3020833333333333" />
+        <entry key="app/src/main/res/layout/grid_item.xml" value="0.29270833333333335" />
         <entry key="app/src/main/res/layout/settings_activity.xml" value="0.259375" />
+        <entry key="app/src/main/res/menu/bottom_navbar.xml" value="0.23541666666666666" />
+        <entry key="app/src/main/res/menu/bottom_navigation.xml" value="0.2375" />
+        <entry key="app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml" value="0.3067708333333333" />
+        <entry key="app/src/main/res/xml/applist_preferences.xml" value="0.4979166666666667" />
+        <entry key="app/src/main/res/xml/bars_settings_preferences.xml" value="0.3098958333333333" />
+        <entry key="app/src/main/res/xml/bottom_navigation.xml" value="0.2375" />
+        <entry key="app/src/main/res/xml/button_settings_preferences.xml" value="0.4979166666666667" />
+        <entry key="app/src/main/res/xml/more_settings_preferences.xml" value="0.29375" />
         <entry key="app/src/main/res/xml/root_preferences.xml" value="0.4979166666666667" />
+        <entry key="app/src/main/res/xml/settings_preferences.xml" value="0.23541666666666666" />
       </map>
     </option>
   </component>
+  <component name="ProjectPlainTextFileTypeManager">
+    <file url="file://$PROJECT_DIR$/app/src/main/res/xml/bars_settings_preferences.xml" />
+  </component>
   <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/build/classes" />
   </component>
   <component name="ProjectType">
     <option name="id" value="Android" />
   </component>
+  <component name="SuppressKotlinCodeStyleNotification">
+    <option name="disableForAll" value="true" />
+  </component>
 </project>
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>
\ No newline at end of file
diff --git a/Android.bp b/Android.bp
new file mode 100644
index 0000000..60c1d6c
--- /dev/null
+++ b/Android.bp
@@ -0,0 +1,29 @@
+android_app {
+  name: "OmniControl",
+  manifest: "app/src/main/AndroidManifest.xml",
+  platform_apis: true,
+  certificate: "platform",
+  privileged: true,
+
+  srcs: [
+    "app/src/main/**/*.kt",
+    "app/src/main/**/*.java",
+  ],
+
+  resource_dirs: [
+    "app/src/main/res/",
+  ],
+
+  static_libs: [
+    "androidx.core_core",
+    "androidx.appcompat_appcompat",
+    "androidx.preference_preference",
+    "com.google.android.material_material",
+  ],
+
+  kotlincflags: ["-Xjvm-default=enable"],
+  
+  optimize: {
+    enabled: false,
+  },
+}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 42243f7..cb09029 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -21,6 +21,10 @@
             minifyEnabled false
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
+        debug {
+            applicationIdSuffix '.debug'
+            versionNameSuffix ' DEBUG'
+        }
     }
     compileOptions {
         sourceCompatibility JavaVersion.VERSION_1_8
diff --git a/app/src/debug/res/values/strings.xml b/app/src/debug/res/values/strings.xml
new file mode 100644
index 0000000..399e1fd
--- /dev/null
+++ b/app/src/debug/res/values/strings.xml
@@ -0,0 +1,3 @@
+<resources>
+    <string name="app_name">OmniControl DEBUG</string>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/java/org/omnirom/control/AppListFragment.kt b/app/src/main/java/org/omnirom/control/AppListFragment.kt
index 5c37ff4..d2fcdb2 100644
--- a/app/src/main/java/org/omnirom/control/AppListFragment.kt
+++ b/app/src/main/java/org/omnirom/control/AppListFragment.kt
@@ -1,31 +1,35 @@
+/*
+ *  Copyright (C) 2021 The OmniROM Project
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
 package org.omnirom.control
 
 import android.content.Intent
-import android.content.pm.PackageManager
 import android.os.Bundle
-import android.provider.Settings
 import androidx.appcompat.app.AppCompatActivity
 import androidx.preference.Preference
 import androidx.preference.PreferenceCategory
 import androidx.preference.PreferenceFragmentCompat
 
 class AppListFragment : PreferenceFragmentCompat() {
-    val KEY_APPS_LIST = "apps_list"
-    val OMNISTORE_APP_PKG = "org.omnirom.omnistore"
-    val OMNISTORE_INSTALL_PKG = "org.omnirom.omnistoreinstaller"
+    private val KEY_APPS_LIST = "apps_list"
+    private val OMNISTORE_APP_PKG = "org.omnirom.omnistore"
+    private val OMNISTORE_INSTALL_PKG = "org.omnirom.omnistoreinstaller"
     lateinit var appManager: ApplicationManager
 
-    fun isAvailableApp(packageName: String): Boolean {
-        val pm: PackageManager = requireContext().getPackageManager()
-        return try {
-            val enabled = pm.getApplicationEnabledSetting(packageName)
-            enabled != PackageManager.COMPONENT_ENABLED_STATE_DISABLED &&
-                    enabled != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER
-        } catch (e: Exception) {
-            false
-        }
-    }
-
     override fun onResume() {
         super.onResume()
         (activity as? AppCompatActivity)?.supportActionBar?.setDisplayHomeAsUpEnabled(true)
@@ -86,32 +90,32 @@
             resources.getString(R.string.omnistore_summary)
         )
 
-        appManager.addApp(
+        /*appManager.addApp(
             "org.omnirom.omnistyle",
             "org.omnirom.omnistyle.WallpaperActivity",
             getString(R.string.wallpaper_title),
             getString(R.string.wallpaper_summary)
-        )
+        )*/
 
         appManager.addApp(
-                "org.omnirom.device",
-                "org.omnirom.device.DeviceSettings",
-                getString(R.string.device_settings_title),
-                getString(R.string.device_settings_summary)
+            "org.omnirom.device",
+            "org.omnirom.device.DeviceSettings",
+            getString(R.string.device_settings_title),
+            getString(R.string.device_settings_summary)
         )
         createAppList()
     }
 
-    fun createAppList() {
+    private fun createAppList() {
         var appCategory: PreferenceCategory? = findPreference(KEY_APPS_LIST)
         if (appCategory != null) {
             appCategory.removeAll()
             for (app in appManager.mAppList) {
-                if (!isAvailableApp(app.mPackage)) {
+                if (!Utils.isAvailableApp(requireContext(), app.mPackage)) {
                     continue
                 }
-                if (app.mPackage.equals(OMNISTORE_INSTALL_PKG) && isAvailableApp(
-                        OMNISTORE_APP_PKG
+                if (app.mPackage.equals(OMNISTORE_INSTALL_PKG) && Utils.isAvailableApp(
+                        requireContext(), OMNISTORE_APP_PKG
                     )
                 ) {
                     continue
@@ -129,6 +133,7 @@
             }
         }
     }
+
     override fun onPreferenceTreeClick(preference: Preference?): Boolean {
         if (preference?.key != null) {
             var app: Application? = appManager.getAppOfPackage(preference.key)
diff --git a/app/src/main/java/org/omnirom/control/Application.kt b/app/src/main/java/org/omnirom/control/Application.kt
index 16e246c..f75c98c 100644
--- a/app/src/main/java/org/omnirom/control/Application.kt
+++ b/app/src/main/java/org/omnirom/control/Application.kt
@@ -1,19 +1,30 @@
+/*
+ *  Copyright (C) 2021 The OmniROM Project
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
 package org.omnirom.control
 
 import android.content.ComponentName
 
-class Application {
-    val mPackage: String
-    val mActivity:String
-    val mTitle: String
-    val mSummary: String
+class Application(packageName: String, activity: String, title: String, summary: String) {
+    val mPackage: String = packageName
+    val mActivity:String = activity
+    val mTitle: String = title
+    val mSummary: String = summary
 
-    constructor(packageName: String, activity: String, title: String, summary: String){
-        mActivity=activity
-        mPackage=packageName
-        mTitle=title
-        mSummary=summary
-    }
     fun getComponentName() : ComponentName{
         return ComponentName(mPackage, mActivity)
     }
diff --git a/app/src/main/java/org/omnirom/control/ApplicationManager.kt b/app/src/main/java/org/omnirom/control/ApplicationManager.kt
index b281d8a..8e13000 100644
--- a/app/src/main/java/org/omnirom/control/ApplicationManager.kt
+++ b/app/src/main/java/org/omnirom/control/ApplicationManager.kt
@@ -1,5 +1,21 @@
 package org.omnirom.control
-
+/*
+ *  Copyright (C) 2021 The OmniROM Project
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
 import android.content.Context
 import android.content.Intent
 import android.content.pm.PackageManager
@@ -15,16 +31,10 @@
 
 
 
-class ApplicationManager {
-
-    val mContext: Context
+class ApplicationManager(context: Context) {
+    private val mContext: Context = context
     val mAppList: ArrayList<Application> = ArrayList()
-    val mIconSize: Int
-
-    constructor(context: Context) {
-        mContext = context
-        mIconSize = mContext.resources.getDimensionPixelSize(R.dimen.applist_icon_size)
-    }
+    private val mIconSize: Int = mContext.resources.getDimensionPixelSize(R.dimen.applist_icon_size)
 
     fun getAppIcon(app: Application): Drawable {
         val pm: PackageManager = mContext.getPackageManager()
@@ -41,7 +51,6 @@
         try {
             mContext.startActivity(intent)
         } catch (e: Exception) {
-
         }
     }
 
@@ -51,30 +60,17 @@
 
     fun getAppOfPackage(packageName: String): Application? {
         for (app in mAppList) {
-            if (app.mPackage.equals(packageName)) return app
+            if (app.mPackage == packageName) return app
         }
         return null
     }
 
-    fun isAvailableApp(app: Application): Boolean {
-        val pm: PackageManager = mContext.getPackageManager()
-        return try {
-            val enabled = pm.getApplicationEnabledSetting(app.mPackage)
-            enabled != PackageManager.COMPONENT_ENABLED_STATE_DISABLED &&
-                    enabled != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER
-        } catch (e: PackageManager.NameNotFoundException) {
-            false
-        }
-    }
-
-    fun resizeAppIcon(image: Drawable,
-        size: Int, border: Int): Drawable {
+    private fun resizeAppIcon(image: Drawable,
+                              size: Int, border: Int): Drawable {
         val canvas = Canvas()
-        canvas.setDrawFilter(
-            PaintFlagsDrawFilter(
-                Paint.ANTI_ALIAS_FLAG,
-                Paint.FILTER_BITMAP_FLAG
-            )
+        canvas.drawFilter = PaintFlagsDrawFilter(
+            Paint.ANTI_ALIAS_FLAG,
+            Paint.FILTER_BITMAP_FLAG
         )
         val bmResult = Bitmap.createBitmap(
             size + border, size + border,
diff --git a/app/src/main/java/org/omnirom/control/BarsSettingsFragment.kt b/app/src/main/java/org/omnirom/control/BarsSettingsFragment.kt
index c0b4c6f..dd475bb 100644
--- a/app/src/main/java/org/omnirom/control/BarsSettingsFragment.kt
+++ b/app/src/main/java/org/omnirom/control/BarsSettingsFragment.kt
@@ -1,3 +1,20 @@
+/*
+ *  Copyright (C) 2021 The OmniROM Project
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
 package org.omnirom.control
 
 import android.os.Bundle
diff --git a/app/src/main/java/org/omnirom/control/ButtonSettingsFragment.kt b/app/src/main/java/org/omnirom/control/ButtonSettingsFragment.kt
new file mode 100644
index 0000000..ebb9a9e
--- /dev/null
+++ b/app/src/main/java/org/omnirom/control/ButtonSettingsFragment.kt
@@ -0,0 +1,42 @@
+/*
+ *  Copyright (C) 2021 The OmniROM Project
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+package org.omnirom.control
+
+import android.os.Bundle
+import android.provider.Settings
+import androidx.appcompat.app.AppCompatActivity
+import androidx.preference.Preference
+import androidx.preference.PreferenceFragmentCompat
+
+
+class ButtonSettingsFragment : PreferenceFragmentCompat() {
+
+    override fun onResume() {
+        super.onResume()
+        (activity as? AppCompatActivity)?.supportActionBar?.setDisplayHomeAsUpEnabled(true)
+        (activity as? SettingsActivity)?.updateFragmentTitle(resources.getString(R.string.button_settings_title))
+    }
+
+    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
+        setPreferencesFromResource(R.xml.button_settings_preferences, rootKey)
+    }
+
+    override fun onPreferenceTreeClick(preference: Preference?): Boolean {
+        return super.onPreferenceTreeClick(preference)
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/org/omnirom/control/GridViewFragment.kt b/app/src/main/java/org/omnirom/control/GridViewFragment.kt
index e86c197..91cef18 100644
--- a/app/src/main/java/org/omnirom/control/GridViewFragment.kt
+++ b/app/src/main/java/org/omnirom/control/GridViewFragment.kt
@@ -1,6 +1,25 @@
+/*
+ *  Copyright (C) 2021 The OmniROM Project
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
 package org.omnirom.control
 
+import android.content.ComponentName
 import android.content.Context
+import android.content.Intent
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
@@ -11,71 +30,100 @@
 
 
 class GridViewFragment() : Fragment() {
-    lateinit var gridView: GridView
-    val gridItems: ArrayList<GridItem>
+    private lateinit var gridView: GridView
+    private val gridItems: ArrayList<GridItem> = ArrayList()
 
-    init {
-        this.gridItems = ArrayList<GridItem>()
-        gridItems.add(
-            GridItem(
-                R.string.applist_settings_title,
-                R.drawable.applist_icon,
-                AppListFragment()
-            )
-        )
-        gridItems.add(
-            GridItem(
-                R.string.bars_settings_title,
-                R.drawable.ic_bars_tile,
-                BarsSettingsFragment()
-            )
-        )
-        gridItems.add(
-            GridItem(
-                R.string.more_settings_title,
-                R.drawable.ic_settings_more,
-                MoreSettingsFragment()
-            )
-        )
+    abstract class GridItem(title: Int, summary: Int, icon: Int) {
+        val gridTitle: Int = title
+        val gridSummary: Int = summary
+        val gridIcon: Int = icon
     }
 
-    class GridItem(text: Int, icon: Int, fragment: Fragment) {
-        val gridText: Int
-        val gridIcon: Int
-        val gridFragment: Fragment
+    class FragmentGridItem(title: Int, summary: Int, icon: Int, fragment: Fragment) :
+        GridItem(title, summary, icon) {
+        val gridFragment: Fragment = fragment
+    }
 
-        init {
-            gridText = text
-            gridIcon = icon
-            gridFragment = fragment
-        }
+    class IntentGridItem(title: Int, summary: Int, icon: Int, intent: Intent) :
+        GridItem(title, summary, icon) {
+        val gridIntent: Intent = intent
     }
 
     class GridViewAdapter(context: Context, gridItems: List<GridItem>) :
         ArrayAdapter<GridItem>(context, 0, gridItems) {
 
-        val vi: LayoutInflater
-
-        init {
-            this.vi = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
-        }
+        private val vi: LayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
 
         override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
-            val viewItem: View = if (convertView == null) {
-                vi.inflate(R.layout.grid_item, null)
-            } else {
-                convertView
-            }
+            val viewItem: View = convertView ?: vi.inflate(R.layout.grid_item, null)
 
-            val gridItem: GridItem? = getItem(position)
-            viewItem.findViewById<TextView>(R.id.grid_item_text).setText(gridItem?.gridText!!)
+            val gridItem: GridItem = getItem(position)!!
+
+            viewItem.findViewById<TextView>(R.id.grid_item_title).setText(gridItem.gridTitle)
             viewItem.findViewById<ImageView>(R.id.grid_item_icon)
-                .setImageResource(gridItem?.gridIcon!!)
-
+                .setImageResource(gridItem.gridIcon)
+            val summary = context.resources.getString(gridItem.gridSummary)
+            if (summary.isNotEmpty())
+                viewItem.findViewById<TextView>(R.id.grid_item_summary)
+                    .setText(gridItem.gridSummary)
+            else
+                viewItem.findViewById<TextView>(R.id.grid_item_summary).visibility = View.GONE
             return viewItem
         }
     }
 
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        gridItems.add(
+            FragmentGridItem(
+                R.string.applist_settings_title,
+                R.string.applist_settings_summary,
+                R.drawable.applist_icon,
+                AppListFragment()
+            )
+        )
+        gridItems.add(
+            FragmentGridItem(
+                R.string.bars_settings_title,
+                R.string.bars_settings_summary,
+                R.drawable.ic_bars_tile,
+                BarsSettingsFragment()
+            )
+        )
+        gridItems.add(
+            FragmentGridItem(
+                R.string.button_settings_title,
+                R.string.button_settings_summary,
+                R.drawable.ic_settings_buttons,
+                ButtonSettingsFragment()
+            )
+        )
+        if (Utils.isAvailableApp(requireContext(), "org.omnirom.omnistyle")) {
+            val wallpaperIntent = Intent()
+            wallpaperIntent.component = ComponentName(
+                "org.omnirom.omnistyle",
+                "org.omnirom.omnistyle.WallpaperActivity"
+            )
+            gridItems.add(
+                IntentGridItem(
+                    R.string.wallpaper_title,
+                    R.string.wallpaper_summary,
+                    R.drawable.ic_wallpaper,
+                    wallpaperIntent
+                )
+            )
+        }
+        gridItems.add(
+            FragmentGridItem(
+                R.string.more_settings_title,
+                R.string.more_settings_summary,
+                R.drawable.ic_settings_more,
+                MoreSettingsFragment()
+            )
+        )
+    }
+
     override fun onResume() {
         super.onResume()
         (activity as? AppCompatActivity)?.supportActionBar?.setDisplayHomeAsUpEnabled(false)
@@ -93,17 +141,19 @@
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
         gridView = view.findViewById(R.id.grid_view)
-
+        gridView.numColumns = resources.getInteger(R.integer.grid_view_columns)
         gridView.adapter = GridViewAdapter(requireContext(), gridItems)
-
         gridView.onItemClickListener =
-            AdapterView.OnItemClickListener { parent, view, position, id ->
+            AdapterView.OnItemClickListener { _, _, position, _ ->
                 val gridItem: GridItem = gridItems.get(position)
-                requireActivity().supportFragmentManager
-                    .beginTransaction()
-                    .replace(R.id.settings, gridItem.gridFragment)
-                    .addToBackStack(null)
-                    .commit()
+                if (gridItem is FragmentGridItem)
+                    requireActivity().supportFragmentManager
+                        .beginTransaction()
+                        .replace(R.id.settings, gridItem.gridFragment)
+                        .addToBackStack(null)
+                        .commit()
+                else if (gridItem is IntentGridItem)
+                    requireActivity().startActivity(gridItem.gridIntent)
             }
     }
 
diff --git a/app/src/main/java/org/omnirom/control/MoreSettingsFragment.kt b/app/src/main/java/org/omnirom/control/MoreSettingsFragment.kt
index c7dea2f..77a337c 100644
--- a/app/src/main/java/org/omnirom/control/MoreSettingsFragment.kt
+++ b/app/src/main/java/org/omnirom/control/MoreSettingsFragment.kt
@@ -1,3 +1,20 @@
+/*
+ *  Copyright (C) 2021 The OmniROM Project
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
 package org.omnirom.control
 
 import android.os.Bundle
diff --git a/app/src/main/java/org/omnirom/control/SettingsActivity.kt b/app/src/main/java/org/omnirom/control/SettingsActivity.kt
index 6fa9ada..c628e9e 100644
--- a/app/src/main/java/org/omnirom/control/SettingsActivity.kt
+++ b/app/src/main/java/org/omnirom/control/SettingsActivity.kt
@@ -1,3 +1,20 @@
+/*
+ *  Copyright (C) 2021 The OmniROM Project
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
 package org.omnirom.control
 
 import android.os.Bundle
@@ -5,38 +22,50 @@
 import android.widget.TextView
 import androidx.appcompat.app.AppCompatActivity
 import androidx.appcompat.widget.Toolbar
-import com.google.android.material.bottomnavigation.BottomNavigationView
-import org.w3c.dom.Text
+import androidx.fragment.app.Fragment
 
 
 class SettingsActivity : AppCompatActivity() {
 
     lateinit var titleView: TextView
+    private val CURRENT_FRAGMENT = "current_fragment"
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.settings_activity)
-        if (savedInstanceState == null) {
-            supportFragmentManager
-                    .beginTransaction()
-                    .replace(R.id.settings, GridViewFragment())
-                    .commit()
+
+        var fragment: Fragment = GridViewFragment()
+        if (savedInstanceState != null) {
+            val savedFragment =
+                supportFragmentManager.getFragment(savedInstanceState, CURRENT_FRAGMENT);
+            if (savedFragment != null)
+                fragment = savedFragment
         }
+        supportFragmentManager.beginTransaction()
+            .replace(R.id.settings, fragment)
+            .commit()
+
         val toolbar: Toolbar = findViewById(R.id.toolbar)
-        toolbar.setTitle("")
+        toolbar.title = ""
         setSupportActionBar(toolbar)
 
-        titleView = findViewById<TextView>(R.id.fragment_title)
+        titleView = findViewById(R.id.fragment_title)
     }
 
     override fun onOptionsItemSelected(item: MenuItem): Boolean {
-        when (item.getItemId()) {
+        when (item.itemId) {
             android.R.id.home -> onBackPressed()
         }
         return super.onOptionsItemSelected(item)
     }
 
     fun updateFragmentTitle(title: String) {
-        titleView.setText(title)
+        titleView.text = title
+    }
+
+    override fun onSaveInstanceState(outState: Bundle) {
+        super.onSaveInstanceState(outState)
+        val currentFragment = supportFragmentManager.fragments.last()
+        supportFragmentManager.putFragment(outState, CURRENT_FRAGMENT, currentFragment)
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/org/omnirom/control/Utils.kt b/app/src/main/java/org/omnirom/control/Utils.kt
new file mode 100644
index 0000000..bb4e9bf
--- /dev/null
+++ b/app/src/main/java/org/omnirom/control/Utils.kt
@@ -0,0 +1,17 @@
+package org.omnirom.control;
+
+import android.content.Context
+import android.content.pm.PackageManager
+
+object Utils {
+    fun isAvailableApp(context: Context, packageName: String): Boolean {
+            val pm: PackageManager = context.getPackageManager()
+            return try {
+                    val enabled = pm.getApplicationEnabledSetting(packageName)
+                    enabled != PackageManager.COMPONENT_ENABLED_STATE_DISABLED &&
+                            enabled != PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER
+            } catch (e: PackageManager.NameNotFoundException) {
+                    false
+            }
+    }
+}
diff --git a/app/src/main/res/drawable/grid_item_background_shape.xml b/app/src/main/res/drawable/grid_item_background_shape.xml
index 15d518c..5321c0e 100644
--- a/app/src/main/res/drawable/grid_item_background_shape.xml
+++ b/app/src/main/res/drawable/grid_item_background_shape.xml
@@ -17,5 +17,5 @@
 
 <shape xmlns:android="http://schemas.android.com/apk/res/android">
     <corners android:radius="@dimen/grid_item_corner_radius" />
-    <solid android:color="?android:colorAccent" />
+    <solid android:color="@color/colorPrimary" />
 </shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_settings_buttons.xml b/app/src/main/res/drawable/ic_settings_buttons.xml
new file mode 100644
index 0000000..de85da8
--- /dev/null
+++ b/app/src/main/res/drawable/ic_settings_buttons.xml
@@ -0,0 +1,26 @@
+<!--
+    Copyright (C) 2016 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"
+    android:tint="?android:textColorPrimary"
+
+    android:viewportHeight="24">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M4,5A2,2 0 0,0 2,7V17A2,2 0 0,0 4,19H20A2,2 0 0,0 22,17V7A2,2 0 0,0 20,5H4M4,7H20V17H4V7M5,8V10H7V8H5M8,8V10H10V8H8M11,8V10H13V8H11M14,8V10H16V8H14M17,8V10H19V8H17M5,11V13H7V11H5M8,11V13H10V11H8M11,11V13H13V11H11M14,11V13H16V11H14M17,11V13H19V11H17M8,14V16H16V14H8Z" />
+</vector>
diff --git a/app/src/main/res/drawable/ic_wallpaper.xml b/app/src/main/res/drawable/ic_wallpaper.xml
new file mode 100644
index 0000000..c0e41a6
--- /dev/null
+++ b/app/src/main/res/drawable/ic_wallpaper.xml
@@ -0,0 +1,10 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:tint="?android:textColorPrimary"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M4,4h7L11,2L4,2c-1.1,0 -2,0.9 -2,2v7h2L4,4zM10,13l-4,5h12l-3,-4 -2.03,2.71L10,13zM17,8.5c0,-0.83 -0.67,-1.5 -1.5,-1.5S14,7.67 14,8.5s0.67,1.5 1.5,1.5S17,9.33 17,8.5zM20,2h-7v2h7v7h2L22,4c0,-1.1 -0.9,-2 -2,-2zM20,20h-7v2h7c1.1,0 2,-0.9 2,-2v-7h-2v7zM4,13L2,13v7c0,1.1 0.9,2 2,2h7v-2L4,20v-7z" />
+</vector>
diff --git a/app/src/main/res/layout/grid_fragment.xml b/app/src/main/res/layout/grid_fragment.xml
index 2555dde..a5f25e3 100644
--- a/app/src/main/res/layout/grid_fragment.xml
+++ b/app/src/main/res/layout/grid_fragment.xml
@@ -8,10 +8,9 @@
         android:id="@+id/grid_view"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:numColumns="auto_fit"
+        android:numColumns="@integer/grid_view_columns"
         android:verticalSpacing="@dimen/grip_view_spacing"
         android:horizontalSpacing="@dimen/grip_view_spacing"
         android:stretchMode="columnWidth"
-        android:columnWidth="200dp"
         android:gravity="center" />
 </androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/grid_item.xml b/app/src/main/res/layout/grid_item.xml
index ae3852d..11cfddb 100644
--- a/app/src/main/res/layout/grid_item.xml
+++ b/app/src/main/res/layout/grid_item.xml
@@ -7,7 +7,7 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:layout_margin="20dp"
-        android:orientation="vertical">
+        android:orientation="horizontal">
 
         <ImageView
             android:id="@+id/grid_item_icon"
@@ -15,12 +15,31 @@
             android:layout_height="48dp"
             android:layout_gravity="center" />
 
-        <TextView
-            android:id="@+id/grid_item_text"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:textAlignment="center" />
+        <LinearLayout
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_gravity="start|center_vertical"
+            android:layout_marginStart="20dp"
+            android:layout_weight="1"
+            android:orientation="vertical">
 
+            <TextView
+                android:id="@+id/grid_item_title"
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:text="foo"
+                android:layout_weight="1"
+                android:gravity="center_vertical"
+                android:textAppearance="@style/TextAppearance.MaterialComponents.Body1"/>
+
+            <TextView
+                android:id="@+id/grid_item_summary"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:text="bar"
+                android:gravity="center_vertical"
+                android:textAppearance="@style/TextAppearance.MaterialComponents.Body2"/>
+
+        </LinearLayout>
     </LinearLayout>
-
 </FrameLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values-land/config.xml b/app/src/main/res/values-land/config.xml
new file mode 100644
index 0000000..93ab955
--- /dev/null
+++ b/app/src/main/res/values-land/config.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <integer name="grid_view_columns">2</integer>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values-land/dimens.xml b/app/src/main/res/values-land/dimens.xml
new file mode 100644
index 0000000..55344e5
--- /dev/null
+++ b/app/src/main/res/values-land/dimens.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/config.xml b/app/src/main/res/values/config.xml
new file mode 100644
index 0000000..517aa97
--- /dev/null
+++ b/app/src/main/res/values/config.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <integer name="grid_view_columns">1</integer>
+</resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 8622e01..9abf480 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -24,8 +24,11 @@
     <string name="device_settings_summary">Advanced device specific settings</string>
 
     <string name="bars_settings_title">Bars</string>
+    <string name="bars_settings_summary">Status bar options</string>
     <string name="more_settings_title">More</string>
+    <string name="more_settings_summary"></string>
     <string name="applist_settings_title">Applications</string>
+    <string name="applist_settings_summary">OmniROM applications</string>
 
     <string name="navigationbar_title">Navigation bar</string>
     <string name="navigation_bar_show_title">Show navigation bar</string>
@@ -35,4 +38,9 @@
     <string name="status_bar_clock_seconds_title">Show clock seconds</string>
     <string name="status_bar_clock_seconds_summary">Show seconds on status bar clock</string>
 
+    <string name="button_settings_title">Buttons</string>
+    <string name="button_settings_summary"></string>
+    <string name="global_actions_power_title">Power</string>
+    <string name="global_actions_advanced_reboot_title">Enable advanced restart</string>
+    <string name="global_actions_advanced_reboot_summary_new">Show more options in restart menu if not locked</string>
 </resources>
\ No newline at end of file
diff --git a/app/src/main/res/xml/button_settings_preferences.xml b/app/src/main/res/xml/button_settings_preferences.xml
new file mode 100644
index 0000000..fd0e52d
--- /dev/null
+++ b/app/src/main/res/xml/button_settings_preferences.xml
@@ -0,0 +1,18 @@
+<PreferenceScreen
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:key="button_settings"
+    android:title="@string/button_settings_title" >
+
+    <PreferenceCategory
+        android:key="button_power"
+        android:title="@string/global_actions_power_title" >
+
+        <org.omnirom.control.preference.SystemSettingSwitchPreference
+            android:key="advanced_reboot"
+            android:title="@string/global_actions_advanced_reboot_title"
+            android:summary="@string/global_actions_advanced_reboot_summary_new"
+            android:defaultValue="false" />
+
+    </PreferenceCategory>
+
+</PreferenceScreen>
diff --git a/app/src/main/res/xml/more_settings_preferences.xml b/app/src/main/res/xml/more_settings_preferences.xml
index 7123145..0a14d53 100644
--- a/app/src/main/res/xml/more_settings_preferences.xml
+++ b/app/src/main/res/xml/more_settings_preferences.xml
@@ -4,4 +4,10 @@
     <Preference
         android:key="bar"
         android:title="bar" />
+
+    <ListPreference
+        android:entries="@array/reply_entries"
+        android:entryValues="@array/reply_values"
+        android:key="list"
+        android:title="list" />
 </PreferenceScreen>