diff --git a/.clj-kondo/config.edn b/.clj-kondo/config.edn
index 9b658c45e1eb8d4058a3e32de3ac4457ef3aa3b1..7b66d57d88b4b95b513da252cebe928b3ca19900 100644
--- a/.clj-kondo/config.edn
+++ b/.clj-kondo/config.edn
@@ -14,10 +14,60 @@
                                          (clojure.core.logic/fresh)
                                          (clojure.core.logic/matcha)
                                          (clojure.core.logic/run)]}
-           ;; TODO: clj-kondo should have a way to disable this in certain macro calls like
-           ;; metabase.mbql.util.match/replace
            :unexpected-recur {:level :off}
-           :unused-referred-var {:exclude {compojure.core [GET DELETE POST PUT]}}}
+           :unused-referred-var {:exclude {compojure.core [GET DELETE POST PUT]}}
+           :deprecated-var {:exclude {metabase.query-processor.util/normalize-token
+                                      {:namespaces ["metabase.*"]}
+                                      metabase.driver/supports?
+                                      {:namespaces ["metabase.*"]}
+                                      metabase.driver/current-db-time
+                                      {:namespaces ["metabase.*"]}
+                                      metabase.driver.common/current-db-time-native-query
+                                      {:namespaces ["metabase\\.driver.*"]}
+                                      metabase.driver.common/current-db-time-date-formatters
+                                      {:namespaces ["metabase\\.driver.*"]}
+                                      metabase.driver.sql-jdbc.execute.old-impl/read-column
+                                      {:namespaces ["metabase\\.driver.*"]}
+                                      metabase.driver.common/first-successful-parse
+                                      {:namespaces ["metabase\\.driver.*"]}
+                                      metabase.driver.common/ThreadSafeSimpleDateFormat
+                                      {:namespaces ["metabase\\.driver.*"]}
+                                      metabase.driver.common/create-db-time-formatters
+                                      {:namespaces ["metabase\\.driver.*"]}
+                                      metabase.driver.common/current-db-time
+                                      {:namespaces ["metabase.*"]}
+                                      metabase.driver.sql.query-processor.deprecated/*field-options*
+                                      {:namespaces ["metabase\\.driver.*"]}
+                                      metabase.driver.sql.query-processor.deprecated/*source-query*
+                                      {:namespaces ["metabase\\.driver.*"]}
+                                      metabase.driver.sql.query-processor.deprecated/field->identifier
+                                      {:namespaces ["metabase\\.driver.*"]}
+                                      metabase.driver.sql.query-processor.deprecated/field->alias
+                                      {:namespaces ["metabase\\.driver.*"]}
+                                      metabase.driver.sql.query-processor.deprecated/prefix-field-alias
+                                      {:namespaces ["metabase\\.driver.*"]}
+                                      metabase.query-processor.middleware.resolve-joins/maybe-resolve-source-table
+                                      {:namespaces ["metabase.*"]}
+                                      metabase.driver.sql-jdbc.execute.old-impl/set-timezone-sq
+                                      {:namespaces ["metabase\\.driver.*"]}
+                                      metabase.driver.sql-jdbc.execute.old-impl/set-timezone-sql
+                                      {:namespaces ["metabase\\.driver.*"]}
+                                      metabase.driver.sql.query-processor.deprecated/*table-alias*
+                                      {:namespaces ["metabase\\.driver.*"]}
+                                      metabase.public-settings.premium-features/enable-enhancements?
+                                      {:namespaces ["metabase\\.models.*"]}
+                                      metabase.driver.sql.query-processor.deprecated/escape-alias
+                                      {:namespaces ["metabase\\.driver.*"]}
+                                      metabase.driver.sql-jdbc.execute/set-time-zone-if-supported!
+                                      {:namespaces ["metabase\\.driver.*"]}
+                                      metabase.driver.sql-jdbc.sync.interface/syncable-schemas
+                                      {:namespaces ["metabase\\.driver.*"]}
+                                      metabase.query-processor/query->preprocessed
+                                      {:namespaces ["metabase.*"]}
+                                      schema.core/either
+                                      {:namespaces ["metabase.*"]}
+                                      schema.core/both
+                                      {:namespaces ["metabase.*"]}}}}
  :lint-as {metabase.api.common/let-404 clojure.core/let
            metabase.db.data-migrations/defmigration clojure.core/def
            metabase.query-processor.error-type/deferror clojure.core/def
@@ -39,7 +89,10 @@
            potemkin/defrecord+ clojure.core/defrecord
            potemkin.types/deftype+ clojure.core/deftype
            potemkin/deftype+ clojure.core/deftype
-           clojurewerkz.quartzite.jobs/defjob clojure.core/defn}
+           clojurewerkz.quartzite.jobs/defjob clojure.core/defn
+           honeysql.util/defalias clojure.core/def
+           honeysql.helpers/defhelper clj-kondo.lint-as/def-catch-all
+           clojure.core.logic/defne clj-kondo.lint-as/def-catch-all}
  :hooks   {:analyze-call {metabase.test.data/dataset        hooks.metabase.test.data/dataset
                           metabase.test/dataset             hooks.metabase.test.data/dataset
                           metabase.test.data/$ids           hooks.metabase.test.data/$ids
@@ -52,6 +105,7 @@
                           metabase.api.common/defendpoint-async hooks.metabase.api.common/defendpoint}
            :macroexpand {metabase.query-processor.streaming/streaming-response
                          metabase.query-processor.streaming/streaming-response
+                         metabase.api.common/define-routes macros.metabase.api.common/define-routes
                          toucan.models/defmodel toucan.models/defmodel
                          clojurewerkz.quartzite.jobs/build macros.quartz/build-job
                          clojurewerkz.quartzite.triggers/build macros.quartz/build-trigger
diff --git a/.clj-kondo/macros/metabase/api/common.clj b/.clj-kondo/macros/metabase/api/common.clj
new file mode 100644
index 0000000000000000000000000000000000000000..99c939def063727f0d7080dfc3c68bb7e907d351
--- /dev/null
+++ b/.clj-kondo/macros/metabase/api/common.clj
@@ -0,0 +1,5 @@
+(ns macros.metabase.api.common)
+
+(defmacro define-routes [& args]
+  `(do (def ~'routes)
+       ~@args))
diff --git a/shared/src/metabase/mbql/schema.cljc b/shared/src/metabase/mbql/schema.cljc
index 3546311b3c7256589da4e77a9a5ffe13b48f21c5..d03676d3cb675f780f68118a39ec34faa56b4e79 100644
--- a/shared/src/metabase/mbql/schema.cljc
+++ b/shared/src/metabase/mbql/schema.cljc
@@ -1,6 +1,6 @@
 (ns metabase.mbql.schema
   "Schema for validating a *normalized* MBQL query. This is also the definitive grammar for MBQL, wow!"
-  (:refer-clojure :exclude [count distinct min max + - / * and or not not-empty = < > <= >= time case concat replace])
+  (:refer-clojure :exclude [count distinct min max + - / * and or not not-empty = < > <= >= time case concat replace abs])
   #?@
    (:clj
     [(:require
diff --git a/src/metabase/api/user.clj b/src/metabase/api/user.clj
index c256024af68eefc2e362dbf83e040a87a373bb93..597dc13d90fbf0dd0464f478b4ccf0c9d8538eff 100644
--- a/src/metabase/api/user.clj
+++ b/src/metabase/api/user.clj
@@ -1,6 +1,7 @@
 (ns metabase.api.user
   "/api/user endpoints"
   (:require [cemerick.friend.credentials :as creds]
+            [clojure.string :as str]
             [compojure.core :refer [DELETE GET POST PUT]]
             [honeysql.helpers :as hh]
             [metabase.analytics.snowplow :as snowplow]
@@ -82,7 +83,7 @@
       "active"      [:= :is_active true]
       [:= :is_active true])))
 
-(defn- wildcard-query [query] (str "%" (clojure.string/lower-case query) "%"))
+(defn- wildcard-query [query] (str "%" (str/lower-case query) "%"))
 
 (defn- query-clause
   "Honeysql clause to shove into user query if there's a query"