diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/LogDao.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/LogDao.kt
index 5e6bfb782..ae7e5d6b9 100644
--- a/app/src/main/java/com/topjohnwu/magisk/data/database/LogDao.kt
+++ b/app/src/main/java/com/topjohnwu/magisk/data/database/LogDao.kt
@@ -1,6 +1,6 @@
 package com.topjohnwu.magisk.data.database
 
-import com.topjohnwu.magisk.data.database.base.*
+import com.topjohnwu.magisk.data.database.magiskdb.*
 import com.topjohnwu.magisk.model.entity.MagiskLog
 import com.topjohnwu.magisk.model.entity.toLog
 import com.topjohnwu.magisk.model.entity.toMap
@@ -8,7 +8,7 @@ import java.util.concurrent.TimeUnit
 
 class LogDao : BaseDao() {
 
-    override val table = DatabaseDefinition.Table.LOG
+    override val table = Table.LOG
 
     fun deleteOutdated(
         suTimeout: Long = TimeUnit.DAYS.toMillis(14)
@@ -18,7 +18,7 @@ class LogDao : BaseDao() {
         }
     }.ignoreElement()
 
-    fun deleteAll() = query<Delete> {}.ignoreElement()
+    fun deleteAll() = query<Delete>().ignoreElement()
 
     fun fetchAll() = query<Select> {
         orderBy("time", Order.DESC)
@@ -30,4 +30,4 @@ class LogDao : BaseDao() {
         values(log.toMap())
     }.ignoreElement()
 
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/PolicyDao.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/PolicyDao.kt
index 3e4d0464f..ff73b6cb7 100644
--- a/app/src/main/java/com/topjohnwu/magisk/data/database/PolicyDao.kt
+++ b/app/src/main/java/com/topjohnwu/magisk/data/database/PolicyDao.kt
@@ -3,7 +3,10 @@ package com.topjohnwu.magisk.data.database
 import android.content.Context
 import android.content.pm.PackageManager
 import com.topjohnwu.magisk.Const
-import com.topjohnwu.magisk.data.database.base.*
+import com.topjohnwu.magisk.data.database.magiskdb.Delete
+import com.topjohnwu.magisk.data.database.magiskdb.BaseDao
+import com.topjohnwu.magisk.data.database.magiskdb.Replace
+import com.topjohnwu.magisk.data.database.magiskdb.Select
 import com.topjohnwu.magisk.extensions.now
 import com.topjohnwu.magisk.model.entity.MagiskPolicy
 import com.topjohnwu.magisk.model.entity.toMap
@@ -16,7 +19,7 @@ class PolicyDao(
     private val context: Context
 ) : BaseDao() {
 
-    override val table: String = DatabaseDefinition.Table.POLICY
+    override val table: String = Table.POLICY
 
     fun deleteOutdated(
         nowSeconds: Long = TimeUnit.MILLISECONDS.toSeconds(now)
@@ -72,4 +75,4 @@ class PolicyDao(
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/SettingsDao.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/SettingsDao.kt
index a394dd5e9..c2b4a2701 100644
--- a/app/src/main/java/com/topjohnwu/magisk/data/database/SettingsDao.kt
+++ b/app/src/main/java/com/topjohnwu/magisk/data/database/SettingsDao.kt
@@ -1,10 +1,13 @@
 package com.topjohnwu.magisk.data.database
 
-import com.topjohnwu.magisk.data.database.base.*
+import com.topjohnwu.magisk.data.database.magiskdb.Delete
+import com.topjohnwu.magisk.data.database.magiskdb.BaseDao
+import com.topjohnwu.magisk.data.database.magiskdb.Replace
+import com.topjohnwu.magisk.data.database.magiskdb.Select
 
 class SettingsDao : BaseDao() {
 
-    override val table = DatabaseDefinition.Table.SETTINGS
+    override val table = Table.SETTINGS
 
     fun delete(key: String) = query<Delete> {
         condition { equals("key", key) }
@@ -19,4 +22,4 @@ class SettingsDao : BaseDao() {
         condition { equals("key", key) }
     }.map { it.firstOrNull()?.values?.firstOrNull()?.toIntOrNull() ?: default }
 
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/StringDao.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/StringDao.kt
index 6d767ac51..92b8c458b 100644
--- a/app/src/main/java/com/topjohnwu/magisk/data/database/StringDao.kt
+++ b/app/src/main/java/com/topjohnwu/magisk/data/database/StringDao.kt
@@ -1,10 +1,13 @@
 package com.topjohnwu.magisk.data.database
 
-import com.topjohnwu.magisk.data.database.base.*
+import com.topjohnwu.magisk.data.database.magiskdb.Delete
+import com.topjohnwu.magisk.data.database.magiskdb.BaseDao
+import com.topjohnwu.magisk.data.database.magiskdb.Replace
+import com.topjohnwu.magisk.data.database.magiskdb.Select
 
 class StringDao : BaseDao() {
 
-    override val table = DatabaseDefinition.Table.STRINGS
+    override val table = Table.STRINGS
 
     fun delete(key: String) = query<Delete> {
         condition { equals("key", key) }
@@ -19,4 +22,4 @@ class StringDao : BaseDao() {
         condition { equals("key", key) }
     }.map { it.firstOrNull()?.values?.firstOrNull() ?: default }
 
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/base/BaseDao.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/base/BaseDao.kt
deleted file mode 100644
index 3fe8f0bdd..000000000
--- a/app/src/main/java/com/topjohnwu/magisk/data/database/base/BaseDao.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.topjohnwu.magisk.data.database.base
-
-abstract class BaseDao {
-
-    abstract val table: String
-
-    inline fun <reified Builder : MagiskQueryBuilder> query(builder: Builder.() -> Unit) =
-        Builder::class.java.newInstance()
-            .apply { table = this@BaseDao.table }
-            .apply(builder)
-            .toString()
-            .let { MagiskQuery(it) }
-            .query()
-
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/base/DatabaseDefinition.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/base/DatabaseDefinition.kt
deleted file mode 100644
index 2a5c364af..000000000
--- a/app/src/main/java/com/topjohnwu/magisk/data/database/base/DatabaseDefinition.kt
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.topjohnwu.magisk.data.database.base
-
-import androidx.annotation.AnyThread
-import com.topjohnwu.superuser.Shell
-import io.reactivex.Single
-
-object DatabaseDefinition {
-
-    object Table {
-        const val POLICY = "policies"
-        const val LOG = "logs"
-        const val SETTINGS = "settings"
-        const val STRINGS = "strings"
-    }
-
-}
-
-@AnyThread
-fun MagiskQuery.query() = query.su()
-
-fun String.suRaw() = Single.fromCallable { Shell.su(this).exec().out }
-fun String.su() = suRaw().map { it.toMap() }
-
-fun List<String>.toMap() = map { it.split(Regex("\\|")) }
-    .map { it.toMapInternal() }
-
-private fun List<String>.toMapInternal() = map { it.split("=", limit = 2) }
-    .filter { it.size == 2 }
-    .map { Pair(it[0], it[1]) }
-    .toMap()
\ No newline at end of file
diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/base/MagiskQuery.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/base/MagiskQuery.kt
deleted file mode 100644
index 9407c2f36..000000000
--- a/app/src/main/java/com/topjohnwu/magisk/data/database/base/MagiskQuery.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.topjohnwu.magisk.data.database.base
-
-inline class MagiskQuery(private val _query: String) {
-    val query get() = "magisk --sqlite '$_query'"
-}
\ No newline at end of file
diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/magiskdb/BaseDao.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/magiskdb/BaseDao.kt
new file mode 100644
index 000000000..93f6c7aa1
--- /dev/null
+++ b/app/src/main/java/com/topjohnwu/magisk/data/database/magiskdb/BaseDao.kt
@@ -0,0 +1,44 @@
+package com.topjohnwu.magisk.data.database.magiskdb
+
+import androidx.annotation.StringDef
+import com.topjohnwu.superuser.Shell
+import io.reactivex.Single
+
+abstract class BaseDao {
+
+    object Table {
+        const val POLICY = "policies"
+        const val LOG = "logs"
+        const val SETTINGS = "settings"
+        const val STRINGS = "strings"
+    }
+
+    @StringDef(Table.POLICY, Table.LOG, Table.SETTINGS, Table.STRINGS)
+    @Retention(AnnotationRetention.SOURCE)
+    annotation class TableStrict
+
+    @TableStrict
+    abstract val table: String
+
+    inline fun <reified Builder : Query.Builder> query(builder: Builder.() -> Unit = {}) =
+        Builder::class.java.newInstance()
+            .apply { table = this@BaseDao.table }
+            .apply(builder)
+            .toString()
+            .let { Query(it) }
+            .query()
+
+}
+
+fun Query.query() = query.su()
+
+private fun String.suRaw() = Single.fromCallable { Shell.su(this).exec().out }
+private fun String.su() = suRaw().map { it.toMap() }
+
+private fun List<String>.toMap() = map { it.split(Regex("\\|")) }
+    .map { it.toMapInternal() }
+
+private fun List<String>.toMapInternal() = map { it.split("=", limit = 2) }
+    .filter { it.size == 2 }
+    .map { Pair(it[0], it[1]) }
+    .toMap()
diff --git a/app/src/main/java/com/topjohnwu/magisk/data/database/base/MagiskQueryBuilder.kt b/app/src/main/java/com/topjohnwu/magisk/data/database/magiskdb/Query.kt
similarity index 76%
rename from app/src/main/java/com/topjohnwu/magisk/data/database/base/MagiskQueryBuilder.kt
rename to app/src/main/java/com/topjohnwu/magisk/data/database/magiskdb/Query.kt
index 01777d0ad..d34542296 100644
--- a/app/src/main/java/com/topjohnwu/magisk/data/database/base/MagiskQueryBuilder.kt
+++ b/app/src/main/java/com/topjohnwu/magisk/data/database/magiskdb/Query.kt
@@ -1,27 +1,17 @@
-package com.topjohnwu.magisk.data.database.base
+package com.topjohnwu.magisk.data.database.magiskdb
 
 import androidx.annotation.StringDef
-import com.topjohnwu.magisk.data.database.base.Order.Companion.ASC
-import com.topjohnwu.magisk.data.database.base.Order.Companion.DESC
 
-interface MagiskQueryBuilder {
+class Query(private val _query: String) {
+    val query get() = "magisk --sqlite '$_query'"
 
-    val requestType: String
-    var table: String
-
-    companion object {
-        inline operator fun <reified Builder : MagiskQueryBuilder> invoke(builder: Builder.() -> Unit): MagiskQuery =
-            Builder::class.java.newInstance()
-                .apply(builder)
-                .toString()
-                .let {
-                    MagiskQuery(it)
-                }
+    interface Builder {
+        val requestType: String
+        var table: String
     }
-
 }
 
-class Delete : MagiskQueryBuilder {
+class Delete : Query.Builder {
     override val requestType: String = "DELETE FROM"
     override var table = ""
 
@@ -36,7 +26,7 @@ class Delete : MagiskQueryBuilder {
     }
 }
 
-class Select : MagiskQueryBuilder {
+class Select : Query.Builder {
     override val requestType: String get() = "SELECT $fields FROM"
     override lateinit var table: String
 
@@ -69,7 +59,7 @@ class Replace : Insert() {
     override val requestType: String = "REPLACE INTO"
 }
 
-open class Insert : MagiskQueryBuilder {
+open class Insert : Query.Builder {
     override val requestType: String = "INSERT INTO"
     override lateinit var table: String
 
@@ -137,19 +127,11 @@ class Condition {
     }
 }
 
-class Order {
-
-    @set:OrderStrict
-    var order = DESC
-    var field = ""
-
-    companion object {
-        const val ASC = "ASC"
-        const val DESC = "DESC"
-    }
-
+object Order {
+    const val ASC = "ASC"
+    const val DESC = "DESC"
 }
 
-@StringDef(ASC, DESC)
+@StringDef(Order.ASC, Order.DESC)
 @Retention(AnnotationRetention.SOURCE)
-annotation class OrderStrict
\ No newline at end of file
+annotation class OrderStrict
diff --git a/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt b/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt
index 733eb85b9..b39f52dee 100644
--- a/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt
+++ b/app/src/main/java/com/topjohnwu/magisk/data/repository/LogRepository.kt
@@ -2,11 +2,11 @@ package com.topjohnwu.magisk.data.repository
 
 import com.topjohnwu.magisk.Const
 import com.topjohnwu.magisk.data.database.LogDao
-import com.topjohnwu.magisk.data.database.base.suRaw
 import com.topjohnwu.magisk.extensions.toSingle
 import com.topjohnwu.magisk.model.entity.MagiskLog
 import com.topjohnwu.magisk.model.entity.WrappedMagiskLog
 import com.topjohnwu.superuser.Shell
+import io.reactivex.Single
 import java.util.concurrent.TimeUnit
 
 
@@ -18,8 +18,9 @@ class LogRepository(
         .map { it.sortByDescending { it.date.time }; it }
         .map { it.wrap() }
 
-    fun fetchMagiskLogs() = "tail -n 5000 ${Const.MAGISK_LOG}".suRaw()
-        .filter { it.isNotEmpty() }
+    fun fetchMagiskLogs() = Single.fromCallable {
+        Shell.su("tail -n 5000 ${Const.MAGISK_LOG}").exec().out
+    }.filter { it.isNotEmpty() }
 
     fun clearLogs() = logDao.deleteAll()
     fun clearOutdated() = logDao.deleteOutdated()
@@ -37,4 +38,4 @@ class LogRepository(
     }
 
 
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/com/topjohnwu/magisk/data/repository/MagiskRepository.kt b/app/src/main/java/com/topjohnwu/magisk/data/repository/MagiskRepository.kt
index b9a4ae98b..eb1d3c5d7 100644
--- a/app/src/main/java/com/topjohnwu/magisk/data/repository/MagiskRepository.kt
+++ b/app/src/main/java/com/topjohnwu/magisk/data/repository/MagiskRepository.kt
@@ -3,7 +3,6 @@ package com.topjohnwu.magisk.data.repository
 import android.content.pm.PackageManager
 import com.topjohnwu.magisk.Config
 import com.topjohnwu.magisk.Info
-import com.topjohnwu.magisk.data.database.base.su
 import com.topjohnwu.magisk.data.network.GithubRawServices
 import com.topjohnwu.magisk.extensions.getLabel
 import com.topjohnwu.magisk.extensions.packageName
@@ -57,7 +56,7 @@ class MagiskRepository(
         .toList()
 
     fun toggleHide(isEnabled: Boolean, packageName: String, process: String) =
-        "magiskhide --%s %s %s".format(isEnabled.state, packageName, process).su().ignoreElement()
+        Shell.su("magiskhide --${isEnabled.state} $packageName $process").submit()
 
     private val Boolean.state get() = if (this) "add" else "rm"
 
diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt
index 8e09a010f..2640abcad 100644
--- a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt
+++ b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt
@@ -90,9 +90,7 @@ class HideViewModel(
         .toList()
         .map { it to items.calculateDiff(it) }
 
-    private fun toggleItem(item: HideProcessRvItem) = magiskRepo
-        .toggleHide(item.isHidden.value, item.packageName, item.process)
-        .subscribeK()
-        .add()
+    private fun toggleItem(item: HideProcessRvItem) =
+        magiskRepo.toggleHide(item.isHidden.value, item.packageName, item.process)
 
-}
\ No newline at end of file
+}