diff --git a/app/src/main/java/org/omnirom/control/FingerprintSettingsFragment.kt b/app/src/main/java/org/omnirom/control/FingerprintSettingsFragment.kt
deleted file mode 100644
index 8bf0e73..0000000
--- a/app/src/main/java/org/omnirom/control/FingerprintSettingsFragment.kt
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- *  Copyright (C) 2023 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.Manifest.permission.READ_MEDIA_IMAGES
-import android.Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED
-
-import android.Manifest
-import android.app.Activity
-import android.content.ComponentName
-import android.content.Context
-import android.content.Intent
-import android.content.ServiceConnection
-import android.graphics.Bitmap
-import android.graphics.BitmapFactory
-import android.graphics.drawable.BitmapDrawable
-import android.net.Uri
-import android.os.Build
-import android.os.Bundle
-import android.os.IBinder
-import android.provider.MediaStore
-import android.provider.Settings
-import android.util.Log
-import androidx.activity.result.contract.ActivityResultContract
-import androidx.activity.result.contract.ActivityResultContracts
-import androidx.annotation.DrawableRes
-import androidx.annotation.XmlRes
-import androidx.preference.Preference
-import androidx.preference.SwitchPreference
-import com.android.systemui.shared.omni.IOmniSystemUiProxy
-import org.omnirom.omnilib.utils.OmniSettings
-import java.io.File
-import java.io.FileOutputStream
-import java.io.IOException
-
-class FingerprintSettingsFragment : AbstractSettingsFragment() {
-    private val TAG = "FingerprintSettingsFragment"
-    private val FINGERPRINT_CUSTOM_ICON_SELECT = "custom_fingerprint_icon_select"
-    private val FINGERPRINT_CUSTOM_ICON_ENABLE = "custom_fingerprint_icon_enable"
-    private val UFPSIMAGE_FILE_NAME = "ufpsImage"
-
-    companion object {
-        @DrawableRes
-        val ICON_RES = R.drawable.ic_settings_fingerprint
-        @XmlRes
-        val XML_RES = R.xml.fingerprint_preferences
-
-        fun isEnabled(context: Context) : Boolean {
-            return context.resources.getBoolean(R.bool.config_has_udfps)
-        }
-    }
-
-    class PickSinglePhotoContract : ActivityResultContract<Void?, Uri?>() {
-        override fun createIntent(context: Context, input: Void?): Intent {
-            return Intent(Intent(MediaStore.ACTION_PICK_IMAGES)).apply { type = "image/*" }
-        }
-
-        override fun parseResult(resultCode: Int, intent: Intent?): Uri? {
-            return intent.takeIf { resultCode == Activity.RESULT_OK }?.data
-        }
-    }
-
-    var pickImage = registerForActivityResult<String, Uri>(
-        ActivityResultContracts.GetContent()
-    ) { uri: Uri? ->
-        if (uri != null) {
-            try {
-                requireContext().contentResolver.openInputStream(uri).use { inputStream ->
-                    val bitmap = BitmapFactory.decodeStream(inputStream)
-                    systemUIProxy?.setUfpsImageBitmap(bitmap)
-                    savePickerIcon(bitmap)
-                }
-
-                Settings.System.putString(
-                    requireContext().contentResolver,
-                    OmniSettings.OMNI_CUSTOM_FP_ICON_UPDATE,
-                    System.currentTimeMillis().toString()
-                )
-            } catch (e: Exception) {
-                Log.d(TAG, "pickImage", e);
-            }
-        }
-    }
-
-    private val mImagePermissions =
-        registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) {
-            pickImage.launch("image/*")
-        }
-
-    private val mSystemUIProxyService: ServiceConnection = object : ServiceConnection {
-        override fun onServiceConnected(name: ComponentName, service: IBinder) {
-            Log.d(
-                TAG,
-                "onServiceConnected $name $service"
-            )
-            systemUIProxy = IOmniSystemUiProxy.Stub.asInterface(service)
-        }
-
-        override fun onServiceDisconnected(name: ComponentName) {
-            Log.d(TAG, "onServiceDisconnected $name")
-        }
-    }
-
-    private var mSystemUIProxyBound = false
-    private var systemUIProxy: IOmniSystemUiProxy? = null
-    private var mFilePicker: Preference? = null
-    private var mEnableCustom: SwitchPreference? = null
-
-
-    private fun bindSystemUIProxyService() {
-        if (!mSystemUIProxyBound) {
-            Log.d(TAG, "bindSystemUIProxyService")
-            val serviceIntent = Intent("android.intent.action.OMNI_SYSTEMUI_SERVICE")
-                .setPackage("com.android.systemui")
-            try {
-                mSystemUIProxyBound = requireActivity().bindService(
-                    serviceIntent,
-                    mSystemUIProxyService,
-                    Context.BIND_AUTO_CREATE
-                )
-            } catch (e: SecurityException) {
-                Log.e(
-                    TAG,
-                    "Unable to bind because of security error",
-                    e
-                )
-            }
-        }
-    }
-
-    private fun unbindSystemUIProxyService() {
-        if (mSystemUIProxyBound) {
-            Log.d(TAG, "unbindSystemUIProxyService")
-            requireActivity().unbindService(mSystemUIProxyService)
-            mSystemUIProxyBound = false
-        }
-    }
-
-    override fun getFragmentTitle(): String {
-        return getString(R.string.fprint_title)
-    }
-
-    override fun getFragmentSummary(): String {
-        return getString(R.string.fprint_summary)
-    }
-
-    override fun getFragmentIcon(): Int {
-        return ICON_RES
-    }
-
-    override fun onDestroy() {
-        super.onDestroy()
-        unbindSystemUIProxyService()
-    }
-
-    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
-        setPreferencesFromResource(XML_RES, rootKey)
-
-        mEnableCustom = findPreference<SwitchPreference>(FINGERPRINT_CUSTOM_ICON_ENABLE)
-        mEnableCustom?.let {
-            it.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue ->
-                if (newValue as Boolean) {
-                    if (getCustomImagePath().exists()) {
-                        enablePickerIcon()
-                    }
-                } else {
-                    systemUIProxy?.resetUfpsImage()
-                }
-                true
-            }
-        }
-        mFilePicker = findPreference(FINGERPRINT_CUSTOM_ICON_SELECT)
-        mFilePicker?.let {
-            bindSystemUIProxyService()
-
-            if (getCustomImagePath().exists()) {
-                setPickerIcon()
-            }
-
-            it.onPreferenceClickListener = Preference.OnPreferenceClickListener {
-                mImagePermissions.launch(arrayOf(READ_MEDIA_IMAGES, READ_MEDIA_VISUAL_USER_SELECTED))
-                true
-            }
-        }
-    }
-
-    private fun getCustomImagePath(): File {
-        return File(requireContext().filesDir, UFPSIMAGE_FILE_NAME)
-    }
-
-    private fun setPickerIcon() {
-        try {
-            val parcelFileDescriptor = requireContext().contentResolver.openFileDescriptor(
-                Uri.fromFile(getCustomImagePath()),
-                "r"
-            )
-            parcelFileDescriptor?.let { it ->
-                val bitmap = BitmapFactory.decodeFileDescriptor(it.fileDescriptor)
-                it.close()
-                val d = BitmapDrawable(resources, bitmap)
-                mFilePicker?.icon = d
-            }
-        } catch (e: Exception) {
-            Log.e(
-                TAG,
-                "setPickerIcon",
-                e
-            )
-        }
-    }
-
-    private fun enablePickerIcon() {
-        try {
-            val parcelFileDescriptor = requireContext().contentResolver.openFileDescriptor(
-                Uri.fromFile(getCustomImagePath()),
-                "r"
-            )
-            parcelFileDescriptor?.let { it ->
-                val bitmap = BitmapFactory.decodeFileDescriptor(it.fileDescriptor)
-                it.close()
-                systemUIProxy?.setUfpsImageBitmap(bitmap)
-            }
-        } catch (e: Exception) {
-            Log.e(
-                TAG,
-                "setPickerIcon",
-                e
-            )
-        }
-    }
-
-    private fun savePickerIcon(bitmap: Bitmap) {
-        try {
-            val fos = FileOutputStream(getCustomImagePath())
-            bitmap.compress(Bitmap.CompressFormat.PNG, 90, fos)
-            fos.close()
-            val d = BitmapDrawable(resources, bitmap)
-            mFilePicker?.icon = d
-        } catch (e: Exception) {
-            Log.e(
-                TAG,
-                "savePickerIcon",
-                e
-            )
-        }
-    }
-
-    private fun deletePickerIcon() {
-        if (getCustomImagePath().exists()) {
-            getCustomImagePath().delete()
-        }
-    }
-}
\ 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 909cbb2..7fe45c1 100644
--- a/app/src/main/java/org/omnirom/control/GridViewFragment.kt
+++ b/app/src/main/java/org/omnirom/control/GridViewFragment.kt
@@ -141,7 +141,7 @@
                 )
             )
         }
-        if (resources.getBoolean(R.bool.config_has_udfps)) {
+        /*if (resources.getBoolean(R.bool.config_has_udfps)) {
             gridItems.add(
                 FragmentGridItem(
                     R.string.fprint_title,
@@ -150,7 +150,7 @@
                     FingerprintSettingsFragment()
                 )
             )
-        }
+        }*/
         gridItems.add(
             FragmentGridItem(
                 R.string.lockscreen_item_title,
diff --git a/app/src/main/java/org/omnirom/control/search/SearchProvider.kt b/app/src/main/java/org/omnirom/control/search/SearchProvider.kt
index 09bfbad..3e641e0 100644
--- a/app/src/main/java/org/omnirom/control/search/SearchProvider.kt
+++ b/app/src/main/java/org/omnirom/control/search/SearchProvider.kt
@@ -26,7 +26,6 @@
 import org.omnirom.control.BatteryLightSettingsFragment
 import org.omnirom.control.ButtonSettingsFragment
 import org.omnirom.control.DialerSettingsFragment
-import org.omnirom.control.FingerprintSettingsFragment
 import org.omnirom.control.LockscreenSettingsFragment
 import org.omnirom.control.MoreSettingsFragment
 import org.omnirom.control.QSSettingsFragment
@@ -99,15 +98,6 @@
 
         searchItemList.add(
             SearchItem(
-                FingerprintSettingsFragment.XML_RES,
-                FingerprintSettingsFragment().javaClass.canonicalName!!,
-                FingerprintSettingsFragment.ICON_RES,
-                FingerprintSettingsFragment::isEnabled
-            )
-        )
-
-        searchItemList.add(
-            SearchItem(
                 DialerSettingsFragment.XML_RES,
                 DialerSettingsFragment().javaClass.canonicalName!!,
                 DialerSettingsFragment.ICON_RES,
