diff --git a/e2e/test-component/scenarios/embedding-sdk/redux-provider-clash.cy.spec.tsx b/e2e/test-component/scenarios/embedding-sdk/redux-provider-clash.cy.spec.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..e5dcdcb733ab43672b803569e7e45c2b076f005a
--- /dev/null
+++ b/e2e/test-component/scenarios/embedding-sdk/redux-provider-clash.cy.spec.tsx
@@ -0,0 +1,99 @@
+import {
+  MetabaseProvider,
+  StaticDashboard,
+} from "@metabase/embedding-sdk-react";
+import { configureStore, createSlice } from "@reduxjs/toolkit";
+import { Provider, useDispatch, useSelector } from "react-redux";
+
+import { ORDERS_DASHBOARD_ID } from "e2e/support/cypress_sample_instance_data";
+import { describeEE } from "e2e/support/helpers";
+import {
+  AUTH_PROVIDER_URL,
+  METABASE_INSTANCE_URL,
+  mockAuthProviderAndJwtSignIn,
+  signInAsAdminAndEnableEmbeddingSdk,
+} from "e2e/support/helpers/component-testing-sdk";
+import { getSdkRoot } from "e2e/support/helpers/e2e-embedding-sdk-helpers";
+
+describeEE(
+  "scenarios > embedding-sdk > the redux provider context should not clash with the host app",
+  () => {
+    beforeEach(() => {
+      signInAsAdminAndEnableEmbeddingSdk();
+
+      cy.signOut();
+
+      mockAuthProviderAndJwtSignIn();
+    });
+
+    it("the host app redux logic should work normally even inside MetabaseProvider", () => {
+      cy.mount(
+        <Provider store={customerStore}>
+          <div data-testid="outside-metabase-provider">
+            <CounterButton />
+          </div>
+          <MetabaseProvider
+            authConfig={{
+              authProviderUri: AUTH_PROVIDER_URL,
+              metabaseInstanceUrl: METABASE_INSTANCE_URL,
+            }}
+          >
+            <div data-testid="inside-metabase-provider">
+              <CounterButton />
+            </div>
+            <StaticDashboard dashboardId={ORDERS_DASHBOARD_ID} withDownloads />
+          </MetabaseProvider>
+        </Provider>,
+      );
+
+      // the button should render and access the correct redux state both inside and outside the MetabaseProvider
+      cy.findByTestId("outside-metabase-provider")
+        .findByText("0")
+        .should("exist");
+      cy.findByTestId("inside-metabase-provider")
+        .findByText("0")
+        .should("exist");
+
+      // sanity check that it's actually working and actions work
+      cy.findByTestId("inside-metabase-provider").findByText("0").click();
+      cy.findByTestId("outside-metabase-provider")
+        .findByText("1")
+        .should("exist");
+      cy.findByTestId("inside-metabase-provider")
+        .findByText("1")
+        .should("exist");
+
+      // also make sure the sdk is working, most data goes through redux so if it renders
+      // it means it's working
+      getSdkRoot().findByText("Orders in a dashboard").should("exist");
+      getSdkRoot().findByText("Product ID").should("exist");
+    });
+  },
+);
+
+// sample code for customer app
+const slice = createSlice({
+  name: "counter",
+  initialState: {
+    value: 0,
+  },
+  reducers: {
+    increment: state => {
+      state.value += 1;
+    },
+  },
+});
+const { increment } = slice.actions;
+const customerStore = configureStore({
+  reducer: {
+    counter: slice.reducer,
+  },
+});
+
+const CounterButton = () => {
+  const count = useSelector(
+    (state: { counter: { value: number } }) => state.counter.value,
+  );
+  const dispatch = useDispatch();
+  return <button onClick={() => dispatch(increment())}>{count}</button>;
+};
diff --git a/enterprise/frontend/src/embedding-sdk/components/private/SdkGlobalFontsStyles.tsx b/enterprise/frontend/src/embedding-sdk/components/private/SdkGlobalFontsStyles.tsx
index 3c8f711617340bee1d126e8549f4c7f1ec4eea9a..68e8d145c7795ff538701bb11d35e5dc5a091d48 100644
--- a/enterprise/frontend/src/embedding-sdk/components/private/SdkGlobalFontsStyles.tsx
+++ b/enterprise/frontend/src/embedding-sdk/components/private/SdkGlobalFontsStyles.tsx
@@ -1,8 +1,8 @@
 import { Global, css } from "@emotion/react";
 import { useMemo } from "react";
-import { useSelector } from "react-redux";
 
 import { defaultFontFiles } from "metabase/css/core/fonts.styled";
+import { useSelector } from "metabase/lib/redux";
 import { getFontFiles } from "metabase/styled-components/selectors";
 
 /**
diff --git a/enterprise/frontend/src/embedding-sdk/components/public/InteractiveDashboard/ConnectedDashboard.tsx b/enterprise/frontend/src/embedding-sdk/components/public/InteractiveDashboard/ConnectedDashboard.tsx
index c34f45a418fc5151463aad56050730f6e097b1a5..2d626e734fb942fe31045e5c8d226651f5bb8afe 100644
--- a/enterprise/frontend/src/embedding-sdk/components/public/InteractiveDashboard/ConnectedDashboard.tsx
+++ b/enterprise/frontend/src/embedding-sdk/components/public/InteractiveDashboard/ConnectedDashboard.tsx
@@ -1,6 +1,6 @@
 import type { Query } from "history";
 import type { ComponentType, FC } from "react";
-import { type ConnectedProps, connect } from "react-redux";
+import type { ConnectedProps } from "react-redux";
 import _ from "underscore";
 
 import type { SdkPluginsConfig } from "embedding-sdk";
@@ -39,6 +39,7 @@ import type {
   DashboardRefreshPeriodControls,
 } from "metabase/dashboard/types";
 import { useValidatedEntityId } from "metabase/lib/entity-id/hooks/use-validated-entity-id";
+import { connect } from "metabase/lib/redux";
 import type { PublicOrEmbeddedDashboardEventHandlersProps } from "metabase/public/containers/PublicOrEmbeddedDashboard/types";
 import { useDashboardLoadHandlers } from "metabase/public/containers/PublicOrEmbeddedDashboard/use-dashboard-load-handlers";
 import { closeNavbar, setErrorPage } from "metabase/redux/app";
diff --git a/enterprise/frontend/src/embedding-sdk/components/public/MetabaseProvider.tsx b/enterprise/frontend/src/embedding-sdk/components/public/MetabaseProvider.tsx
index 7aebcf0a27223f899e512f787146c50fd5426ef1..90d4eee2684b2e8026ac95b412d5bebcf2c9cd4b 100644
--- a/enterprise/frontend/src/embedding-sdk/components/public/MetabaseProvider.tsx
+++ b/enterprise/frontend/src/embedding-sdk/components/public/MetabaseProvider.tsx
@@ -1,7 +1,6 @@
 import { Global } from "@emotion/react";
 import type { Action, Store } from "@reduxjs/toolkit";
 import { type JSX, type ReactNode, memo, useEffect, useRef } from "react";
-import { Provider } from "react-redux";
 
 import { SdkThemeProvider } from "embedding-sdk/components/private/SdkThemeProvider";
 import { EMBEDDING_SDK_ROOT_ELEMENT_ID } from "embedding-sdk/config";
@@ -22,6 +21,7 @@ import type {
 } from "embedding-sdk/store/types";
 import type { MetabaseAuthConfig } from "embedding-sdk/types";
 import type { MetabaseTheme } from "embedding-sdk/types/theme";
+import { MetabaseReduxProvider } from "metabase/lib/redux";
 import { LocaleProvider } from "metabase/public/LocaleProvider";
 import { setOptions } from "metabase/redux/embed";
 import { EmotionCacheProvider } from "metabase/styled-components/components/EmotionCacheProvider";
@@ -141,8 +141,8 @@ export const MetabaseProvider = memo(function MetabaseProvider(
   }
 
   return (
-    <Provider store={storeRef.current}>
+    <MetabaseReduxProvider store={storeRef.current}>
       <MetabaseProviderInternal store={storeRef.current} {...props} />
-    </Provider>
+    </MetabaseReduxProvider>
   );
 });
diff --git a/enterprise/frontend/src/embedding-sdk/hooks/private/use-sdk-usage-problem.ts b/enterprise/frontend/src/embedding-sdk/hooks/private/use-sdk-usage-problem.ts
index 86c575b7d24b23519c7a263958b5c98df4cced53..eda6345f66d99067e26d02b16b1c796deab1ea78 100644
--- a/enterprise/frontend/src/embedding-sdk/hooks/private/use-sdk-usage-problem.ts
+++ b/enterprise/frontend/src/embedding-sdk/hooks/private/use-sdk-usage-problem.ts
@@ -1,12 +1,11 @@
 import { useEffect, useMemo, useRef } from "react";
-import { useDispatch } from "react-redux";
 
 import type { MetabaseAuthConfig } from "embedding-sdk";
 import { printUsageProblemToConsole } from "embedding-sdk/lib/print-usage-problem";
 import { getSdkUsageProblem } from "embedding-sdk/lib/usage-problem";
+import { useSdkDispatch, useSdkSelector } from "embedding-sdk/store";
 import { setUsageProblem } from "embedding-sdk/store/reducer";
 import { useSetting } from "metabase/common/hooks";
-import { useSelector } from "metabase/lib/redux";
 import { getTokenFeature } from "metabase/setup/selectors";
 
 export function useSdkUsageProblem({
@@ -18,7 +17,7 @@ export function useSdkUsageProblem({
 }) {
   const hasLoggedRef = useRef(false);
 
-  const dispatch = useDispatch();
+  const dispatch = useSdkDispatch();
 
   // When the setting haven't been loaded or failed to query, we assume that the
   // feature is _enabled_ first. Otherwise, when a user's instance is temporarily down,
@@ -26,7 +25,7 @@ export function useSdkUsageProblem({
   // TODO: replace this with "enable-embedding-sdk" once the settings PR landed.
   const isEnabled = useSetting("enable-embedding") ?? true;
 
-  const hasTokenFeature = useSelector(state => {
+  const hasTokenFeature = useSdkSelector(state => {
     // We also assume that the feature is enabled if the token-features are missing.
     // Same reason as above.
     if (!state.settings.values?.["token-features"]) {
diff --git a/enterprise/frontend/src/embedding-sdk/hooks/public/use-current-user.ts b/enterprise/frontend/src/embedding-sdk/hooks/public/use-current-user.ts
index 5e63607da5fee60fe5943804b8e9b22cc518cf2a..3fd865720d371f3833e97eeca0088929b6d5ccd1 100644
--- a/enterprise/frontend/src/embedding-sdk/hooks/public/use-current-user.ts
+++ b/enterprise/frontend/src/embedding-sdk/hooks/public/use-current-user.ts
@@ -1,5 +1,4 @@
-import { useSelector } from "react-redux";
-
+import { useSelector } from "metabase/lib/redux";
 import { getUser } from "metabase/selectors/user";
 
 export const useCurrentUser = () => useSelector(getUser);
diff --git a/enterprise/frontend/src/embedding-sdk/store/index.ts b/enterprise/frontend/src/embedding-sdk/store/index.ts
index bce7dffdc278237d7a11fa05b65bb2366692df26..cabf7521ad417adcc3eaf4c039c30dfc5c369f59 100644
--- a/enterprise/frontend/src/embedding-sdk/store/index.ts
+++ b/enterprise/frontend/src/embedding-sdk/store/index.ts
@@ -1,12 +1,12 @@
-import type {
-  AnyAction,
-  Reducer,
-  Store,
-  ThunkDispatch,
-} from "@reduxjs/toolkit";
+/* eslint-disable no-restricted-imports */
+import type { AnyAction, Reducer, Store } from "@reduxjs/toolkit";
 import { useContext } from "react";
-import { ReactReduxContext, useDispatch, useStore } from "react-redux";
 
+import {
+  MetabaseReduxContext,
+  useDispatch,
+  useStore,
+} from "metabase/lib/redux";
 import { mainReducers } from "metabase/reducers-main";
 import { getStore } from "metabase/store";
 
@@ -29,11 +29,7 @@ export const getSdkStore = () =>
     },
   }) as unknown as Store<SdkStoreState, AnyAction>;
 
-export const useSdkDispatch: () => ThunkDispatch<
-  SdkStoreState,
-  void,
-  AnyAction
-> = () => {
+export const useSdkDispatch = () => {
   useCheckSdkReduxContext();
 
   return useDispatch();
@@ -46,7 +42,7 @@ export const useSdkStore = () => {
 };
 
 const useCheckSdkReduxContext = () => {
-  const context = useContext(ReactReduxContext);
+  const context = useContext(MetabaseReduxContext);
 
   if (!context) {
     console.warn(
diff --git a/enterprise/frontend/src/embedding-sdk/store/use-sdk-selector.ts b/enterprise/frontend/src/embedding-sdk/store/use-sdk-selector.ts
index 74f03d0f7f7821e518042522f599111c0835ee84..3bdb1df10a8d54082804ff936b9ed0e7d3bd5ca2 100644
--- a/enterprise/frontend/src/embedding-sdk/store/use-sdk-selector.ts
+++ b/enterprise/frontend/src/embedding-sdk/store/use-sdk-selector.ts
@@ -1,24 +1,26 @@
 import { useContext } from "react";
-import {
-  ReactReduxContext,
-  type TypedUseSelectorHook,
-  useSelector,
-} from "react-redux";
+import type { TypedUseSelectorHook } from "react-redux";
+import { createSelectorHook } from "react-redux";
 
 import type { SdkStoreState } from "embedding-sdk/store/types";
+import { MetabaseReduxContext } from "metabase/lib/redux";
 
 // eslint-disable-next-line no-literal-metabase-strings -- this string only shows in the console.
 export const USE_OUTSIDE_OF_CONTEXT_MESSAGE = `Hooks from the Metabase Embedding SDK must be used within a component wrapped by the MetabaseProvider`;
 
+const _useSdkSelector: TypedUseSelectorHook<SdkStoreState> =
+  createSelectorHook(MetabaseReduxContext);
+
 export const useSdkSelector: TypedUseSelectorHook<SdkStoreState> = (
   selector,
   options,
 ) => {
-  const context = useContext(ReactReduxContext);
+  const context = useContext(MetabaseReduxContext);
 
   if (!context) {
     throw new Error(USE_OUTSIDE_OF_CONTEXT_MESSAGE);
   }
 
-  return useSelector(selector, options);
+  // @ts-expect-error -- weird error on the options type
+  return _useSdkSelector(selector, options);
 };
diff --git a/enterprise/frontend/src/metabase-enterprise/advanced_permissions/components/ImpersonationModal/ImpersonationModal.tsx b/enterprise/frontend/src/metabase-enterprise/advanced_permissions/components/ImpersonationModal/ImpersonationModal.tsx
index 393637073cb778a9bafe2c29c940cd73b363a7ac..06b1b92f08f565ce8d30c74b00b1de025fcbb371 100644
--- a/enterprise/frontend/src/metabase-enterprise/advanced_permissions/components/ImpersonationModal/ImpersonationModal.tsx
+++ b/enterprise/frontend/src/metabase-enterprise/advanced_permissions/components/ImpersonationModal/ImpersonationModal.tsx
@@ -1,5 +1,4 @@
 import { useCallback } from "react";
-import { useSelector } from "react-redux";
 import { withRouter } from "react-router";
 import { push } from "react-router-redux";
 import { useAsyncFn, useMount } from "react-use";
@@ -17,11 +16,11 @@ import { useDispatch } from "metabase/lib/redux";
 import { updateImpersonation } from "metabase-enterprise/advanced_permissions/reducer";
 import { getImpersonation } from "metabase-enterprise/advanced_permissions/selectors";
 import type {
-  AdvancedPermissionsStoreState,
   ImpersonationModalParams,
   ImpersonationParams,
 } from "metabase-enterprise/advanced_permissions/types";
 import { getImpersonatedDatabaseId } from "metabase-enterprise/advanced_permissions/utils";
+import { useEnterpriseSelector } from "metabase-enterprise/redux";
 import { ImpersonationApi } from "metabase-enterprise/services";
 import { fetchUserAttributes } from "metabase-enterprise/shared/reducer";
 import { getUserAttributes } from "metabase-enterprise/shared/selectors";
@@ -76,11 +75,10 @@ const _ImpersonationModal = ({ route, params }: ImpersonationModalProps) => {
     id: databaseId,
   });
 
-  const attributes = useSelector(getUserAttributes);
-  const draftImpersonation = useSelector<
-    AdvancedPermissionsStoreState,
-    Impersonation | undefined
-  >(getImpersonation(databaseId, groupId));
+  const attributes = useEnterpriseSelector(getUserAttributes);
+  const draftImpersonation = useEnterpriseSelector(
+    getImpersonation(databaseId, groupId),
+  );
 
   const selectedAttribute =
     draftImpersonation?.attribute ?? impersonation?.attribute;
diff --git a/enterprise/frontend/src/metabase-enterprise/application_permissions/pages/ApplicationPermissionsPage/ApplicationPermissionsPage.tsx b/enterprise/frontend/src/metabase-enterprise/application_permissions/pages/ApplicationPermissionsPage/ApplicationPermissionsPage.tsx
index ebff86fbf8d0c2b8f7ad89f5d6ff4304c10fac26..0bd543349c23c2175674449b4cc3c6efce5aa279 100644
--- a/enterprise/frontend/src/metabase-enterprise/application_permissions/pages/ApplicationPermissionsPage/ApplicationPermissionsPage.tsx
+++ b/enterprise/frontend/src/metabase-enterprise/application_permissions/pages/ApplicationPermissionsPage/ApplicationPermissionsPage.tsx
@@ -1,5 +1,4 @@
 import { useCallback, useEffect } from "react";
-import { connect } from "react-redux";
 import type { Route } from "react-router";
 import _ from "underscore";
 
@@ -7,6 +6,7 @@ import { ApplicationPermissionsHelp } from "metabase/admin/permissions/component
 import { PermissionsEditor } from "metabase/admin/permissions/components/PermissionsEditor";
 import PermissionsPageLayout from "metabase/admin/permissions/components/PermissionsPageLayout";
 import Groups from "metabase/entities/groups";
+import { connect } from "metabase/lib/redux";
 import {
   initializeApplicationPermissions,
   saveApplicationPermissions,
diff --git a/enterprise/frontend/src/metabase-enterprise/audit_app/containers/AuditTable.jsx b/enterprise/frontend/src/metabase-enterprise/audit_app/containers/AuditTable.jsx
index bbb4c149cd0871351deca65cba8a4b60fdd1aa96..f19ab291abf0aa11da596930f5af4202f58b287d 100644
--- a/enterprise/frontend/src/metabase-enterprise/audit_app/containers/AuditTable.jsx
+++ b/enterprise/frontend/src/metabase-enterprise/audit_app/containers/AuditTable.jsx
@@ -3,13 +3,13 @@ import "../components/AuditTableVisualization";
 import { chain } from "icepick";
 import PropTypes from "prop-types";
 import { useState } from "react";
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import _ from "underscore";
 
 import { PaginationControls } from "metabase/components/PaginationControls";
 import CS from "metabase/css/core/index.css";
 import { usePagination } from "metabase/hooks/use-pagination";
+import { connect } from "metabase/lib/redux";
 import { getMetadata } from "metabase/selectors/metadata";
 import Question from "metabase-lib/v1/Question";
 
diff --git a/enterprise/frontend/src/metabase-enterprise/audit_app/containers/UnsubscribeUserModal/UnsubscribeUserModal.jsx b/enterprise/frontend/src/metabase-enterprise/audit_app/containers/UnsubscribeUserModal/UnsubscribeUserModal.jsx
index 9e237981bd03ae9835784346c39bb1c6c568d1bf..f0454ac55ce4c9202073773bb80af3681572f5d8 100644
--- a/enterprise/frontend/src/metabase-enterprise/audit_app/containers/UnsubscribeUserModal/UnsubscribeUserModal.jsx
+++ b/enterprise/frontend/src/metabase-enterprise/audit_app/containers/UnsubscribeUserModal/UnsubscribeUserModal.jsx
@@ -1,8 +1,8 @@
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
 import Users from "metabase/entities/users";
+import { connect } from "metabase/lib/redux";
 import { addUndo } from "metabase/redux/undo";
 import { AuditApi } from "metabase-enterprise/services";
 
diff --git a/enterprise/frontend/src/metabase-enterprise/auth/components/SettingsJWTForm/SettingsJWTForm.tsx b/enterprise/frontend/src/metabase-enterprise/auth/components/SettingsJWTForm/SettingsJWTForm.tsx
index 7ae1b20085bff521a96022a46e65d817d38fe1d3..827cbba7195774df4bff7f239b2de2044bfb8494 100644
--- a/enterprise/frontend/src/metabase-enterprise/auth/components/SettingsJWTForm/SettingsJWTForm.tsx
+++ b/enterprise/frontend/src/metabase-enterprise/auth/components/SettingsJWTForm/SettingsJWTForm.tsx
@@ -1,5 +1,4 @@
 import { useCallback, useMemo } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -19,6 +18,7 @@ import {
   FormSwitch,
   FormTextInput,
 } from "metabase/forms";
+import { connect } from "metabase/lib/redux";
 import { Flex, Stack, rem } from "metabase/ui";
 import type { SettingValue } from "metabase-types/api";
 
diff --git a/enterprise/frontend/src/metabase-enterprise/auth/components/SettingsSAMLForm/SettingsSAMLForm.jsx b/enterprise/frontend/src/metabase-enterprise/auth/components/SettingsSAMLForm/SettingsSAMLForm.jsx
index 7c6d9653fddd1205fdb11250097ecdc4398fecd1..b19bb500eae70991fd5b5a8bcdb1ef06d84247fb 100644
--- a/enterprise/frontend/src/metabase-enterprise/auth/components/SettingsSAMLForm/SettingsSAMLForm.jsx
+++ b/enterprise/frontend/src/metabase-enterprise/auth/components/SettingsSAMLForm/SettingsSAMLForm.jsx
@@ -1,7 +1,6 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { useCallback, useMemo } from "react";
-import { connect } from "react-redux";
 import { jt, t } from "ttag";
 import _ from "underscore";
 
@@ -23,6 +22,7 @@ import {
   FormTextInput,
   FormTextarea,
 } from "metabase/forms";
+import { connect } from "metabase/lib/redux";
 import { Stack } from "metabase/ui";
 
 import {
diff --git a/enterprise/frontend/src/metabase-enterprise/auth/containers/JwtAuthCard/JwtAuthCard.tsx b/enterprise/frontend/src/metabase-enterprise/auth/containers/JwtAuthCard/JwtAuthCard.tsx
index 9e33cd124046004c65d075415d0ac83963162918..be1e39148dc8c8ca1c53ac5508fa2de4c68d304e 100644
--- a/enterprise/frontend/src/metabase-enterprise/auth/containers/JwtAuthCard/JwtAuthCard.tsx
+++ b/enterprise/frontend/src/metabase-enterprise/auth/containers/JwtAuthCard/JwtAuthCard.tsx
@@ -1,8 +1,8 @@
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import AuthCard from "metabase/admin/settings/auth/components/AuthCard";
 import { updateSettings } from "metabase/admin/settings/settings";
+import { connect } from "metabase/lib/redux";
 import { getSetting } from "metabase/selectors/settings";
 import type { Dispatch, State } from "metabase-types/store";
 
diff --git a/enterprise/frontend/src/metabase-enterprise/auth/containers/SamlAuthCard/SamlAuthCard.tsx b/enterprise/frontend/src/metabase-enterprise/auth/containers/SamlAuthCard/SamlAuthCard.tsx
index dbd1d1073ba0fade61c6479a61bbed9e5af37af4..36612c5c7c631f4d8e85759ba305e7788e4731ce 100644
--- a/enterprise/frontend/src/metabase-enterprise/auth/containers/SamlAuthCard/SamlAuthCard.tsx
+++ b/enterprise/frontend/src/metabase-enterprise/auth/containers/SamlAuthCard/SamlAuthCard.tsx
@@ -1,8 +1,8 @@
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import AuthCard from "metabase/admin/settings/auth/components/AuthCard";
 import { updateSettings } from "metabase/admin/settings/settings";
+import { connect } from "metabase/lib/redux";
 import { getSetting } from "metabase/selectors/settings";
 import type { Dispatch, State } from "metabase-types/store";
 
diff --git a/enterprise/frontend/src/metabase-enterprise/license/components/LicenseAndBillingSettings/LicenseAndBillingSettings.tsx b/enterprise/frontend/src/metabase-enterprise/license/components/LicenseAndBillingSettings/LicenseAndBillingSettings.tsx
index f18438427e9d08c3611e5663a347b6690abbb5ad..71abd7f1130ba900210bb71f0f8c41a58c900aeb 100644
--- a/enterprise/frontend/src/metabase-enterprise/license/components/LicenseAndBillingSettings/LicenseAndBillingSettings.tsx
+++ b/enterprise/frontend/src/metabase-enterprise/license/components/LicenseAndBillingSettings/LicenseAndBillingSettings.tsx
@@ -1,5 +1,4 @@
 import moment from "moment-timezone"; // eslint-disable-line no-restricted-imports -- deprecated usage
-import { connect } from "react-redux";
 import { jt, t } from "ttag";
 
 import { LicenseInput } from "metabase/admin/settings/components/LicenseInput";
@@ -13,6 +12,7 @@ import {
 import { ExplorePlansIllustration } from "metabase/admin/settings/components/SettingsLicense/ExplorePlansIllustration";
 import LoadingSpinner from "metabase/components/LoadingSpinner";
 import ExternalLink from "metabase/core/components/ExternalLink";
+import { connect } from "metabase/lib/redux";
 import { getUpgradeUrl } from "metabase/selectors/settings";
 import { useGetBillingInfoQuery } from "metabase-enterprise/api";
 import { showLicenseAcceptedToast } from "metabase-enterprise/license/actions";
diff --git a/enterprise/frontend/src/metabase-enterprise/moderation/components/QuestionModerationSection/QuestionModerationSection.jsx b/enterprise/frontend/src/metabase-enterprise/moderation/components/QuestionModerationSection/QuestionModerationSection.jsx
index 2d1db5e17ead093eda20d0dd4083f66a680fa6d8..2e7cf651ad7d6013120156babf4993b43d84f98e 100644
--- a/enterprise/frontend/src/metabase-enterprise/moderation/components/QuestionModerationSection/QuestionModerationSection.jsx
+++ b/enterprise/frontend/src/metabase-enterprise/moderation/components/QuestionModerationSection/QuestionModerationSection.jsx
@@ -1,8 +1,8 @@
 import PropTypes from "prop-types";
 import { Fragment } from "react";
-import { connect } from "react-redux";
 
 import { useEditItemVerificationMutation } from "metabase/api";
+import { connect } from "metabase/lib/redux";
 import { getIsModerator } from "metabase-enterprise/moderation/selectors";
 import { getLatestModerationReview } from "metabase-enterprise/moderation/service";
 
diff --git a/enterprise/frontend/src/metabase-enterprise/moderation/containers/ModerationReviewIcon/ModerationReviewIcon.tsx b/enterprise/frontend/src/metabase-enterprise/moderation/containers/ModerationReviewIcon/ModerationReviewIcon.tsx
index 74c9fed85835df8cca16009f3c1084778ea2821b..9ab72f2ed54c01a4141229903fd22a055e0f67b1 100644
--- a/enterprise/frontend/src/metabase-enterprise/moderation/containers/ModerationReviewIcon/ModerationReviewIcon.tsx
+++ b/enterprise/frontend/src/metabase-enterprise/moderation/containers/ModerationReviewIcon/ModerationReviewIcon.tsx
@@ -1,6 +1,6 @@
-import { connect } from "react-redux";
 import _ from "underscore";
 
+import { connect } from "metabase/lib/redux";
 import { getUser } from "metabase/selectors/user";
 import type { State } from "metabase-types/store";
 
diff --git a/enterprise/frontend/src/metabase-enterprise/redux.ts b/enterprise/frontend/src/metabase-enterprise/redux.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3c4724ea664e86cdd9bc137cd39c9881b3021cff
--- /dev/null
+++ b/enterprise/frontend/src/metabase-enterprise/redux.ts
@@ -0,0 +1,10 @@
+import type { TypedUseSelectorHook } from "react-redux";
+import { createSelectorHook } from "react-redux";
+
+import { MetabaseReduxContext } from "metabase/lib/redux";
+
+// TODO: use the real type after we figure out what it is
+type EnterpriseState = any;
+
+export const useEnterpriseSelector: TypedUseSelectorHook<EnterpriseState> =
+  createSelectorHook(MetabaseReduxContext);
diff --git a/enterprise/frontend/src/metabase-enterprise/sandboxes/containers/EditSandboxingModal.tsx b/enterprise/frontend/src/metabase-enterprise/sandboxes/containers/EditSandboxingModal.tsx
index 128c2aeeaaa487b4397c5996c9f16b1f13c7832f..15269727e99f8f4e6e687e651949a4c199cb9f29 100644
--- a/enterprise/frontend/src/metabase-enterprise/sandboxes/containers/EditSandboxingModal.tsx
+++ b/enterprise/frontend/src/metabase-enterprise/sandboxes/containers/EditSandboxingModal.tsx
@@ -1,11 +1,11 @@
 import { useEffect } from "react";
-import { connect } from "react-redux";
 import { withRouter } from "react-router";
 import { push } from "react-router-redux";
 import _ from "underscore";
 
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import { getParentPath } from "metabase/hoc/ModalRoute";
+import { connect } from "metabase/lib/redux";
 import {
   getGroupTableAccessPolicy,
   getPolicyRequestState,
diff --git a/enterprise/frontend/src/metabase-enterprise/snippets/components/SnippetCollectionForm.tsx b/enterprise/frontend/src/metabase-enterprise/snippets/components/SnippetCollectionForm.tsx
index 098dd6e4838df17170fc5ca29e21dc0c54b6d1a9..0dc1ba9077da8142e52fdcf30bc2d80bc00bd691 100644
--- a/enterprise/frontend/src/metabase-enterprise/snippets/components/SnippetCollectionForm.tsx
+++ b/enterprise/frontend/src/metabase-enterprise/snippets/components/SnippetCollectionForm.tsx
@@ -1,5 +1,4 @@
 import { useCallback, useMemo } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 import * as Yup from "yup";
@@ -17,6 +16,7 @@ import SnippetCollections from "metabase/entities/snippet-collections";
 import { Form, FormProvider } from "metabase/forms";
 import { color } from "metabase/lib/colors";
 import * as Errors from "metabase/lib/errors";
+import { connect } from "metabase/lib/redux";
 import type { Collection, CollectionId } from "metabase-types/api";
 import type { State } from "metabase-types/store";
 
diff --git a/enterprise/frontend/src/metabase-enterprise/whitelabel/components/LogoIcon.jsx b/enterprise/frontend/src/metabase-enterprise/whitelabel/components/LogoIcon.jsx
index f180130a1b78e381f04e386e5137178d84b5f7ef..9afdab51d4815e9d1ec0d5c32369c3ea5f3aa538 100644
--- a/enterprise/frontend/src/metabase-enterprise/whitelabel/components/LogoIcon.jsx
+++ b/enterprise/frontend/src/metabase-enterprise/whitelabel/components/LogoIcon.jsx
@@ -2,10 +2,10 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 
 import CS from "metabase/css/core/index.css";
 import { parseDataUri, removeAllChildren } from "metabase/lib/dom";
+import { connect } from "metabase/lib/redux";
 import { getLogoUrl } from "metabase-enterprise/settings/selectors";
 
 const mapStateToProps = state => ({
diff --git a/frontend/src/metabase/App.tsx b/frontend/src/metabase/App.tsx
index b5c1dc4e4bfd3e3b9e746f74f2a033d3ba5a4992..11a1bd1b45b4558901e7e8b83f3f278e7341ef88 100644
--- a/frontend/src/metabase/App.tsx
+++ b/frontend/src/metabase/App.tsx
@@ -2,7 +2,6 @@ import type { Location } from "history";
 import { KBarProvider } from "kbar";
 import type { ReactNode } from "react";
 import { useEffect, useState } from "react";
-import { connect } from "react-redux";
 
 import { AppBanner } from "metabase/components/AppBanner";
 import {
@@ -17,6 +16,7 @@ import { ContentViewportContext } from "metabase/core/context/ContentViewportCon
 import CS from "metabase/css/core/index.css";
 import ScrollToTop from "metabase/hoc/ScrollToTop";
 import { initializeIframeResizer } from "metabase/lib/dom";
+import { connect } from "metabase/lib/redux";
 import AppBar from "metabase/nav/containers/AppBar";
 import Navbar from "metabase/nav/containers/Navbar";
 import { setErrorPage } from "metabase/redux/app";
diff --git a/frontend/src/metabase/account/app/containers/AccountApp/AccountApp.jsx b/frontend/src/metabase/account/app/containers/AccountApp/AccountApp.jsx
index addbb738d7aced627d40f3f387ade08643ea77b7..645cef15f996cdad710ae18b940f74ba67e60134 100644
--- a/frontend/src/metabase/account/app/containers/AccountApp/AccountApp.jsx
+++ b/frontend/src/metabase/account/app/containers/AccountApp/AccountApp.jsx
@@ -1,6 +1,6 @@
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 
+import { connect } from "metabase/lib/redux";
 import { getUser } from "metabase/selectors/user";
 
 import AccountLayout from "../../components/AccountLayout";
diff --git a/frontend/src/metabase/account/notifications/containers/ArchiveAlertModal/ArchiveAlertModal.jsx b/frontend/src/metabase/account/notifications/containers/ArchiveAlertModal/ArchiveAlertModal.jsx
index 923a6079ed5e42943cd9be9317a226ca6346478f..9577b6ebf4cd45bf120f40d434abf187fcced383 100644
--- a/frontend/src/metabase/account/notifications/containers/ArchiveAlertModal/ArchiveAlertModal.jsx
+++ b/frontend/src/metabase/account/notifications/containers/ArchiveAlertModal/ArchiveAlertModal.jsx
@@ -1,7 +1,7 @@
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import Alerts from "metabase/entities/alerts";
+import { connect } from "metabase/lib/redux";
 import { getUser } from "metabase/selectors/user";
 
 import ArchiveModal from "../../components/ArchiveModal";
diff --git a/frontend/src/metabase/account/notifications/containers/ArchivePulseModal/ArchivePulseModal.jsx b/frontend/src/metabase/account/notifications/containers/ArchivePulseModal/ArchivePulseModal.jsx
index 19a5fa0cbe5a28a05d9e4c20266072c8d4d3b72e..15a3206e47f4f8f7666a227b70f420c292fc810c 100644
--- a/frontend/src/metabase/account/notifications/containers/ArchivePulseModal/ArchivePulseModal.jsx
+++ b/frontend/src/metabase/account/notifications/containers/ArchivePulseModal/ArchivePulseModal.jsx
@@ -1,7 +1,7 @@
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import Pulses from "metabase/entities/pulses";
+import { connect } from "metabase/lib/redux";
 import { getUser } from "metabase/selectors/user";
 
 import ArchiveModal from "../../components/ArchiveModal";
diff --git a/frontend/src/metabase/account/notifications/containers/NotificationsApp/NotificationsApp.jsx b/frontend/src/metabase/account/notifications/containers/NotificationsApp/NotificationsApp.jsx
index 4486aabf50ac5815355f1695f3b0c45928abf317..50649cd5871ee60945983c1dc2ed7e1e0fcd03ce 100644
--- a/frontend/src/metabase/account/notifications/containers/NotificationsApp/NotificationsApp.jsx
+++ b/frontend/src/metabase/account/notifications/containers/NotificationsApp/NotificationsApp.jsx
@@ -1,8 +1,8 @@
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import Alerts from "metabase/entities/alerts";
 import Pulses from "metabase/entities/pulses";
+import { connect } from "metabase/lib/redux";
 import {
   canManageSubscriptions,
   getUser,
diff --git a/frontend/src/metabase/account/notifications/containers/UnsubscribeAlertModal/UnsubscribeAlertModal.jsx b/frontend/src/metabase/account/notifications/containers/UnsubscribeAlertModal/UnsubscribeAlertModal.jsx
index 7b244e8c8fa66278f5c241b226104d8ccbc090e3..ff2daf00ea3ecd8683040ec8d00bf22567d44770 100644
--- a/frontend/src/metabase/account/notifications/containers/UnsubscribeAlertModal/UnsubscribeAlertModal.jsx
+++ b/frontend/src/metabase/account/notifications/containers/UnsubscribeAlertModal/UnsubscribeAlertModal.jsx
@@ -1,7 +1,7 @@
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import Alerts from "metabase/entities/alerts";
+import { connect } from "metabase/lib/redux";
 import { getUser } from "metabase/selectors/user";
 
 import { navigateToArchive } from "../../actions";
diff --git a/frontend/src/metabase/account/notifications/containers/UnsubscribePulseModal/UnsubscribePulseModal.jsx b/frontend/src/metabase/account/notifications/containers/UnsubscribePulseModal/UnsubscribePulseModal.jsx
index d7925d758bf5ec86188c39784817b15feef09a0e..886f1058f4bdb140d532f2a2d9ce80fc526973a3 100644
--- a/frontend/src/metabase/account/notifications/containers/UnsubscribePulseModal/UnsubscribePulseModal.jsx
+++ b/frontend/src/metabase/account/notifications/containers/UnsubscribePulseModal/UnsubscribePulseModal.jsx
@@ -1,7 +1,7 @@
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import Pulses from "metabase/entities/pulses";
+import { connect } from "metabase/lib/redux";
 import { getUser } from "metabase/selectors/user";
 
 import { navigateToArchive } from "../../actions";
diff --git a/frontend/src/metabase/account/password/containers/UserPasswordApp/UserPasswordApp.tsx b/frontend/src/metabase/account/password/containers/UserPasswordApp/UserPasswordApp.tsx
index 3c67481550601a50ccb5bd6b896684dbb1307251..407ffb699c056278c1914ec99497504dea33af1e 100644
--- a/frontend/src/metabase/account/password/containers/UserPasswordApp/UserPasswordApp.tsx
+++ b/frontend/src/metabase/account/password/containers/UserPasswordApp/UserPasswordApp.tsx
@@ -1,5 +1,4 @@
-import { connect } from "react-redux";
-
+import { connect } from "metabase/lib/redux";
 import { checkNotNull } from "metabase/lib/types";
 import { getUser } from "metabase/selectors/user";
 import type { State } from "metabase-types/store";
diff --git a/frontend/src/metabase/account/profile/containers/UserProfileApp/UserProfileApp.tsx b/frontend/src/metabase/account/profile/containers/UserProfileApp/UserProfileApp.tsx
index 77e462a6e055a6777303567304c20b238b79c78c..dec3ece13645db95da644e64a773ebe1b6318f99 100644
--- a/frontend/src/metabase/account/profile/containers/UserProfileApp/UserProfileApp.tsx
+++ b/frontend/src/metabase/account/profile/containers/UserProfileApp/UserProfileApp.tsx
@@ -1,5 +1,4 @@
-import { connect } from "react-redux";
-
+import { connect } from "metabase/lib/redux";
 import { checkNotNull } from "metabase/lib/types";
 import { getUser } from "metabase/selectors/user";
 import type { State } from "metabase-types/store";
diff --git a/frontend/src/metabase/actions/components/ActionViz/Action.tsx b/frontend/src/metabase/actions/components/ActionViz/Action.tsx
index d4d6ce2c1eb4c26353de37037deca31f2c1b6636..340025c7bba5933e299139a3a5afdbefda1de6d5 100644
--- a/frontend/src/metabase/actions/components/ActionViz/Action.tsx
+++ b/frontend/src/metabase/actions/components/ActionViz/Action.tsx
@@ -1,5 +1,4 @@
 import { useCallback, useMemo } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import { skipToken, useGetCardQuery } from "metabase/api";
@@ -13,7 +12,7 @@ import {
   getParameterValues,
 } from "metabase/dashboard/selectors";
 import { getActionIsEnabledInDatabase } from "metabase/dashboard/utils";
-import { useSelector } from "metabase/lib/redux";
+import { connect, useSelector } from "metabase/lib/redux";
 import { getMetadata } from "metabase/selectors/metadata";
 import type { VisualizationProps } from "metabase/visualizations/types";
 import Question from "metabase-lib/v1/Question";
diff --git a/frontend/src/metabase/actions/components/ActionViz/ActionDashcardSettings.tsx b/frontend/src/metabase/actions/components/ActionViz/ActionDashcardSettings.tsx
index 30c79093cd5706f1d4c8e407f898e179ac3a4482..b76eb513b9a641cd1d4194d8cfb5bd4566d3a42c 100644
--- a/frontend/src/metabase/actions/components/ActionViz/ActionDashcardSettings.tsx
+++ b/frontend/src/metabase/actions/components/ActionViz/ActionDashcardSettings.tsx
@@ -1,5 +1,4 @@
 import { useMemo } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import { ConnectedActionPicker } from "metabase/actions/containers/ActionPicker";
@@ -7,6 +6,7 @@ import EmptyState from "metabase/components/EmptyState";
 import Button from "metabase/core/components/Button";
 import CS from "metabase/css/core/index.css";
 import { setActionForDashcard } from "metabase/dashboard/actions";
+import { connect } from "metabase/lib/redux";
 import type {
   ActionDashboardCard,
   Dashboard,
diff --git a/frontend/src/metabase/actions/containers/ActionCreator/ActionCreator.tsx b/frontend/src/metabase/actions/containers/ActionCreator/ActionCreator.tsx
index c0f1a707d8538187c38c9062c59072a171a0b48f..f6eeceb4c0e36bf03e9a36db9dfa862064a857f1 100644
--- a/frontend/src/metabase/actions/containers/ActionCreator/ActionCreator.tsx
+++ b/frontend/src/metabase/actions/containers/ActionCreator/ActionCreator.tsx
@@ -1,5 +1,4 @@
 import { useState } from "react";
-import { connect } from "react-redux";
 import type { Route } from "react-router";
 import { t } from "ttag";
 import _ from "underscore";
@@ -15,6 +14,7 @@ import Database from "metabase/entities/databases";
 import Questions from "metabase/entities/questions";
 import useBeforeUnload from "metabase/hooks/use-before-unload";
 import { useCallbackEffect } from "metabase/hooks/use-callback-effect";
+import { connect } from "metabase/lib/redux";
 import { getMetadata } from "metabase/selectors/metadata";
 import type Question from "metabase-lib/v1/Question";
 import type Metadata from "metabase-lib/v1/metadata/Metadata";
diff --git a/frontend/src/metabase/actions/containers/ActionCreator/InlineActionSettings.tsx b/frontend/src/metabase/actions/containers/ActionCreator/InlineActionSettings.tsx
index 0abb99f1e2e793a86c5233902da44bc3dfc665e8..228fe24deac2cb01a146d0480725c6ffc3d51606 100644
--- a/frontend/src/metabase/actions/containers/ActionCreator/InlineActionSettings.tsx
+++ b/frontend/src/metabase/actions/containers/ActionCreator/InlineActionSettings.tsx
@@ -1,5 +1,4 @@
 import type { ChangeEvent } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import ConfirmContent from "metabase/components/ConfirmContent";
@@ -13,6 +12,7 @@ import Tooltip from "metabase/core/components/Tooltip";
 import Actions from "metabase/entities/actions/actions";
 import { useToggle } from "metabase/hooks/use-toggle";
 import { useUniqueId } from "metabase/hooks/use-unique-id";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import SidebarContent from "metabase/query_builder/components/SidebarContent";
 import { getSetting } from "metabase/selectors/settings";
diff --git a/frontend/src/metabase/actions/containers/ActionCreatorModal/ActionCreatorModal.tsx b/frontend/src/metabase/actions/containers/ActionCreatorModal/ActionCreatorModal.tsx
index e906edf5ba7cc62a9dbed0958845a3d07f45eda1..b65244bfefd9ed230f07b3d93d73f10d28d9b12d 100644
--- a/frontend/src/metabase/actions/containers/ActionCreatorModal/ActionCreatorModal.tsx
+++ b/frontend/src/metabase/actions/containers/ActionCreatorModal/ActionCreatorModal.tsx
@@ -1,12 +1,12 @@
 import type { LocationDescriptor } from "history";
 import { useEffect } from "react";
-import { connect } from "react-redux";
 import type { Route } from "react-router";
 import { replace } from "react-router-redux";
 import _ from "underscore";
 
 import { skipToken, useGetActionQuery } from "metabase/api";
 import Models from "metabase/entities/questions";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import { setErrorPage } from "metabase/redux/app";
 import type Question from "metabase-lib/v1/Question";
diff --git a/frontend/src/metabase/admin/app/containers/DeprecationNotice/DeprecationNotice.tsx b/frontend/src/metabase/admin/app/containers/DeprecationNotice/DeprecationNotice.tsx
index 91ca2124dfc3cf5442ecb463ad20f1e6ef757a25..a608f01f1d5614f21bbf9a048f84494d8b607416 100644
--- a/frontend/src/metabase/admin/app/containers/DeprecationNotice/DeprecationNotice.tsx
+++ b/frontend/src/metabase/admin/app/containers/DeprecationNotice/DeprecationNotice.tsx
@@ -1,7 +1,7 @@
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import Databases from "metabase/entities/databases";
+import { connect } from "metabase/lib/redux";
 import type Database from "metabase-lib/v1/metadata/Database";
 import type { State } from "metabase-types/store";
 
diff --git a/frontend/src/metabase/admin/databases/containers/DatabaseEditApp.tsx b/frontend/src/metabase/admin/databases/containers/DatabaseEditApp.tsx
index 70032cfb365e3489c30e028f5db3a7f481d36906..055927dd0d678c25f6d7672014e61b1ea8ec9a23 100644
--- a/frontend/src/metabase/admin/databases/containers/DatabaseEditApp.tsx
+++ b/frontend/src/metabase/admin/databases/containers/DatabaseEditApp.tsx
@@ -2,7 +2,6 @@ import type { Location, LocationDescriptor } from "history";
 import { updateIn } from "icepick";
 import type { ComponentType } from "react";
 import { useState } from "react";
-import { connect } from "react-redux";
 import type { Route } from "react-router";
 import { push } from "react-router-redux";
 import { useMount } from "react-use";
@@ -19,6 +18,7 @@ import CS from "metabase/css/core/index.css";
 import { DatabaseForm } from "metabase/databases/components/DatabaseForm";
 import title from "metabase/hoc/Title";
 import { useCallbackEffect } from "metabase/hooks/use-callback-effect";
+import { connect } from "metabase/lib/redux";
 import { getSetting } from "metabase/selectors/settings";
 import { getUserIsAdmin } from "metabase/selectors/user";
 import Database from "metabase-lib/v1/metadata/Database";
diff --git a/frontend/src/metabase/admin/databases/containers/DatabaseListApp.jsx b/frontend/src/metabase/admin/databases/containers/DatabaseListApp.jsx
index f7ec9761f6e3fa112cb38c40f55ea65f5ad8c7b5..4c9a21c99cf03b802665ec999fc7f64e567a2412 100644
--- a/frontend/src/metabase/admin/databases/containers/DatabaseListApp.jsx
+++ b/frontend/src/metabase/admin/databases/containers/DatabaseListApp.jsx
@@ -1,8 +1,8 @@
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import LoadingAndGenericErrorWrapper from "metabase/components/LoadingAndGenericErrorWrapper";
 import Database from "metabase/entities/databases";
+import { connect } from "metabase/lib/redux";
 import { isSyncInProgress } from "metabase/lib/syncing";
 import { PLUGIN_FEATURE_LEVEL_PERMISSIONS } from "metabase/plugins";
 import { getSetting } from "metabase/selectors/settings";
diff --git a/frontend/src/metabase/admin/datamodel/containers/DataModelApp/DataModelApp.jsx b/frontend/src/metabase/admin/datamodel/containers/DataModelApp/DataModelApp.jsx
index a9dec95e4021d208dc56771264c1cf8877f19641..b406429fc2898031dd8bb7918c616805b5200e7a 100644
--- a/frontend/src/metabase/admin/datamodel/containers/DataModelApp/DataModelApp.jsx
+++ b/frontend/src/metabase/admin/datamodel/containers/DataModelApp/DataModelApp.jsx
@@ -1,11 +1,11 @@
 import PropTypes from "prop-types";
 import { Fragment, useMemo } from "react";
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import { t } from "ttag";
 
 import Radio from "metabase/core/components/Radio";
 import { useToggle } from "metabase/hooks/use-toggle";
+import { connect } from "metabase/lib/redux";
 import { getUserIsAdmin } from "metabase/selectors/user";
 
 import { ModelEducationButton, NavBar } from "./DataModelApp.styled";
diff --git a/frontend/src/metabase/admin/datamodel/containers/RevisionHistoryApp.jsx b/frontend/src/metabase/admin/datamodel/containers/RevisionHistoryApp.jsx
index 6e5a0aa5208368212cb26973b095e1d4a126b5c2..356c0276c7af260103112b6658b6901e77dee33a 100644
--- a/frontend/src/metabase/admin/datamodel/containers/RevisionHistoryApp.jsx
+++ b/frontend/src/metabase/admin/datamodel/containers/RevisionHistoryApp.jsx
@@ -1,10 +1,10 @@
 /* eslint-disable react/prop-types */
 import { Component } from "react";
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import Segments from "metabase/entities/segments";
 import Tables from "metabase/entities/tables";
+import { connect } from "metabase/lib/redux";
 
 import RevisionHistory from "../components/revisions/RevisionHistory";
 import { fetchSegmentRevisions } from "../datamodel";
diff --git a/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx b/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx
index d423b295b1c676f71e8c0f172c1d3379977299ef..9c179c949be1520e713999b69575b4bb52fbd307 100644
--- a/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx
+++ b/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx
@@ -1,6 +1,5 @@
 /* eslint-disable react/prop-types */
 import { useCallback, useState } from "react";
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import _ from "underscore";
 
@@ -8,6 +7,7 @@ import { LeaveConfirmationModal } from "metabase/components/LeaveConfirmationMod
 import Segments from "metabase/entities/segments";
 import Tables from "metabase/entities/tables";
 import { useCallbackEffect } from "metabase/hooks/use-callback-effect";
+import { connect } from "metabase/lib/redux";
 
 import SegmentForm from "../components/SegmentForm";
 import { updatePreviewSummary } from "../datamodel";
diff --git a/frontend/src/metabase/admin/datamodel/containers/SegmentListApp.jsx b/frontend/src/metabase/admin/datamodel/containers/SegmentListApp.jsx
index 8bf23d5b3f029024dc39449bc9171793fa809f99..c42a0a7914d728e0744faee93db689f4613a6068 100644
--- a/frontend/src/metabase/admin/datamodel/containers/SegmentListApp.jsx
+++ b/frontend/src/metabase/admin/datamodel/containers/SegmentListApp.jsx
@@ -1,7 +1,6 @@
 /* eslint-disable react/prop-types */
 import cx from "classnames";
 import { Component } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -12,6 +11,7 @@ import Link from "metabase/core/components/Link";
 import AdminS from "metabase/css/admin.module.css";
 import CS from "metabase/css/core/index.css";
 import Segments from "metabase/entities/segments";
+import { connect } from "metabase/lib/redux";
 
 class SegmentListAppInner extends Component {
   render() {
diff --git a/frontend/src/metabase/admin/datamodel/hoc/FilteredToUrlTable.jsx b/frontend/src/metabase/admin/datamodel/hoc/FilteredToUrlTable.jsx
index e355c8b8e6639f877e5547956f39e1969b0861f0..14b41028c62c7c6ad096b5a515b272dd05fad664 100644
--- a/frontend/src/metabase/admin/datamodel/hoc/FilteredToUrlTable.jsx
+++ b/frontend/src/metabase/admin/datamodel/hoc/FilteredToUrlTable.jsx
@@ -1,13 +1,13 @@
 /* eslint-disable react/prop-types */
 import cx from "classnames";
 import { Component } from "react";
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import { t } from "ttag";
 
 import { FieldSet } from "metabase/components/FieldSet";
 import CS from "metabase/css/core/index.css";
 import Tables from "metabase/entities/tables";
+import { connect } from "metabase/lib/redux";
 import { DatabaseSchemaAndTableDataSelector } from "metabase/query_builder/components/DataSelector";
 import { Icon } from "metabase/ui";
 
diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/FieldFormattingSettings/FieldFormattingSettings.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/FieldFormattingSettings/FieldFormattingSettings.tsx
index 649696dbc3ac6cbc0b58588051da1cbb3b8d1f0e..65b0d7ec5831db2b18a20384e83f1914ece67942 100644
--- a/frontend/src/metabase/admin/datamodel/metadata/components/FieldFormattingSettings/FieldFormattingSettings.tsx
+++ b/frontend/src/metabase/admin/datamodel/metadata/components/FieldFormattingSettings/FieldFormattingSettings.tsx
@@ -1,7 +1,7 @@
 import { useCallback, useMemo } from "react";
-import { connect } from "react-redux";
 
 import Fields from "metabase/entities/fields";
+import { connect } from "metabase/lib/redux";
 import ColumnSettings from "metabase/visualizations/components/ColumnSettings";
 import { getGlobalSettingsForColumn } from "metabase/visualizations/lib/settings/column";
 import type Field from "metabase-lib/v1/metadata/Field";
diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/FieldGeneralSettings/FieldGeneralSettings.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/FieldGeneralSettings/FieldGeneralSettings.tsx
index 61995bcdd4defcd2a345a4641533a2024b7b533a..3085c94c7f31e5e30f4632706e16c4ca4c9932f4 100644
--- a/frontend/src/metabase/admin/datamodel/metadata/components/FieldGeneralSettings/FieldGeneralSettings.tsx
+++ b/frontend/src/metabase/admin/datamodel/metadata/components/FieldGeneralSettings/FieldGeneralSettings.tsx
@@ -1,6 +1,5 @@
 import cx from "classnames";
 import { useCallback, useMemo } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import { humanizeCoercionStrategy } from "metabase/admin/datamodel/utils/humanizeCoercionStrategy";
@@ -16,6 +15,7 @@ import ButtonsS from "metabase/css/components/buttons.module.css";
 import CS from "metabase/css/core/index.css";
 import Fields from "metabase/entities/fields";
 import * as MetabaseCore from "metabase/lib/core";
+import { connect } from "metabase/lib/redux";
 import type Field from "metabase-lib/v1/metadata/Field";
 import type Table from "metabase-lib/v1/metadata/Table";
 import type { FieldValuesType } from "metabase-types/api";
diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/FieldRemappingSettings/FieldRemappingSettings.jsx b/frontend/src/metabase/admin/datamodel/metadata/components/FieldRemappingSettings/FieldRemappingSettings.jsx
index 5bf4ba86f6ef6729a9a4e27f2313f3503293796c..49ff9c87f15def064079288a049453cf0cf388aa 100644
--- a/frontend/src/metabase/admin/datamodel/metadata/components/FieldRemappingSettings/FieldRemappingSettings.jsx
+++ b/frontend/src/metabase/admin/datamodel/metadata/components/FieldRemappingSettings/FieldRemappingSettings.jsx
@@ -1,7 +1,6 @@
 /* eslint-disable react/prop-types */
 import cx from "classnames";
 import { Component, createRef } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -9,6 +8,7 @@ import ButtonWithStatus from "metabase/components/ButtonWithStatus";
 import Select from "metabase/core/components/Select";
 import CS from "metabase/css/core/index.css";
 import Fields from "metabase/entities/fields";
+import { connect } from "metabase/lib/redux";
 import { PLUGIN_FEATURE_LEVEL_PERMISSIONS } from "metabase/plugins";
 import { FieldDataSelector } from "metabase/query_builder/components/DataSelector";
 import { getMetadataUnfiltered } from "metabase/selectors/metadata";
diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataFieldSettings/MetadataFieldSettings.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataFieldSettings/MetadataFieldSettings.tsx
index 797b16f3ddf7bfec1392f8251efe5186bfa518ef..b9d2fef2216501dab613e274de3dedee6432e750 100644
--- a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataFieldSettings/MetadataFieldSettings.tsx
+++ b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataFieldSettings/MetadataFieldSettings.tsx
@@ -1,5 +1,4 @@
 import cx from "classnames";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -12,6 +11,7 @@ import Databases from "metabase/entities/databases";
 import Fields from "metabase/entities/fields";
 import Schemas from "metabase/entities/schemas";
 import Tables from "metabase/entities/tables";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import { PLUGIN_FEATURE_LEVEL_PERMISSIONS } from "metabase/plugins";
 import type Database from "metabase-lib/v1/metadata/Database";
diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataHeader/MetadataHeader.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataHeader/MetadataHeader.tsx
index 4f197d68c7fa51d9d84026833c80c7e6f5d46297..b7e99b39ca28eae7d19017ca2b09ca16cb768da6 100644
--- a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataHeader/MetadataHeader.tsx
+++ b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataHeader/MetadataHeader.tsx
@@ -1,12 +1,12 @@
 import cx from "classnames";
 import { useLayoutEffect } from "react";
-import { connect } from "react-redux";
 import { push, replace } from "react-router-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
 import CS from "metabase/css/core/index.css";
 import Databases from "metabase/entities/databases";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import { PLUGIN_FEATURE_LEVEL_PERMISSIONS } from "metabase/plugins";
 import { DatabaseDataSelector } from "metabase/query_builder/components/DataSelector";
diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataSchemaList/MetadataSchemaList.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataSchemaList/MetadataSchemaList.tsx
index 20c6a462cb0001b5591fcf1ab865cea232301bae..3292504bb479723943aba05ce96519ab5d12e9c2 100644
--- a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataSchemaList/MetadataSchemaList.tsx
+++ b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataSchemaList/MetadataSchemaList.tsx
@@ -1,6 +1,5 @@
 import cx from "classnames";
 import { useCallback, useLayoutEffect, useMemo, useState } from "react";
-import { connect } from "react-redux";
 import { push, replace } from "react-router-redux";
 import { msgid, ngettext, t } from "ttag";
 import _ from "underscore";
@@ -8,6 +7,7 @@ import _ from "underscore";
 import AdminS from "metabase/css/admin.module.css";
 import CS from "metabase/css/core/index.css";
 import Schemas from "metabase/entities/schemas";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import { PLUGIN_FEATURE_LEVEL_PERMISSIONS } from "metabase/plugins";
 import { Icon } from "metabase/ui";
diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTable/MetadataTable.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTable/MetadataTable.tsx
index c4f402981147547c0c28be8a157e4c0d8ee3bb10..ef23b37b301f02f6e05eec20ace73ee1eb52dc6a 100644
--- a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTable/MetadataTable.tsx
+++ b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTable/MetadataTable.tsx
@@ -1,7 +1,6 @@
 import cx from "classnames";
 import type { ReactNode } from "react";
 import { useCallback, useState } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -10,6 +9,7 @@ import AdminS from "metabase/css/admin.module.css";
 import CS from "metabase/css/core/index.css";
 import Databases from "metabase/entities/databases";
 import Tables from "metabase/entities/tables";
+import { connect } from "metabase/lib/redux";
 import { PLUGIN_FEATURE_LEVEL_PERMISSIONS } from "metabase/plugins";
 import type Field from "metabase-lib/v1/metadata/Field";
 import type Table from "metabase-lib/v1/metadata/Table";
diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableColumn/MetadataTableColumn.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableColumn/MetadataTableColumn.tsx
index 8babf714a3a06ab78f587d57dcc2679f3f4e09ac..9be039ea968958c88fc4def13d741d87dad95f68 100644
--- a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableColumn/MetadataTableColumn.tsx
+++ b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableColumn/MetadataTableColumn.tsx
@@ -1,13 +1,13 @@
 import cx from "classnames";
 import type { ReactNode } from "react";
 import { useCallback } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import Button from "metabase/core/components/Button/Button";
 import AdminS from "metabase/css/admin.module.css";
 import CS from "metabase/css/core/index.css";
 import Fields from "metabase/entities/fields";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import type Field from "metabase-lib/v1/metadata/Field";
 import type { DatabaseId, SchemaId, TableId } from "metabase-types/api";
diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableColumnList/MetadataTableColumnList.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableColumnList/MetadataTableColumnList.tsx
index bf138fa5b824087c058b4a38513e3fc0f529fda2..e25aaab5593199799dc0c159639af8db194387f7 100644
--- a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableColumnList/MetadataTableColumnList.tsx
+++ b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableColumnList/MetadataTableColumnList.tsx
@@ -4,7 +4,6 @@ import { useSortable } from "@dnd-kit/sortable";
 import { CSS } from "@dnd-kit/utilities";
 import cx from "classnames";
 import { useCallback, useMemo } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -15,6 +14,7 @@ import type { DragEndEvent } from "metabase/core/components/Sortable";
 import { SortableList } from "metabase/core/components/Sortable";
 import CS from "metabase/css/core/index.css";
 import Tables from "metabase/entities/tables";
+import { connect } from "metabase/lib/redux";
 import { Icon } from "metabase/ui";
 import type Field from "metabase-lib/v1/metadata/Field";
 import type Table from "metabase-lib/v1/metadata/Table";
diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableList/MetadataTableList.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableList/MetadataTableList.tsx
index 97f488771870dbe1dea37f20671032068f6aaf8d..75108872d6e738bfeb65377cfe3d5a9f61ab7d34 100644
--- a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableList/MetadataTableList.tsx
+++ b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableList/MetadataTableList.tsx
@@ -1,7 +1,6 @@
 import cx from "classnames";
 import type { ChangeEvent, MouseEvent } from "react";
 import { useCallback, useMemo, useState } from "react";
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import { useAsyncFn } from "react-use";
 import { msgid, ngettext, t } from "ttag";
@@ -11,6 +10,7 @@ import Tooltip from "metabase/core/components/Tooltip";
 import AdminS from "metabase/css/admin.module.css";
 import CS from "metabase/css/core/index.css";
 import Tables from "metabase/entities/tables";
+import { connect } from "metabase/lib/redux";
 import { isSyncCompleted, isSyncInProgress } from "metabase/lib/syncing";
 import * as Urls from "metabase/lib/urls";
 import { PLUGIN_FEATURE_LEVEL_PERMISSIONS } from "metabase/plugins";
diff --git a/frontend/src/metabase/admin/people/components/GroupDetail.jsx b/frontend/src/metabase/admin/people/components/GroupDetail.jsx
index 033013623983f06756c255034111fccb15efcfe0..916f1d5c63ba53cca697d779ba0fd593e05b6102 100644
--- a/frontend/src/metabase/admin/people/components/GroupDetail.jsx
+++ b/frontend/src/metabase/admin/people/components/GroupDetail.jsx
@@ -1,7 +1,6 @@
 /* eslint-disable react/prop-types */
 import cx from "classnames";
 import { Fragment, useEffect, useState } from "react";
-import { connect } from "react-redux";
 import { msgid, ngettext, t } from "ttag";
 
 import { AdminPaneLayout } from "metabase/components/AdminPaneLayout";
@@ -14,6 +13,7 @@ import {
   isAdminGroup,
   isDefaultGroup,
 } from "metabase/lib/groups";
+import { connect } from "metabase/lib/redux";
 import { PLUGIN_GROUP_MANAGERS } from "metabase/plugins";
 import { getUser } from "metabase/selectors/user";
 
diff --git a/frontend/src/metabase/admin/people/components/PeopleList.jsx b/frontend/src/metabase/admin/people/components/PeopleList.jsx
index c165f7f2e7cbd4e1d9dd9d37ed48b597427acbf1..2b04c9dabbb5330cab62da4c43b43d3c70fd683e 100644
--- a/frontend/src/metabase/admin/people/components/PeopleList.jsx
+++ b/frontend/src/metabase/admin/people/components/PeopleList.jsx
@@ -1,7 +1,6 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Fragment, useEffect } from "react";
-import { connect } from "react-redux";
 import { usePrevious } from "react-use";
 import { msgid, ngettext, t } from "ttag";
 import _ from "underscore";
@@ -12,6 +11,7 @@ import CS from "metabase/css/core/index.css";
 import Group from "metabase/entities/groups";
 import Users from "metabase/entities/users";
 import { useConfirmation } from "metabase/hooks/use-confirmation";
+import { connect } from "metabase/lib/redux";
 import { PLUGIN_GROUP_MANAGERS } from "metabase/plugins";
 import { getUser, getUserIsAdmin } from "metabase/selectors/user";
 import { Icon } from "metabase/ui";
diff --git a/frontend/src/metabase/admin/people/containers/GroupsListingApp.jsx b/frontend/src/metabase/admin/people/containers/GroupsListingApp.jsx
index 2a8f923bd6423012592519274e28d33b89447e63..d331091fb58d7fb9f98bde092c00f3ecc0db9bf5 100644
--- a/frontend/src/metabase/admin/people/containers/GroupsListingApp.jsx
+++ b/frontend/src/metabase/admin/people/containers/GroupsListingApp.jsx
@@ -1,8 +1,8 @@
 import { Component } from "react";
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import Group from "metabase/entities/groups";
+import { connect } from "metabase/lib/redux";
 import { PLUGIN_GROUP_MANAGERS } from "metabase/plugins";
 import { getUserIsAdmin } from "metabase/selectors/user";
 
diff --git a/frontend/src/metabase/admin/people/containers/PeopleListingApp.jsx b/frontend/src/metabase/admin/people/containers/PeopleListingApp.jsx
index b88823efdb4aa4c9eaea8b3cdb41db7b532c2630..331bedab776d29433d20a8e903c947fa63042ca8 100644
--- a/frontend/src/metabase/admin/people/containers/PeopleListingApp.jsx
+++ b/frontend/src/metabase/admin/people/containers/PeopleListingApp.jsx
@@ -1,10 +1,10 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import { AdminPaneLayout } from "metabase/components/AdminPaneLayout";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import { getUserIsAdmin } from "metabase/selectors/user";
 import { Group, Radio } from "metabase/ui";
diff --git a/frontend/src/metabase/admin/people/containers/UserActivationModal.jsx b/frontend/src/metabase/admin/people/containers/UserActivationModal.jsx
index 48fa9d693430a5d258325e6d691dbcbb420509cc..801211bafd90fae689bf95d5dab23073847ce583 100644
--- a/frontend/src/metabase/admin/people/containers/UserActivationModal.jsx
+++ b/frontend/src/metabase/admin/people/containers/UserActivationModal.jsx
@@ -1,6 +1,5 @@
 /* eslint-disable react/prop-types */
 import { Component } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -9,6 +8,7 @@ import Text from "metabase/components/type/Text";
 import Button from "metabase/core/components/Button";
 import CS from "metabase/css/core/index.css";
 import Users from "metabase/entities/users";
+import { connect } from "metabase/lib/redux";
 
 // NOTE: we have to load the list of users because /api/user/:id doesn't return deactivated users
 // but that's ok because it's probably already loaded through the people PeopleListingApp
diff --git a/frontend/src/metabase/admin/people/containers/UserPasswordResetModal.jsx b/frontend/src/metabase/admin/people/containers/UserPasswordResetModal.jsx
index a936f01067e91b97f0f23edc19b82499f328e9cd..b56223043c885382ff00ba7de59ba86d2519d7ff 100644
--- a/frontend/src/metabase/admin/people/containers/UserPasswordResetModal.jsx
+++ b/frontend/src/metabase/admin/people/containers/UserPasswordResetModal.jsx
@@ -1,7 +1,6 @@
 /* eslint-disable react/prop-types */
 import cx from "classnames";
 import { Component } from "react";
-import { connect } from "react-redux";
 import { goBack } from "react-router-redux";
 import { t } from "ttag";
 import _ from "underscore";
@@ -11,6 +10,7 @@ import PasswordReveal from "metabase/components/PasswordReveal";
 import Button from "metabase/core/components/Button";
 import CS from "metabase/css/core/index.css";
 import Users from "metabase/entities/users";
+import { connect } from "metabase/lib/redux";
 import MetabaseSettings from "metabase/lib/settings";
 
 import { clearTemporaryPassword } from "../people";
diff --git a/frontend/src/metabase/admin/people/containers/UserSuccessModal.jsx b/frontend/src/metabase/admin/people/containers/UserSuccessModal.jsx
index bad2bca70b11a18ab339a82d2b0492c17d9318c9..72989d520ebd6442f4c5b6b2a58f8c0cc4c7bff1 100644
--- a/frontend/src/metabase/admin/people/containers/UserSuccessModal.jsx
+++ b/frontend/src/metabase/admin/people/containers/UserSuccessModal.jsx
@@ -1,7 +1,6 @@
 /* eslint-disable react/prop-types */
 import cx from "classnames";
 import { Component } from "react";
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import { jt, t } from "ttag";
 import _ from "underscore";
@@ -12,6 +11,7 @@ import Button from "metabase/core/components/Button";
 import Link from "metabase/core/components/Link";
 import CS from "metabase/css/core/index.css";
 import Users from "metabase/entities/users";
+import { connect } from "metabase/lib/redux";
 import { getSetting, isSsoEnabled } from "metabase/selectors/settings";
 
 import { clearTemporaryPassword } from "../people";
diff --git a/frontend/src/metabase/admin/permissions/components/CollectionPermissionsModal/CollectionPermissionsModal.jsx b/frontend/src/metabase/admin/permissions/components/CollectionPermissionsModal/CollectionPermissionsModal.jsx
index 36f6560cb3e4bf90de4a772b6084757292fdcb67..12f4382d640d077f3068d0a848bafacfb04d566d 100644
--- a/frontend/src/metabase/admin/permissions/components/CollectionPermissionsModal/CollectionPermissionsModal.jsx
+++ b/frontend/src/metabase/admin/permissions/components/CollectionPermissionsModal/CollectionPermissionsModal.jsx
@@ -1,6 +1,5 @@
 import PropTypes from "prop-types";
 import { useCallback, useEffect } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -11,6 +10,7 @@ import Link from "metabase/core/components/Link";
 import CS from "metabase/css/core/index.css";
 import Collections from "metabase/entities/collections";
 import Groups from "metabase/entities/groups";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 
 import {
diff --git a/frontend/src/metabase/admin/permissions/components/ToolbarUpsell/ToolbarUpsell.tsx b/frontend/src/metabase/admin/permissions/components/ToolbarUpsell/ToolbarUpsell.tsx
index a5cca4d3b1a1f61d0790271c8b5fb2bde360f4c3..bb72d74b673c776277b149e51e92b57a1e864dde 100644
--- a/frontend/src/metabase/admin/permissions/components/ToolbarUpsell/ToolbarUpsell.tsx
+++ b/frontend/src/metabase/admin/permissions/components/ToolbarUpsell/ToolbarUpsell.tsx
@@ -1,9 +1,9 @@
-import { connect } from "react-redux";
 import { jt, t } from "ttag";
 
 import { useDocsUrl } from "metabase/common/hooks";
 import PopoverWithTrigger from "metabase/components/PopoverWithTrigger";
 import ExternalLink from "metabase/core/components/ExternalLink";
+import { connect } from "metabase/lib/redux";
 import { getUpgradeUrl } from "metabase/selectors/settings";
 import type { State } from "metabase-types/store";
 
diff --git a/frontend/src/metabase/admin/permissions/pages/CollectionPermissionsPage/CollectionPermissionsPage.tsx b/frontend/src/metabase/admin/permissions/pages/CollectionPermissionsPage/CollectionPermissionsPage.tsx
index 87fd5c269e2ad7a0282537a1892115436704916e..bb60541ca22d33daae4fc847fb77d75f837cdb3b 100644
--- a/frontend/src/metabase/admin/permissions/pages/CollectionPermissionsPage/CollectionPermissionsPage.tsx
+++ b/frontend/src/metabase/admin/permissions/pages/CollectionPermissionsPage/CollectionPermissionsPage.tsx
@@ -1,5 +1,4 @@
 import { useCallback, useEffect } from "react";
-import { connect } from "react-redux";
 import type { Route } from "react-router";
 import { push } from "react-router-redux";
 import { t } from "ttag";
@@ -8,6 +7,7 @@ import _ from "underscore";
 import { CollectionPermissionsHelp } from "metabase/admin/permissions/components/CollectionPermissionsHelp";
 import Collections from "metabase/entities/collections";
 import Groups from "metabase/entities/groups";
+import { connect } from "metabase/lib/redux";
 import type { Collection, CollectionId, GroupId } from "metabase-types/api";
 import type { State } from "metabase-types/store";
 
diff --git a/frontend/src/metabase/admin/permissions/pages/DatabasePermissionsPage/DatabasesPermissionsPage.jsx b/frontend/src/metabase/admin/permissions/pages/DatabasePermissionsPage/DatabasesPermissionsPage.jsx
index 35054b256e595c2f790295fd162fad823100588c..6c3b9d4778484db21dfb56adcd066213c2702cd2 100644
--- a/frontend/src/metabase/admin/permissions/pages/DatabasePermissionsPage/DatabasesPermissionsPage.jsx
+++ b/frontend/src/metabase/admin/permissions/pages/DatabasePermissionsPage/DatabasesPermissionsPage.jsx
@@ -1,14 +1,13 @@
 import { bindActionCreators } from "@reduxjs/toolkit";
 import PropTypes from "prop-types";
 import { Fragment, useCallback } from "react";
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import { useAsync } from "react-use";
 import { t } from "ttag";
 import _ from "underscore";
 
 import { PermissionsEditorLegacyNoSelfServiceWarning } from "metabase/admin/permissions/components/PermissionsEditor/PermissionsEditorLegacyWarning";
-import { useDispatch, useSelector } from "metabase/lib/redux";
+import { connect, useDispatch, useSelector } from "metabase/lib/redux";
 import { PLUGIN_ADVANCED_PERMISSIONS } from "metabase/plugins";
 import { getSetting } from "metabase/selectors/settings";
 import { PermissionsApi } from "metabase/services";
diff --git a/frontend/src/metabase/admin/permissions/pages/GroupDataPermissionsPage/GroupsPermissionsPage.jsx b/frontend/src/metabase/admin/permissions/pages/GroupDataPermissionsPage/GroupsPermissionsPage.jsx
index 28a456118632229cd1de7eb0259cdfe1f258f08a..4737f8669cf958f52c1a8be48be8c279ddf2b735 100644
--- a/frontend/src/metabase/admin/permissions/pages/GroupDataPermissionsPage/GroupsPermissionsPage.jsx
+++ b/frontend/src/metabase/admin/permissions/pages/GroupDataPermissionsPage/GroupsPermissionsPage.jsx
@@ -1,14 +1,13 @@
 import { bindActionCreators } from "@reduxjs/toolkit";
 import PropTypes from "prop-types";
 import { Fragment, useCallback } from "react";
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import { useAsync } from "react-use";
 import { t } from "ttag";
 import _ from "underscore";
 
 import { PermissionsEditorLegacyNoSelfServiceWarning } from "metabase/admin/permissions/components/PermissionsEditor/PermissionsEditorLegacyWarning";
-import { useDispatch, useSelector } from "metabase/lib/redux";
+import { connect, useDispatch, useSelector } from "metabase/lib/redux";
 import { PLUGIN_ADVANCED_PERMISSIONS } from "metabase/plugins";
 import { getSetting } from "metabase/selectors/settings";
 import { PermissionsApi } from "metabase/services";
diff --git a/frontend/src/metabase/admin/settings/app/components/SettingsEditor/SettingsEditor.jsx b/frontend/src/metabase/admin/settings/app/components/SettingsEditor/SettingsEditor.jsx
index bb7a94a42c9b3adc0af33d24ac6cab7b06124fee..3646a202d06a4ff97a27bcd6d04418298ce3193f 100644
--- a/frontend/src/metabase/admin/settings/app/components/SettingsEditor/SettingsEditor.jsx
+++ b/frontend/src/metabase/admin/settings/app/components/SettingsEditor/SettingsEditor.jsx
@@ -3,7 +3,6 @@ import { bindActionCreators } from "@reduxjs/toolkit";
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Component, createRef } from "react";
-import { connect } from "react-redux";
 import { Link } from "react-router";
 import { t } from "ttag";
 import _ from "underscore";
@@ -17,6 +16,7 @@ import SaveStatus from "metabase/components/SaveStatus";
 import AdminS from "metabase/css/admin.module.css";
 import CS from "metabase/css/core/index.css";
 import title from "metabase/hoc/Title";
+import { connect } from "metabase/lib/redux";
 import MetabaseSettings from "metabase/lib/settings";
 import { Box } from "metabase/ui";
 
diff --git a/frontend/src/metabase/admin/settings/auth/containers/GoogleAuthCard/GoogleAuthCard.tsx b/frontend/src/metabase/admin/settings/auth/containers/GoogleAuthCard/GoogleAuthCard.tsx
index a5833f4f93c9cbde6859ee5bd4e4e3e4473f92be..d9eb699e36b15200ba451c16a95ec00b749b44a5 100644
--- a/frontend/src/metabase/admin/settings/auth/containers/GoogleAuthCard/GoogleAuthCard.tsx
+++ b/frontend/src/metabase/admin/settings/auth/containers/GoogleAuthCard/GoogleAuthCard.tsx
@@ -1,7 +1,7 @@
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import { updateSettings } from "metabase/admin/settings/settings";
+import { connect } from "metabase/lib/redux";
 import { getSetting } from "metabase/selectors/settings";
 import type { Dispatch, State } from "metabase-types/store";
 
diff --git a/frontend/src/metabase/admin/settings/auth/containers/GoogleAuthForm/GoogleAuthForm.tsx b/frontend/src/metabase/admin/settings/auth/containers/GoogleAuthForm/GoogleAuthForm.tsx
index 8299c408416288f8bb19dd85dcaf93fa1a93d0fe..d4260d263b09e89ccfdfc0458afbff29e5e44d4c 100644
--- a/frontend/src/metabase/admin/settings/auth/containers/GoogleAuthForm/GoogleAuthForm.tsx
+++ b/frontend/src/metabase/admin/settings/auth/containers/GoogleAuthForm/GoogleAuthForm.tsx
@@ -1,5 +1,4 @@
-import { connect } from "react-redux";
-
+import { connect } from "metabase/lib/redux";
 import { getSetting } from "metabase/selectors/settings";
 import type { State } from "metabase-types/store";
 
diff --git a/frontend/src/metabase/admin/settings/auth/containers/LdapAuthCard/LdapAuthCard.tsx b/frontend/src/metabase/admin/settings/auth/containers/LdapAuthCard/LdapAuthCard.tsx
index 4790d2fa00fa0867c6900640f9b96f1116a9c0c7..a51c970481e5b968cbe55d40ab381d03c55771b3 100644
--- a/frontend/src/metabase/admin/settings/auth/containers/LdapAuthCard/LdapAuthCard.tsx
+++ b/frontend/src/metabase/admin/settings/auth/containers/LdapAuthCard/LdapAuthCard.tsx
@@ -1,7 +1,7 @@
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import { updateSettings } from "metabase/admin/settings/settings";
+import { connect } from "metabase/lib/redux";
 import { getSetting } from "metabase/selectors/settings";
 import type { Dispatch, State } from "metabase-types/store";
 
diff --git a/frontend/src/metabase/admin/settings/components/SettingsLdapForm.tsx b/frontend/src/metabase/admin/settings/components/SettingsLdapForm.tsx
index d731684709a934e61b2bd48fc8d9a96334bd7f51..bba80e845afc76e9c016d12144b5c5f2a0b01e2d 100644
--- a/frontend/src/metabase/admin/settings/components/SettingsLdapForm.tsx
+++ b/frontend/src/metabase/admin/settings/components/SettingsLdapForm.tsx
@@ -1,5 +1,4 @@
 import { useCallback, useMemo } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 import type { TestConfig } from "yup";
@@ -20,6 +19,7 @@ import {
   FormSwitch,
   FormTextInput,
 } from "metabase/forms";
+import { connect } from "metabase/lib/redux";
 import { PLUGIN_LDAP_FORM_FIELDS } from "metabase/plugins";
 import { Group, Radio, Stack } from "metabase/ui";
 import type { SettingKey, Settings } from "metabase-types/api";
diff --git a/frontend/src/metabase/admin/settings/components/SettingsLicense/SettingsLicense.tsx b/frontend/src/metabase/admin/settings/components/SettingsLicense/SettingsLicense.tsx
index 6bdcd95eafecaf06109cfaccc4ac70c9833555ff..96122e29a0406e9da896b882a2de49fbfbeaaf28 100644
--- a/frontend/src/metabase/admin/settings/components/SettingsLicense/SettingsLicense.tsx
+++ b/frontend/src/metabase/admin/settings/components/SettingsLicense/SettingsLicense.tsx
@@ -1,8 +1,8 @@
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import Button from "metabase/core/components/Button";
 import ExternalLink from "metabase/core/components/ExternalLink";
+import { connect } from "metabase/lib/redux";
 import { getUpgradeUrl } from "metabase/selectors/settings";
 import type { State } from "metabase-types/store";
 
diff --git a/frontend/src/metabase/admin/settings/components/UploadSettings/UploadSettingsForm.tsx b/frontend/src/metabase/admin/settings/components/UploadSettings/UploadSettingsForm.tsx
index 35b19b0a1ecf40001cba15a8ee8eea0113be3510..0e6d546203036fd8f5322946a2b2963e732c6315 100644
--- a/frontend/src/metabase/admin/settings/components/UploadSettings/UploadSettingsForm.tsx
+++ b/frontend/src/metabase/admin/settings/components/UploadSettings/UploadSettingsForm.tsx
@@ -1,6 +1,5 @@
 import type * as React from "react";
 import { useRef, useState } from "react";
-import { connect } from "react-redux";
 import { jt, t } from "ttag";
 import _ from "underscore";
 
@@ -15,7 +14,7 @@ import Select from "metabase/core/components/Select";
 import CS from "metabase/css/core/index.css";
 import Databases from "metabase/entities/databases";
 import Schemas from "metabase/entities/schemas";
-import { useDispatch } from "metabase/lib/redux";
+import { connect, useDispatch } from "metabase/lib/redux";
 import { getSetting } from "metabase/selectors/settings";
 import { Group, Stack, Text } from "metabase/ui";
 import type Database from "metabase-lib/v1/metadata/Database";
diff --git a/frontend/src/metabase/admin/settings/components/widgets/RedirectWidget/RedirectWidget.tsx b/frontend/src/metabase/admin/settings/components/widgets/RedirectWidget/RedirectWidget.tsx
index 807401778190ffca6cb1a73b4c4e14ea7f8575fc..d9a1acbb73102de48e98d5753d6c482dd761ee53 100644
--- a/frontend/src/metabase/admin/settings/components/widgets/RedirectWidget/RedirectWidget.tsx
+++ b/frontend/src/metabase/admin/settings/components/widgets/RedirectWidget/RedirectWidget.tsx
@@ -1,8 +1,9 @@
 import { useEffect } from "react";
-import { connect } from "react-redux";
 import type { LocationAction } from "react-router-redux";
 import { replace } from "react-router-redux";
 
+import { connect } from "metabase/lib/redux";
+
 interface RedirectWidgetProps {
   to: string;
   replace: LocationAction;
diff --git a/frontend/src/metabase/admin/settings/containers/GroupMappingsWidget.tsx b/frontend/src/metabase/admin/settings/containers/GroupMappingsWidget.tsx
index c08f573d4598f737545609922b7dcfec03f0cb7d..e8600615ffc178a4bd06a1603b8f7cdf346d907e 100644
--- a/frontend/src/metabase/admin/settings/containers/GroupMappingsWidget.tsx
+++ b/frontend/src/metabase/admin/settings/containers/GroupMappingsWidget.tsx
@@ -1,9 +1,9 @@
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import GroupMappingsWidget from "metabase/admin/settings/components/widgets/GroupMappingsWidget/GroupMappingsWidget";
 import { updateSetting } from "metabase/admin/settings/settings";
 import Group from "metabase/entities/groups";
+import { connect } from "metabase/lib/redux";
 import { getSetting } from "metabase/selectors/settings";
 import type { Settings } from "metabase-types/api/settings";
 import type { State } from "metabase-types/store";
diff --git a/frontend/src/metabase/admin/settings/containers/RedirectToAllowedSettings.jsx b/frontend/src/metabase/admin/settings/containers/RedirectToAllowedSettings.jsx
index a0085448c19d18ae88310719de01fd787ac4857a..b26edf5058fe791a4485dd7b5d8615517e8ad57f 100644
--- a/frontend/src/metabase/admin/settings/containers/RedirectToAllowedSettings.jsx
+++ b/frontend/src/metabase/admin/settings/containers/RedirectToAllowedSettings.jsx
@@ -1,8 +1,8 @@
 /* eslint-disable react/prop-types */
-import { connect } from "react-redux";
 import { push, replace } from "react-router-redux";
 
 import { getAdminPaths } from "metabase/admin/app/selectors";
+import { connect } from "metabase/lib/redux";
 
 const mapStateToProps = (state, props) => ({
   adminItems: getAdminPaths(state),
diff --git a/frontend/src/metabase/admin/settings/setup/components/SetupCheckList/SetupCheckList.jsx b/frontend/src/metabase/admin/settings/setup/components/SetupCheckList/SetupCheckList.jsx
index e6d548ee0d868af4d1cb077011a3823bf432b53a..76140005453c89bfd18ea545c291ca07b454f2d1 100644
--- a/frontend/src/metabase/admin/settings/setup/components/SetupCheckList/SetupCheckList.jsx
+++ b/frontend/src/metabase/admin/settings/setup/components/SetupCheckList/SetupCheckList.jsx
@@ -1,7 +1,6 @@
 /* eslint-disable react/prop-types */
 import cx from "classnames";
 import { Component } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import { UpsellHosting } from "metabase/admin/upsells";
@@ -9,6 +8,7 @@ import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import CS from "metabase/css/core/index.css";
 import { color } from "metabase/lib/colors";
 import { isSameOrSiteUrlOrigin } from "metabase/lib/dom";
+import { connect } from "metabase/lib/redux";
 import { getIsPaidPlan } from "metabase/selectors/settings";
 import { SetupApi } from "metabase/services";
 import { Box, Flex, Icon } from "metabase/ui";
diff --git a/frontend/src/metabase/admin/settings/slack/containers/SlackSettings/SlackSettings.tsx b/frontend/src/metabase/admin/settings/slack/containers/SlackSettings/SlackSettings.tsx
index c5ab240c36467ec2e4c120d548d3dd27851ab0fb..2416706ae5886c15b914a7cd349132e6b545e4a4 100644
--- a/frontend/src/metabase/admin/settings/slack/containers/SlackSettings/SlackSettings.tsx
+++ b/frontend/src/metabase/admin/settings/slack/containers/SlackSettings/SlackSettings.tsx
@@ -1,5 +1,4 @@
-import { connect } from "react-redux";
-
+import { connect } from "metabase/lib/redux";
 import type { State } from "metabase-types/store";
 
 import { loadManifest } from "../../actions";
diff --git a/frontend/src/metabase/admin/settings/slack/containers/SlackSetup/SlackSetup.tsx b/frontend/src/metabase/admin/settings/slack/containers/SlackSetup/SlackSetup.tsx
index 4b3d1219e916be60ebac1bb386fe58d1c0bcf31d..fa51547e57f27e22e2f1d94d5b79ffc3ba0927f2 100644
--- a/frontend/src/metabase/admin/settings/slack/containers/SlackSetup/SlackSetup.tsx
+++ b/frontend/src/metabase/admin/settings/slack/containers/SlackSetup/SlackSetup.tsx
@@ -1,6 +1,6 @@
 import type { ComponentType } from "react";
-import { connect } from "react-redux";
 
+import { connect } from "metabase/lib/redux";
 import type { State } from "metabase-types/store";
 
 import SlackSetup from "../../components/SlackSetup";
diff --git a/frontend/src/metabase/admin/settings/slack/containers/SlackSetupForm/SlackSetupForm.tsx b/frontend/src/metabase/admin/settings/slack/containers/SlackSetupForm/SlackSetupForm.tsx
index 05502880e1bf9b515b3f00e704402b84cc5deb86..74c083a9643cc2d5fe128551960a360dbe5dbf7f 100644
--- a/frontend/src/metabase/admin/settings/slack/containers/SlackSetupForm/SlackSetupForm.tsx
+++ b/frontend/src/metabase/admin/settings/slack/containers/SlackSetupForm/SlackSetupForm.tsx
@@ -1,4 +1,4 @@
-import { connect } from "react-redux";
+import { connect } from "metabase/lib/redux";
 
 import { updateSettings } from "../../actions";
 import SlackSetupForm from "../../components/SlackSetupForm";
diff --git a/frontend/src/metabase/admin/settings/slack/containers/SlackStatus/SlackStatus.tsx b/frontend/src/metabase/admin/settings/slack/containers/SlackStatus/SlackStatus.tsx
index 7f68d5c0c8a67d9066fc6db81588e72f9cd872e8..5b82e8dbf40aef58705b09cf9128384bbb9f223a 100644
--- a/frontend/src/metabase/admin/settings/slack/containers/SlackStatus/SlackStatus.tsx
+++ b/frontend/src/metabase/admin/settings/slack/containers/SlackStatus/SlackStatus.tsx
@@ -1,5 +1,4 @@
-import { connect } from "react-redux";
-
+import { connect } from "metabase/lib/redux";
 import type { State } from "metabase-types/store";
 
 import { updateSettings } from "../../actions";
diff --git a/frontend/src/metabase/admin/settings/slack/containers/SlackStatusForm/SlackStatusForm.tsx b/frontend/src/metabase/admin/settings/slack/containers/SlackStatusForm/SlackStatusForm.tsx
index 5727cc60f87e4d160bc5fa2f9059a127ff5b5536..76d8a3b167a9c619dcc5ea79b206a5b3bce7156e 100644
--- a/frontend/src/metabase/admin/settings/slack/containers/SlackStatusForm/SlackStatusForm.tsx
+++ b/frontend/src/metabase/admin/settings/slack/containers/SlackStatusForm/SlackStatusForm.tsx
@@ -1,5 +1,4 @@
-import { connect } from "react-redux";
-
+import { connect } from "metabase/lib/redux";
 import type { State } from "metabase-types/store";
 
 import SlackStatusForm from "../../components/SlackStatusForm";
diff --git a/frontend/src/metabase/admin/tasks/containers/ModelCacheRefreshJobs/ModelCacheRefreshJobModal.tsx b/frontend/src/metabase/admin/tasks/containers/ModelCacheRefreshJobs/ModelCacheRefreshJobModal.tsx
index a4298bc5bcb556b3681a67bb5e49850b3f5d07cc..14106e60fe823892918cee6a132307602f3dd913 100644
--- a/frontend/src/metabase/admin/tasks/containers/ModelCacheRefreshJobs/ModelCacheRefreshJobModal.tsx
+++ b/frontend/src/metabase/admin/tasks/containers/ModelCacheRefreshJobs/ModelCacheRefreshJobModal.tsx
@@ -1,5 +1,4 @@
 import { useEffect, useMemo } from "react";
-import { connect } from "react-redux";
 import { usePrevious } from "react-use";
 import { t } from "ttag";
 import _ from "underscore";
@@ -9,6 +8,7 @@ import Button from "metabase/core/components/Button";
 import Link from "metabase/core/components/Link";
 import ButtonsS from "metabase/css/components/buttons.module.css";
 import PersistedModels from "metabase/entities/persisted-models";
+import { connect } from "metabase/lib/redux";
 import type { ModelCacheRefreshStatus } from "metabase-types/api";
 
 import { ErrorBox } from "./ModelCacheRefreshJobs.styled";
diff --git a/frontend/src/metabase/admin/tasks/containers/ModelCacheRefreshJobs/ModelCacheRefreshJobs.tsx b/frontend/src/metabase/admin/tasks/containers/ModelCacheRefreshJobs/ModelCacheRefreshJobs.tsx
index 6422b507faf959c7bc1cc3684604de47646c801d..8c70e90730a9ebf4b13dc31a09aaff079866a2ba 100644
--- a/frontend/src/metabase/admin/tasks/containers/ModelCacheRefreshJobs/ModelCacheRefreshJobs.tsx
+++ b/frontend/src/metabase/admin/tasks/containers/ModelCacheRefreshJobs/ModelCacheRefreshJobs.tsx
@@ -1,7 +1,6 @@
 import cx from "classnames";
 import moment from "moment-timezone"; // eslint-disable-line no-restricted-imports -- deprecated usage
 import { useCallback } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import NoResults from "assets/img/no_results.svg";
@@ -15,6 +14,7 @@ import CS from "metabase/css/core/index.css";
 import PersistedModels from "metabase/entities/persisted-models";
 import { usePagination } from "metabase/hooks/use-pagination";
 import { capitalize } from "metabase/lib/formatting";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import { Icon } from "metabase/ui";
 import { checkCanRefreshModelCache } from "metabase-lib/v1/metadata/utils/models";
diff --git a/frontend/src/metabase/admin/tools/containers/Tools.tsx b/frontend/src/metabase/admin/tools/containers/Tools.tsx
index 7dfad435f0ba977facc948f0e8d23b4201667e89..7e9dd78bd6793105ea58748e1786fa465a0f04f1 100644
--- a/frontend/src/metabase/admin/tools/containers/Tools.tsx
+++ b/frontend/src/metabase/admin/tools/containers/Tools.tsx
@@ -1,10 +1,10 @@
 import type { Location } from "history";
 import type * as React from "react";
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import { t } from "ttag";
 
 import Radio from "metabase/core/components/Radio";
+import { connect } from "metabase/lib/redux";
 import { PLUGIN_ADMIN_TOOLS } from "metabase/plugins";
 import { getSetting } from "metabase/selectors/settings";
 import type { State } from "metabase-types/store";
diff --git a/frontend/src/metabase/admin/utils.js b/frontend/src/metabase/admin/utils.js
index ef045a374080cbc9520c4bd821322be89ef4a32e..757febff1802f491fd4958f168ebc4878f5c0129 100644
--- a/frontend/src/metabase/admin/utils.js
+++ b/frontend/src/metabase/admin/utils.js
@@ -1,8 +1,8 @@
-import { connect } from "react-redux";
 import { replace, routerActions } from "react-router-redux";
 import { connectedReduxRedirect } from "redux-auth-wrapper/history3/redirect";
 
 import { getAdminPaths } from "metabase/admin/app/selectors";
+import { connect } from "metabase/lib/redux";
 import { getUser } from "metabase/selectors/user";
 
 export const createAdminRouteGuard = (routeKey, Component) => {
diff --git a/frontend/src/metabase/api/api.ts b/frontend/src/metabase/api/api.ts
index a888f8004e358216c7e146e258d2253070ba735f..61d02831c09a0d211206e4569855166322dca357 100644
--- a/frontend/src/metabase/api/api.ts
+++ b/frontend/src/metabase/api/api.ts
@@ -1,12 +1,36 @@
-import { createApi, skipToken } from "@reduxjs/toolkit/query/react";
-export { skipToken };
+import {
+  buildCreateApi,
+  coreModule,
+  reactHooksModule,
+  skipToken,
+} from "@reduxjs/toolkit/query/react";
+import {
+  createDispatchHook,
+  createSelectorHook,
+  createStoreHook,
+} from "react-redux";
+
+import { MetabaseReduxContext } from "metabase/lib/redux";
 
 import { apiQuery } from "./query";
 import { TAG_TYPES } from "./tags";
 
+const createApi = buildCreateApi(
+  coreModule(),
+  reactHooksModule({
+    hooks: {
+      useDispatch: createDispatchHook(MetabaseReduxContext),
+      useSelector: createSelectorHook(MetabaseReduxContext),
+      useStore: createStoreHook(MetabaseReduxContext),
+    },
+  }),
+);
+
 export const Api = createApi({
   reducerPath: "metabase-api",
   tagTypes: TAG_TYPES,
   baseQuery: apiQuery,
   endpoints: () => ({}),
 });
+
+export { skipToken };
diff --git a/frontend/src/metabase/app.js b/frontend/src/metabase/app.js
index 568b378424556a0a16ceb87d1b9b2e89c075505c..f4d240af26b1253e86c4650de21dca604343743d 100644
--- a/frontend/src/metabase/app.js
+++ b/frontend/src/metabase/app.js
@@ -31,7 +31,6 @@ import { createHistory } from "history";
 import { DragDropContextProvider } from "react-dnd";
 import HTML5Backend from "react-dnd-html5-backend";
 import { createRoot } from "react-dom/client";
-import { Provider } from "react-redux";
 import { Router, useRouterHistory } from "react-router";
 import { syncHistoryWithStore } from "react-router-redux";
 
@@ -39,6 +38,7 @@ import { createTracker } from "metabase/lib/analytics";
 import api from "metabase/lib/api";
 import { initializeEmbedding } from "metabase/lib/embed";
 import { captureConsoleErrors } from "metabase/lib/errors";
+import { MetabaseReduxProvider } from "metabase/lib/redux/custom-context";
 import MetabaseSettings from "metabase/lib/settings";
 import { PLUGIN_APP_INIT_FUNCTIONS } from "metabase/plugins";
 import { refreshSiteSettings } from "metabase/redux/settings";
@@ -71,7 +71,7 @@ function _init(reducers, getRoutes, callback) {
   const root = createRoot(document.getElementById("root"));
 
   root.render(
-    <Provider store={store}>
+    <MetabaseReduxProvider store={store}>
       <EmotionCacheProvider>
         <DragDropContextProvider backend={HTML5Backend} context={{ window }}>
           <ThemeProvider>
@@ -80,7 +80,7 @@ function _init(reducers, getRoutes, callback) {
           </ThemeProvider>
         </DragDropContextProvider>
       </EmotionCacheProvider>
-    </Provider>,
+    </MetabaseReduxProvider>,
   );
 
   registerVisualizations();
diff --git a/frontend/src/metabase/browse/containers/TableBrowser/TableBrowser.jsx b/frontend/src/metabase/browse/containers/TableBrowser/TableBrowser.jsx
index 37ea6879b89cb6a413819e9be23b698c78556c31..fc1d24ae57fd375098c3691d12d93c4729bf2328 100644
--- a/frontend/src/metabase/browse/containers/TableBrowser/TableBrowser.jsx
+++ b/frontend/src/metabase/browse/containers/TableBrowser/TableBrowser.jsx
@@ -1,7 +1,7 @@
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import Tables from "metabase/entities/tables";
+import { connect } from "metabase/lib/redux";
 import { isSyncInProgress } from "metabase/lib/syncing";
 import * as Urls from "metabase/lib/urls";
 import { getMetadata } from "metabase/selectors/metadata";
diff --git a/frontend/src/metabase/collections/components/ActionMenu/ActionMenu.tsx b/frontend/src/metabase/collections/components/ActionMenu/ActionMenu.tsx
index 67a206669437c2f1d7798e45d01e9adfdc18c813..4206bfd957fe890befed07e3decc7e83dc8dedb6 100644
--- a/frontend/src/metabase/collections/components/ActionMenu/ActionMenu.tsx
+++ b/frontend/src/metabase/collections/components/ActionMenu/ActionMenu.tsx
@@ -1,5 +1,4 @@
 import { useCallback, useMemo, useState } from "react";
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import { t } from "ttag";
 
@@ -21,7 +20,7 @@ import {
 } from "metabase/collections/utils";
 import { ConfirmDeleteModal } from "metabase/components/ConfirmDeleteModal";
 import { bookmarks as BookmarkEntity } from "metabase/entities";
-import { useDispatch } from "metabase/lib/redux";
+import { connect, useDispatch } from "metabase/lib/redux";
 import { entityForObject } from "metabase/lib/schema";
 import * as Urls from "metabase/lib/urls";
 import { addUndo } from "metabase/redux/undo";
diff --git a/frontend/src/metabase/collections/components/CollectionCopyEntityModal.tsx b/frontend/src/metabase/collections/components/CollectionCopyEntityModal.tsx
index ed999397e6e56af7ff157dfa86930de6acec84e6..6190592711842db426e04ff669e83d118276351f 100644
--- a/frontend/src/metabase/collections/components/CollectionCopyEntityModal.tsx
+++ b/frontend/src/metabase/collections/components/CollectionCopyEntityModal.tsx
@@ -1,11 +1,11 @@
 import { dissoc } from "icepick";
 import { useState } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import Collections from "metabase/entities/collections";
 import EntityCopyModal from "metabase/entities/containers/EntityCopyModal";
 import withToast from "metabase/hoc/Toast";
+import { connect } from "metabase/lib/redux";
 import { entityTypeForObject } from "metabase/lib/schema";
 
 function mapStateToProps(state: any, props: any) {
diff --git a/frontend/src/metabase/collections/components/CreateCollectionForm/CreateCollectionForm.tsx b/frontend/src/metabase/collections/components/CreateCollectionForm/CreateCollectionForm.tsx
index 35dd389d02e33c319fdfa0d029bab4505c8f7289..3b1046f474f5a33171917d5dc94cb9ad95255ff9 100644
--- a/frontend/src/metabase/collections/components/CreateCollectionForm/CreateCollectionForm.tsx
+++ b/frontend/src/metabase/collections/components/CreateCollectionForm/CreateCollectionForm.tsx
@@ -1,5 +1,4 @@
 import { useCallback, useMemo } from "react";
-import { connect } from "react-redux";
 import { withRouter } from "react-router";
 import { t } from "ttag";
 import _ from "underscore";
@@ -19,6 +18,7 @@ import Collections, {
 import { Form, FormProvider } from "metabase/forms";
 import { color } from "metabase/lib/colors";
 import * as Errors from "metabase/lib/errors";
+import { connect } from "metabase/lib/redux";
 import type { Collection } from "metabase-types/api";
 import type { State } from "metabase-types/store";
 
diff --git a/frontend/src/metabase/collections/containers/CollectionHeader/CollectionHeader.tsx b/frontend/src/metabase/collections/containers/CollectionHeader/CollectionHeader.tsx
index 4125269830f43f6a7388ea7847f792d1dcc3f5a6..d0a1ee19a443527f3ea3faff185388dec0f9a94c 100644
--- a/frontend/src/metabase/collections/containers/CollectionHeader/CollectionHeader.tsx
+++ b/frontend/src/metabase/collections/containers/CollectionHeader/CollectionHeader.tsx
@@ -1,6 +1,5 @@
-import { connect } from "react-redux";
-
 import Collections from "metabase/entities/collections";
+import { connect } from "metabase/lib/redux";
 import { uploadFile } from "metabase/redux/uploads";
 import type { Collection } from "metabase-types/api";
 
diff --git a/frontend/src/metabase/collections/containers/CreateCollectionModal.tsx b/frontend/src/metabase/collections/containers/CreateCollectionModal.tsx
index bbffd11f3f2f626acef5513b2e791ea4caa6efd8..ca421d270c9b3b66441b4d7daf865f03c46d4952 100644
--- a/frontend/src/metabase/collections/containers/CreateCollectionModal.tsx
+++ b/frontend/src/metabase/collections/containers/CreateCollectionModal.tsx
@@ -1,9 +1,9 @@
 import type { LocationDescriptor } from "history";
 import { useCallback } from "react";
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import { t } from "ttag";
 
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import { Modal } from "metabase/ui";
 import type { Collection } from "metabase-types/api";
diff --git a/frontend/src/metabase/components/AdminAwareEmptyState/AdminAwareEmptyState.jsx b/frontend/src/metabase/components/AdminAwareEmptyState/AdminAwareEmptyState.jsx
index 131913f82843aefc2cf290e824b8f74bfba662f8..f11655f111a42f63d9df2ff5a63e303bfb91c4a0 100644
--- a/frontend/src/metabase/components/AdminAwareEmptyState/AdminAwareEmptyState.jsx
+++ b/frontend/src/metabase/components/AdminAwareEmptyState/AdminAwareEmptyState.jsx
@@ -1,8 +1,8 @@
 /* eslint-disable react/prop-types */
 import { Component } from "react";
-import { connect } from "react-redux";
 
 import EmptyState from "metabase/components/EmptyState";
+import { connect } from "metabase/lib/redux";
 import { getUser } from "metabase/selectors/user";
 
 /*
diff --git a/frontend/src/metabase/components/ArchiveCollectionModal/ArchiveCollectionModal.jsx b/frontend/src/metabase/components/ArchiveCollectionModal/ArchiveCollectionModal.jsx
index f8a6738e10d1ba1259f5146f9f2bd5527503cce8..39fcfa36589d4e564dba919b1b3ce80169943ca4 100644
--- a/frontend/src/metabase/components/ArchiveCollectionModal/ArchiveCollectionModal.jsx
+++ b/frontend/src/metabase/components/ArchiveCollectionModal/ArchiveCollectionModal.jsx
@@ -1,6 +1,5 @@
 /* eslint-disable react/prop-types */
 import { Component } from "react";
-import { connect } from "react-redux";
 import { withRouter } from "react-router";
 import { push } from "react-router-redux";
 import { t } from "ttag";
@@ -8,6 +7,7 @@ import _ from "underscore";
 
 import { ArchiveModal } from "metabase/components/ArchiveModal";
 import Collection from "metabase/entities/collections";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 
 const mapDispatchToProps = {
diff --git a/frontend/src/metabase/components/CollectionList/CollectionList.jsx b/frontend/src/metabase/components/CollectionList/CollectionList.jsx
index 56be31c2d9fedd813d9eb44ff43a61495903d3e5..f1a1be51eb7f48d34a115d0d7a12624c8e8295a1 100644
--- a/frontend/src/metabase/components/CollectionList/CollectionList.jsx
+++ b/frontend/src/metabase/components/CollectionList/CollectionList.jsx
@@ -1,9 +1,9 @@
 import PropTypes from "prop-types";
-import { connect } from "react-redux";
 
 import CollectionItem from "metabase/components/CollectionItem";
 import { CollectionGridItem } from "metabase/components/CollectionList/CollectionList.styled";
 import { Grid } from "metabase/components/Grid";
+import { connect } from "metabase/lib/redux";
 import { getUser } from "metabase/selectors/user";
 
 const propTypes = {
diff --git a/frontend/src/metabase/components/FieldValuesWidget/FieldValuesWidget.tsx b/frontend/src/metabase/components/FieldValuesWidget/FieldValuesWidget.tsx
index cc6531989950b84c26ec23e5d7788987ace7f18a..5b616afc84b0950e87209259375a021a3acae403 100644
--- a/frontend/src/metabase/components/FieldValuesWidget/FieldValuesWidget.tsx
+++ b/frontend/src/metabase/components/FieldValuesWidget/FieldValuesWidget.tsx
@@ -9,7 +9,6 @@ import {
   useRef,
   useState,
 } from "react";
-import { connect } from "react-redux";
 import { useMount, usePrevious, useThrottle, useUnmount } from "react-use";
 import { jt, t } from "ttag";
 import _ from "underscore";
@@ -26,7 +25,7 @@ import Fields from "metabase/entities/fields";
 import { formatValue } from "metabase/lib/formatting";
 import { parseNumberValue } from "metabase/lib/number";
 import { defer } from "metabase/lib/promise";
-import { useDispatch } from "metabase/lib/redux";
+import { connect, useDispatch } from "metabase/lib/redux";
 import { isNotNull } from "metabase/lib/types";
 import {
   fetchCardParameterValues,
diff --git a/frontend/src/metabase/components/LastEditInfoLabel/LastEditInfoLabel.tsx b/frontend/src/metabase/components/LastEditInfoLabel/LastEditInfoLabel.tsx
index c141b62e206000f3640f142608014e3a0241f3d5..4346cfa2a0148d9ffd047eaf024cc967a111d842 100644
--- a/frontend/src/metabase/components/LastEditInfoLabel/LastEditInfoLabel.tsx
+++ b/frontend/src/metabase/components/LastEditInfoLabel/LastEditInfoLabel.tsx
@@ -1,10 +1,10 @@
 import dayjs from "dayjs";
 import type { MouseEventHandler } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import { TextButton } from "metabase/components/Button.styled";
 import DateTime from "metabase/components/DateTime";
+import { connect } from "metabase/lib/redux";
 import type { NamedUser } from "metabase/lib/user";
 import { getFullName } from "metabase/lib/user";
 import { getUser } from "metabase/selectors/user";
diff --git a/frontend/src/metabase/components/MetadataInfo/ColumnFingerprintInfo/CategoryFingerprint.jsx b/frontend/src/metabase/components/MetadataInfo/ColumnFingerprintInfo/CategoryFingerprint.jsx
index b4a832df686628c1decd9c17e29410bf16b4658b..ad4e2ead261d762bca539c70ba131710ac204ed0 100644
--- a/frontend/src/metabase/components/MetadataInfo/ColumnFingerprintInfo/CategoryFingerprint.jsx
+++ b/frontend/src/metabase/components/MetadataInfo/ColumnFingerprintInfo/CategoryFingerprint.jsx
@@ -1,9 +1,9 @@
 import PropTypes from "prop-types";
-import { connect } from "react-redux";
 import { msgid, ngettext, t } from "ttag";
 
 import { useGetFieldValuesQuery } from "metabase/api";
 import { formatNumber } from "metabase/lib/formatting";
+import { connect } from "metabase/lib/redux";
 import { getMetadata } from "metabase/selectors/metadata";
 
 import {
diff --git a/frontend/src/metabase/components/MetadataInfo/TableInfo/TableInfo.tsx b/frontend/src/metabase/components/MetadataInfo/TableInfo/TableInfo.tsx
index a9c6125813f874fe6c8dee66d80845f613b27f4f..e00b28984dc6d99c6da1d7346070b45a2dae3813 100644
--- a/frontend/src/metabase/components/MetadataInfo/TableInfo/TableInfo.tsx
+++ b/frontend/src/metabase/components/MetadataInfo/TableInfo/TableInfo.tsx
@@ -1,10 +1,10 @@
 import { useEffect, useState } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
 import Tables from "metabase/entities/tables";
 import { useSafeAsyncFunction } from "metabase/hooks/use-safe-async-function";
+import { connect } from "metabase/lib/redux";
 import type Table from "metabase-lib/v1/metadata/Table";
 
 import {
diff --git a/frontend/src/metabase/components/SaveStatus/SaveStatus.jsx b/frontend/src/metabase/components/SaveStatus/SaveStatus.jsx
index b735569e59b2194a3db2b1d909b5ddd640c653b7..1a10dfae20ba776ffd702130e6c2ec12bfc1faaa 100644
--- a/frontend/src/metabase/components/SaveStatus/SaveStatus.jsx
+++ b/frontend/src/metabase/components/SaveStatus/SaveStatus.jsx
@@ -1,9 +1,9 @@
 /* eslint-disable react/prop-types */
 import { Component } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
+import { connect } from "metabase/lib/redux";
 import { addUndo, dismissUndo } from "metabase/redux/undo";
 
 class SaveStatus extends Component {
diff --git a/frontend/src/metabase/containers/AdHocQuestionLoader.jsx b/frontend/src/metabase/containers/AdHocQuestionLoader.jsx
index ba7d0fbb0638d9603eee936101576ff7f556b10c..faec8d37855f3a7819724f41bd469da00aa2fb1f 100644
--- a/frontend/src/metabase/containers/AdHocQuestionLoader.jsx
+++ b/frontend/src/metabase/containers/AdHocQuestionLoader.jsx
@@ -1,8 +1,8 @@
 /* eslint-disable react/prop-types */
 import { Component } from "react";
-import { connect } from "react-redux";
 
 import { deserializeCardFromUrl } from "metabase/lib/card";
+import { connect } from "metabase/lib/redux";
 import { loadMetadataForCard } from "metabase/questions/actions";
 import { getMetadata } from "metabase/selectors/metadata";
 import Question from "metabase-lib/v1/Question";
diff --git a/frontend/src/metabase/containers/NewItemMenu/NewItemMenu.tsx b/frontend/src/metabase/containers/NewItemMenu/NewItemMenu.tsx
index 97b47689e575621623e77e2d2ae65e8b674673fe..3aa44ce2d8edc28b85318d2702a2f12988dbbb34 100644
--- a/frontend/src/metabase/containers/NewItemMenu/NewItemMenu.tsx
+++ b/frontend/src/metabase/containers/NewItemMenu/NewItemMenu.tsx
@@ -1,10 +1,10 @@
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import _ from "underscore";
 
 import NewItemMenu from "metabase/components/NewItemMenu";
 import Databases from "metabase/entities/databases";
 import Search from "metabase/entities/search";
+import { connect } from "metabase/lib/redux";
 import { closeNavbar } from "metabase/redux/app";
 import {
   getHasDataAccess,
diff --git a/frontend/src/metabase/containers/NotFoundFallbackPage.tsx b/frontend/src/metabase/containers/NotFoundFallbackPage.tsx
index 41e0a485ef01abc53a5f3bcc2effa68dc55b68be..a23e7562238978140d397fc7d0b9b1aa14bf0362 100644
--- a/frontend/src/metabase/containers/NotFoundFallbackPage.tsx
+++ b/frontend/src/metabase/containers/NotFoundFallbackPage.tsx
@@ -1,8 +1,8 @@
 import type { LocationDescriptor } from "history";
-import { connect } from "react-redux";
 import { replace } from "react-router-redux";
 import { useMount } from "react-use";
 
+import { connect } from "metabase/lib/redux";
 import { refreshCurrentUser } from "metabase/redux/user";
 
 import { NotFound } from "../components/ErrorPages";
diff --git a/frontend/src/metabase/containers/SchedulePicker.tsx b/frontend/src/metabase/containers/SchedulePicker.tsx
index 918d5c38532f8bc41b5aa5af097025d43864d124..320a8b878c038b3671b7cb7ba770be7dd6cc6b0d 100644
--- a/frontend/src/metabase/containers/SchedulePicker.tsx
+++ b/frontend/src/metabase/containers/SchedulePicker.tsx
@@ -1,7 +1,6 @@
-import { connect } from "react-redux";
-
 import type { SchedulePickerProps } from "metabase/components/SchedulePicker";
 import SchedulePicker from "metabase/components/SchedulePicker";
+import { connect } from "metabase/lib/redux";
 import { getSetting } from "metabase/selectors/settings";
 import type { State } from "metabase-types/store";
 
diff --git a/frontend/src/metabase/dashboard/components/ActionSidebar/ActionSidebar.tsx b/frontend/src/metabase/dashboard/components/ActionSidebar/ActionSidebar.tsx
index 170603bcf8351a766d07bb4f0282d97daf6d5ada..a58bdf18f41c9eb07266bebd600ee3d8e309c60e 100644
--- a/frontend/src/metabase/dashboard/components/ActionSidebar/ActionSidebar.tsx
+++ b/frontend/src/metabase/dashboard/components/ActionSidebar/ActionSidebar.tsx
@@ -1,5 +1,4 @@
 import { useMemo, useRef } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import ActionViz from "metabase/actions/components/ActionViz";
@@ -17,6 +16,7 @@ import FormSelect from "metabase/core/components/FormSelect";
 import { closeSidebar } from "metabase/dashboard/actions";
 import { Sidebar } from "metabase/dashboard/components/Sidebar";
 import { Form, FormProvider } from "metabase/forms";
+import { connect } from "metabase/lib/redux";
 import type {
   ActionDashboardCard,
   Dashboard,
diff --git a/frontend/src/metabase/dashboard/components/ClickMappings.jsx b/frontend/src/metabase/dashboard/components/ClickMappings.jsx
index 0d720a31d9eabe08e8c0c4215e9ab1b7b68557d2..a937284c25e2c2bb88cf84459abd3cb9d50a78c0 100644
--- a/frontend/src/metabase/dashboard/components/ClickMappings.jsx
+++ b/frontend/src/metabase/dashboard/components/ClickMappings.jsx
@@ -2,7 +2,6 @@
 import cx from "classnames";
 import { assocIn, dissocIn, getIn } from "icepick";
 import { Component } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -10,6 +9,7 @@ import Select from "metabase/core/components/Select";
 import CS from "metabase/css/core/index.css";
 import { getParameters } from "metabase/dashboard/selectors";
 import { isPivotGroupColumn } from "metabase/lib/data_grid";
+import { connect } from "metabase/lib/redux";
 import MetabaseSettings from "metabase/lib/settings";
 import { loadMetadataForCard } from "metabase/questions/actions";
 import { getMetadata } from "metabase/selectors/metadata";
diff --git a/frontend/src/metabase/dashboard/components/DashCard/DashCardActionsPanel/ActionSettingsButton/ActionSettingsButton.tsx b/frontend/src/metabase/dashboard/components/DashCard/DashCardActionsPanel/ActionSettingsButton/ActionSettingsButton.tsx
index c7039f2d38046304fdad79bfbeb3cf2f2a91cf61..554da217e394eaa85b8e6ce5e80e8278a2342b51 100644
--- a/frontend/src/metabase/dashboard/components/DashCard/DashCardActionsPanel/ActionSettingsButton/ActionSettingsButton.tsx
+++ b/frontend/src/metabase/dashboard/components/DashCard/DashCardActionsPanel/ActionSettingsButton/ActionSettingsButton.tsx
@@ -1,8 +1,8 @@
 import { useEffect } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import { setEditingDashcardId } from "metabase/dashboard/actions";
+import { connect } from "metabase/lib/redux";
 import type { ActionDashboardCard, Dashboard } from "metabase-types/api";
 
 import { DashCardActionButton } from "../DashCardActionButton/DashCardActionButton";
diff --git a/frontend/src/metabase/dashboard/components/DashCard/DashCardParameterMapper/DashCardCardParameterMapper.tsx b/frontend/src/metabase/dashboard/components/DashCard/DashCardParameterMapper/DashCardCardParameterMapper.tsx
index 2d889e37ae0b4f597f1326d813f6b5b084072bd6..8dc7b490e1f214ed84040773371090fb20bec381 100644
--- a/frontend/src/metabase/dashboard/components/DashCard/DashCardParameterMapper/DashCardCardParameterMapper.tsx
+++ b/frontend/src/metabase/dashboard/components/DashCard/DashCardParameterMapper/DashCardCardParameterMapper.tsx
@@ -1,4 +1,3 @@
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -10,6 +9,7 @@ import {
   getQuestionByCard,
 } from "metabase/dashboard/selectors";
 import { isNativeDashCard, isQuestionDashCard } from "metabase/dashboard/utils";
+import { connect } from "metabase/lib/redux";
 import type { ParameterMappingOption } from "metabase/parameters/utils/mapping-options";
 import { getIsRecentlyAutoConnectedDashcard } from "metabase/redux/undo";
 import { Flex, Icon, Text, Transition } from "metabase/ui";
diff --git a/frontend/src/metabase/dashboard/components/DashboardCopyModal.jsx b/frontend/src/metabase/dashboard/components/DashboardCopyModal.jsx
index 0a2db19ce6444cf4fe80ca1b3230bd0aefc80187..0ff005aa5817ec846d5c85fece837f9e80349042 100644
--- a/frontend/src/metabase/dashboard/components/DashboardCopyModal.jsx
+++ b/frontend/src/metabase/dashboard/components/DashboardCopyModal.jsx
@@ -1,7 +1,6 @@
 /* eslint-disable react/prop-types */
 import { dissoc } from "icepick";
 import { useState } from "react";
-import { connect } from "react-redux";
 import { withRouter } from "react-router";
 import { replace } from "react-router-redux";
 import { t } from "ttag";
@@ -10,6 +9,7 @@ import _ from "underscore";
 import Collections from "metabase/entities/collections";
 import EntityCopyModal from "metabase/entities/containers/EntityCopyModal";
 import Dashboards from "metabase/entities/dashboards";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 
 import { getDashboardComplete } from "../selectors";
diff --git a/frontend/src/metabase/dashboard/components/DashboardGrid.tsx b/frontend/src/metabase/dashboard/components/DashboardGrid.tsx
index ef76b7ab99407b72ec45077da9ac520e8fd048c1..afabf1294706b7527f5753768d8be8c434388942 100644
--- a/frontend/src/metabase/dashboard/components/DashboardGrid.tsx
+++ b/frontend/src/metabase/dashboard/components/DashboardGrid.tsx
@@ -2,7 +2,6 @@ import cx from "classnames";
 import type { ComponentType } from "react";
 import { Component } from "react";
 import type { ConnectedProps } from "react-redux";
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import { t } from "ttag";
 import _ from "underscore";
@@ -30,6 +29,7 @@ import {
   GRID_WIDTH,
   MIN_ROW_HEIGHT,
 } from "metabase/lib/dashboard_grid";
+import { connect } from "metabase/lib/redux";
 import EmbedFrameS from "metabase/public/components/EmbedFrame/EmbedFrame.module.css";
 import { addUndo } from "metabase/redux/undo";
 import { getVisualizationRaw } from "metabase/visualizations";
diff --git a/frontend/src/metabase/dashboard/components/DashboardMoveModal.tsx b/frontend/src/metabase/dashboard/components/DashboardMoveModal.tsx
index 9b73e12e23432fc13620ba0a78c8112f07623fca..fc64dcfe46307e276c5cee6f8e465bb1d961cfa6 100644
--- a/frontend/src/metabase/dashboard/components/DashboardMoveModal.tsx
+++ b/frontend/src/metabase/dashboard/components/DashboardMoveModal.tsx
@@ -1,4 +1,3 @@
-import { connect } from "react-redux";
 import { c, t } from "ttag";
 import _ from "underscore";
 
@@ -6,6 +5,7 @@ import { MoveModal } from "metabase/containers/MoveModal";
 import Collection, { ROOT_COLLECTION } from "metabase/entities/collections";
 import Dashboards from "metabase/entities/dashboards";
 import { color } from "metabase/lib/colors";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import { Icon } from "metabase/ui";
 import type { CollectionId, Dashboard, DashboardId } from "metabase-types/api";
diff --git a/frontend/src/metabase/dashboard/components/QuestionPicker/QuestionPicker.jsx b/frontend/src/metabase/dashboard/components/QuestionPicker/QuestionPicker.jsx
index 11fc712c4fbe92ac6d303f61340c1bfaef736189..1e2d1c995aed0a0fd0a4fdb1cb6d1c0c1b7997bc 100644
--- a/frontend/src/metabase/dashboard/components/QuestionPicker/QuestionPicker.jsx
+++ b/frontend/src/metabase/dashboard/components/QuestionPicker/QuestionPicker.jsx
@@ -1,6 +1,5 @@
 import PropTypes from "prop-types";
 import { useState } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -14,7 +13,7 @@ import { entityObjectLoader } from "metabase/entities/containers/EntityObjectLoa
 import { useDebouncedValue } from "metabase/hooks/use-debounced-value";
 import { getCrumbs } from "metabase/lib/collections";
 import { SEARCH_DEBOUNCE_DURATION } from "metabase/lib/constants";
-import { useSelector } from "metabase/lib/redux";
+import { connect, useSelector } from "metabase/lib/redux";
 import { PLUGIN_COLLECTIONS } from "metabase/plugins";
 import { Icon } from "metabase/ui";
 
diff --git a/frontend/src/metabase/dashboard/containers/ArchiveDashboardModal.jsx b/frontend/src/metabase/dashboard/containers/ArchiveDashboardModal.jsx
index 20dd994ec5edf87cd6353105901c536f911bab2d..4d44add1e93d4b63577e669177909c450de956e4 100644
--- a/frontend/src/metabase/dashboard/containers/ArchiveDashboardModal.jsx
+++ b/frontend/src/metabase/dashboard/containers/ArchiveDashboardModal.jsx
@@ -1,7 +1,6 @@
 /* eslint-disable react/prop-types */
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 import { withRouter } from "react-router";
 import { push } from "react-router-redux";
 import { t } from "ttag";
@@ -11,6 +10,7 @@ import { ArchiveModal } from "metabase/components/ArchiveModal";
 import { setArchivedDashboard } from "metabase/dashboard/actions";
 import Collection from "metabase/entities/collections";
 import Dashboards from "metabase/entities/dashboards";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 
 const mapDispatchToProps = dispatch => ({
diff --git a/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx b/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx
index 2a9b8ee6122f2778d6d2224ad0bc5b2db9a405d0..34bc05c4338283f499fd6f77bf10edec478b13f5 100644
--- a/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx
+++ b/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx
@@ -2,7 +2,6 @@
 import cx from "classnames";
 import { dissoc } from "icepick";
 import { Component } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -21,6 +20,7 @@ import Dashboards from "metabase/entities/dashboards";
 import title from "metabase/hoc/Title";
 import withToast from "metabase/hoc/Toast";
 import { color } from "metabase/lib/colors";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import { ParametersList } from "metabase/parameters/components/ParametersList";
 import { getMetadata } from "metabase/selectors/metadata";
diff --git a/frontend/src/metabase/dashboard/containers/CreateDashboardForm.tsx b/frontend/src/metabase/dashboard/containers/CreateDashboardForm.tsx
index 72d11c6b7c209c2132eeb4afd95695b85cc49cff..5d128e393f9d51f122d8b8331fb0c77e8d73ce32 100644
--- a/frontend/src/metabase/dashboard/containers/CreateDashboardForm.tsx
+++ b/frontend/src/metabase/dashboard/containers/CreateDashboardForm.tsx
@@ -1,5 +1,4 @@
 import { useCallback, useMemo } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 import * as Yup from "yup";
@@ -16,6 +15,7 @@ import Collections from "metabase/entities/collections";
 import Dashboards from "metabase/entities/dashboards";
 import { Form, FormProvider } from "metabase/forms";
 import * as Errors from "metabase/lib/errors";
+import { connect } from "metabase/lib/redux";
 import type { CollectionId, Dashboard } from "metabase-types/api";
 import type { State } from "metabase-types/store";
 
diff --git a/frontend/src/metabase/dashboard/containers/CreateDashboardModal.tsx b/frontend/src/metabase/dashboard/containers/CreateDashboardModal.tsx
index faf96939b200fca4f7d5f41d8bdd91b71dd5cdd8..624e326b9acf75c02d8ae0395850e8dfedb7c90c 100644
--- a/frontend/src/metabase/dashboard/containers/CreateDashboardModal.tsx
+++ b/frontend/src/metabase/dashboard/containers/CreateDashboardModal.tsx
@@ -1,10 +1,10 @@
 import type { LocationDescriptor } from "history";
 import { useCallback } from "react";
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import { t } from "ttag";
 
 import ModalContent from "metabase/components/ModalContent";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import type { Dashboard } from "metabase-types/api";
 import type { State } from "metabase-types/store";
diff --git a/frontend/src/metabase/dashboard/containers/DashboardApp/DashboardApp.tsx b/frontend/src/metabase/dashboard/containers/DashboardApp/DashboardApp.tsx
index bbd88211e90f78e7b621bcf74a2a383b6842b439..c0c069f2eb42baeb7612704543b0dcda92d2904b 100644
--- a/frontend/src/metabase/dashboard/containers/DashboardApp/DashboardApp.tsx
+++ b/frontend/src/metabase/dashboard/containers/DashboardApp/DashboardApp.tsx
@@ -2,7 +2,6 @@ import cx from "classnames";
 import type { ReactNode } from "react";
 import { useCallback, useEffect } from "react";
 import type { ConnectedProps } from "react-redux";
-import { connect } from "react-redux";
 import type { Route, WithRouterProps } from "react-router";
 import { push } from "react-router-redux";
 import { useUnmount } from "react-use";
@@ -24,7 +23,7 @@ import { useLoadingTimer } from "metabase/hooks/use-loading-timer";
 import { useUniqueId } from "metabase/hooks/use-unique-id";
 import { useWebNotification } from "metabase/hooks/use-web-notification";
 import { parseHashOptions } from "metabase/lib/browser";
-import { useDispatch } from "metabase/lib/redux";
+import { connect, useDispatch } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import { closeNavbar, setErrorPage } from "metabase/redux/app";
 import { addUndo, dismissUndo } from "metabase/redux/undo";
diff --git a/frontend/src/metabase/dashboard/hoc/DashboardData.jsx b/frontend/src/metabase/dashboard/hoc/DashboardData.jsx
index 427e8379db5733bada51fb80c4261fe75ab8dbe4..d372ca879fb695309074eadd9239d20bb6051b8d 100644
--- a/frontend/src/metabase/dashboard/hoc/DashboardData.jsx
+++ b/frontend/src/metabase/dashboard/hoc/DashboardData.jsx
@@ -1,6 +1,5 @@
 /* eslint-disable react/prop-types */
 import { Component } from "react";
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import _ from "underscore";
 
@@ -14,6 +13,7 @@ import {
   getSelectedTabId,
   getSlowCards,
 } from "metabase/dashboard/selectors";
+import { connect } from "metabase/lib/redux";
 import { setErrorPage } from "metabase/redux/app";
 
 const mapStateToProps = (state, props) => {
diff --git a/frontend/src/metabase/entities/containers/EntityListLoader.jsx b/frontend/src/metabase/entities/containers/EntityListLoader.jsx
index 254d89e483601fc172372efeeb80bd2f03097b24..a437cf6fa410e4b5d01ee66420585b5947a448b1 100644
--- a/frontend/src/metabase/entities/containers/EntityListLoader.jsx
+++ b/frontend/src/metabase/entities/containers/EntityListLoader.jsx
@@ -2,12 +2,12 @@
 import { createSelector } from "@reduxjs/toolkit";
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import paginationState from "metabase/hoc/PaginationState";
 import { capitalize } from "metabase/lib/formatting";
+import { connect } from "metabase/lib/redux";
 
 import entityType from "./EntityType";
 
diff --git a/frontend/src/metabase/entities/containers/EntityObjectLoader.jsx b/frontend/src/metabase/entities/containers/EntityObjectLoader.jsx
index bb691eef0b8ed3bedd2fdbe7d1c08ab77a2f5c51..2be01b1342aa6b48dfc7412d63bc8f84a3e7e083 100644
--- a/frontend/src/metabase/entities/containers/EntityObjectLoader.jsx
+++ b/frontend/src/metabase/entities/containers/EntityObjectLoader.jsx
@@ -1,10 +1,10 @@
 /* eslint-disable react/prop-types */
 import { createSelector } from "@reduxjs/toolkit";
 import { Component } from "react";
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
+import { connect } from "metabase/lib/redux";
 
 import entityType from "./EntityType";
 
diff --git a/frontend/src/metabase/entities/containers/EntityType.jsx b/frontend/src/metabase/entities/containers/EntityType.jsx
index 400e888313665cda482c5a9983e5a559c44ed65e..b48b92926184adc1a01dd468fe746045263d547a 100644
--- a/frontend/src/metabase/entities/containers/EntityType.jsx
+++ b/frontend/src/metabase/entities/containers/EntityType.jsx
@@ -1,7 +1,8 @@
 /* eslint-disable react/prop-types */
 import { bindActionCreators } from "@reduxjs/toolkit";
 import { Component } from "react";
-import { connect } from "react-redux";
+
+import { connect } from "metabase/lib/redux";
 
 /**
  * @deprecated HOCs are deprecated
diff --git a/frontend/src/metabase/env.ts b/frontend/src/metabase/env.ts
index 40ac3d501db42c73c07c21032217fd9c9132857f..304aeaa0754afa85aa9f36cea589c369e53c78c4 100644
--- a/frontend/src/metabase/env.ts
+++ b/frontend/src/metabase/env.ts
@@ -1,15 +1,45 @@
+const tryOrDefault = <T>(fn: () => T, defaultValue: T): T => {
+  try {
+    return fn();
+  } catch (e) {
+    console.warn(
+      "Error while trying to get env",
+      e,
+      `returning default: ${defaultValue}`,
+    );
+    return defaultValue;
+  }
+};
+
 // @ts-expect-error window.Cypress is not typed
-export const isCypressActive = !!window.Cypress;
+export const isCypressActive = tryOrDefault(() => !!window.Cypress, false);
 
-export const isStorybookActive = !!process.env.STORYBOOK;
+export const isStorybookActive = tryOrDefault(
+  () => !!process.env.STORYBOOK,
+  false,
+);
 
-export const isProduction = process.env.WEBPACK_BUNDLE === "production";
+export const isProduction = tryOrDefault(
+  () => process.env.WEBPACK_BUNDLE === "production",
+  false,
+);
 
-export const isTest = process.env.NODE_ENV === "test";
+export const isTest = tryOrDefault(
+  () => process.env.NODE_ENV === "test",
+  false,
+);
 
-export const shouldLogAnalytics = process.env.MB_LOG_ANALYTICS === "true";
+export const shouldLogAnalytics = tryOrDefault(
+  () => process.env.MB_LOG_ANALYTICS === "true",
+  false,
+);
 
-export const isChartsDebugLoggingEnabled =
-  process.env.MB_LOG_CHARTS_DEBUG === "true";
+export const isChartsDebugLoggingEnabled = tryOrDefault(
+  () => process.env.MB_LOG_CHARTS_DEBUG === "true",
+  false,
+);
 
-export const isEmbeddingSdk = !!process.env.IS_EMBEDDING_SDK;
+export const isEmbeddingSdk = tryOrDefault(
+  () => !!process.env.IS_EMBEDDING_SDK,
+  false,
+);
diff --git a/frontend/src/metabase/hoc/ModalRoute.tsx b/frontend/src/metabase/hoc/ModalRoute.tsx
index 7c7e33b6c3e610821f1f69056071b328dddb66c4..185a5231200fce89b45a6ef3c07dcc89026ecd45 100644
--- a/frontend/src/metabase/hoc/ModalRoute.tsx
+++ b/frontend/src/metabase/hoc/ModalRoute.tsx
@@ -1,11 +1,11 @@
 import type { LocationDescriptor } from "history";
 import { Component } from "react";
 import * as React from "react";
-import { connect } from "react-redux";
 import { Route } from "react-router";
 import { push } from "react-router-redux";
 
 import Modal from "metabase/components/Modal";
+import { connect } from "metabase/lib/redux";
 import MetabaseSettings from "metabase/lib/settings";
 
 type IRoute = {
diff --git a/frontend/src/metabase/hoc/Remapped.jsx b/frontend/src/metabase/hoc/Remapped.jsx
index d63f8c22fdccaad22a26bed6416685791a9efdca..fd7b182e4323b2c74e22726b05c77040cb2a375a 100644
--- a/frontend/src/metabase/hoc/Remapped.jsx
+++ b/frontend/src/metabase/hoc/Remapped.jsx
@@ -1,7 +1,7 @@
 /* eslint-disable react/prop-types */
 import { Component } from "react";
-import { connect } from "react-redux";
 
+import { connect } from "metabase/lib/redux";
 import { fetchRemapping } from "metabase/redux/metadata";
 import { getMetadata } from "metabase/selectors/metadata";
 
diff --git a/frontend/src/metabase/hoc/Routeless.jsx b/frontend/src/metabase/hoc/Routeless.jsx
index c2beb49ca72cfa81b13813bdb37f2d0093b6c1f3..128d0626e4384bba65e52db9cbaedfa5c8437259 100644
--- a/frontend/src/metabase/hoc/Routeless.jsx
+++ b/frontend/src/metabase/hoc/Routeless.jsx
@@ -1,9 +1,10 @@
 /* eslint-disable react/prop-types */
 import { Component } from "react";
-import { connect } from "react-redux";
 import { goBack, push } from "react-router-redux";
 import _ from "underscore";
 
+import { connect } from "metabase/lib/redux";
+
 // namespace under _routeless_
 const mapStateToProps = (state, props) => ({
   _routeless_location: state.routing.locationBeforeTransitions,
diff --git a/frontend/src/metabase/hoc/Toast.jsx b/frontend/src/metabase/hoc/Toast.jsx
index 9df49fddf5dc90de455d410468045d568ba7a7c0..39ae0441aca88881a6f1286c301b2a84a533323d 100644
--- a/frontend/src/metabase/hoc/Toast.jsx
+++ b/frontend/src/metabase/hoc/Toast.jsx
@@ -1,7 +1,7 @@
 /* eslint-disable react/prop-types */
 import { Component } from "react";
-import { connect } from "react-redux";
 
+import { connect } from "metabase/lib/redux";
 import { addUndo } from "metabase/redux/undo";
 
 const mapDispatchToProps = {
diff --git a/frontend/src/metabase/lib/redux/custom-context.tsx b/frontend/src/metabase/lib/redux/custom-context.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..3c357f3ced9c4a8d9f8fb2363a525f8349ee7261
--- /dev/null
+++ b/frontend/src/metabase/lib/redux/custom-context.tsx
@@ -0,0 +1,34 @@
+import type { Store } from "@reduxjs/toolkit";
+import { createContext } from "react";
+import { Provider, ReactReduxContext } from "react-redux";
+// eslint-disable-next-line no-restricted-imports
+import * as ReactRedux from "react-redux";
+
+import { isEmbeddingSdk } from "metabase/env";
+
+export const MetabaseReduxContext = isEmbeddingSdk
+  ? createContext<any>(null)
+  : ReactReduxContext;
+
+export const MetabaseReduxProvider = ({
+  children,
+  store,
+}: React.PropsWithChildren & { store: Store }) => {
+  return (
+    <Provider store={store} context={MetabaseReduxContext}>
+      {children}
+    </Provider>
+  );
+};
+
+export const connect: typeof ReactRedux.connect = (
+  mapStateToProps?: any,
+  mapDispatchToProps?: any,
+  mergeProps?: any,
+  options?: any,
+) => {
+  return ReactRedux.connect(mapStateToProps, mapDispatchToProps, mergeProps, {
+    context: MetabaseReduxContext,
+    ...options,
+  });
+};
diff --git a/frontend/src/metabase/lib/redux/hooks.ts b/frontend/src/metabase/lib/redux/hooks.ts
index 10622e92acbfec4d7949cd8002184cac6a03a76c..dcb1d8604a61f3e939d0cb942091f863cade8632 100644
--- a/frontend/src/metabase/lib/redux/hooks.ts
+++ b/frontend/src/metabase/lib/redux/hooks.ts
@@ -1,16 +1,20 @@
 import type { AnyAction, Store, ThunkDispatch } from "@reduxjs/toolkit";
 import type { TypedUseSelectorHook } from "react-redux";
 import {
-  useDispatch as useDispatchOriginal,
-  useSelector as useSelectorOriginal,
-  useStore as useStoreOriginal,
+  createDispatchHook,
+  createSelectorHook,
+  createStoreHook,
 } from "react-redux";
 
 import type { State } from "metabase-types/store";
 
-export const useStore: () => Store<State, AnyAction> = useStoreOriginal;
+import { MetabaseReduxContext } from "./custom-context";
+
+export const useStore: () => Store<State, AnyAction> =
+  createStoreHook(MetabaseReduxContext);
 export const useDispatch: () => ThunkDispatch<State, void, AnyAction> =
-  useDispatchOriginal;
-export const useSelector: TypedUseSelectorHook<State> = useSelectorOriginal;
+  createDispatchHook(MetabaseReduxContext);
+export const useSelector: TypedUseSelectorHook<State> =
+  createSelectorHook(MetabaseReduxContext);
 
 export type DispatchFn = ReturnType<typeof useDispatch>;
diff --git a/frontend/src/metabase/lib/redux/index.ts b/frontend/src/metabase/lib/redux/index.ts
index 325110e8681af52c4b8d721608761032afba4fb9..260997d43d1b5b5e94ab497b2a550a9573988e52 100644
--- a/frontend/src/metabase/lib/redux/index.ts
+++ b/frontend/src/metabase/lib/redux/index.ts
@@ -1,3 +1,4 @@
 export * from "./utils";
 export * from "./typed-utils";
 export * from "./hooks";
+export * from "./custom-context";
diff --git a/frontend/src/metabase/models/components/ModelDetailPage/ModelActionDetails/ModelActionDetails.tsx b/frontend/src/metabase/models/components/ModelDetailPage/ModelActionDetails/ModelActionDetails.tsx
index 0e55c07d388a701b3027e97358ec22f148182cae..39e8b4227af54a96df52e3cb54fc55bb6fbdee7d 100644
--- a/frontend/src/metabase/models/components/ModelDetailPage/ModelActionDetails/ModelActionDetails.tsx
+++ b/frontend/src/metabase/models/components/ModelDetailPage/ModelActionDetails/ModelActionDetails.tsx
@@ -1,5 +1,4 @@
 import { useCallback, useMemo } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -8,6 +7,7 @@ import Link from "metabase/core/components/Link";
 import Actions from "metabase/entities/actions";
 import Databases from "metabase/entities/databases";
 import { useConfirmation } from "metabase/hooks/use-confirmation";
+import { connect } from "metabase/lib/redux";
 import { parseTimestamp } from "metabase/lib/time";
 import * as Urls from "metabase/lib/urls";
 import type Question from "metabase-lib/v1/Question";
diff --git a/frontend/src/metabase/models/containers/ModelDetailPage/ModelDetailPage.tsx b/frontend/src/metabase/models/containers/ModelDetailPage/ModelDetailPage.tsx
index 16a9d67ddd3d00e6dba32ec6659693ea79320fe6..0e3be191a4455d6d17b3d0cde2910d54db66ee13 100644
--- a/frontend/src/metabase/models/containers/ModelDetailPage/ModelDetailPage.tsx
+++ b/frontend/src/metabase/models/containers/ModelDetailPage/ModelDetailPage.tsx
@@ -1,7 +1,6 @@
 import type { Location, LocationDescriptor } from "history";
 import type * as React from "react";
 import { useCallback, useEffect, useMemo, useState } from "react";
-import { connect } from "react-redux";
 import { replace } from "react-router-redux";
 import { useMount } from "react-use";
 import _ from "underscore";
@@ -12,7 +11,7 @@ import Databases from "metabase/entities/databases";
 import Questions from "metabase/entities/questions";
 import Tables from "metabase/entities/tables";
 import title from "metabase/hoc/Title";
-import { useSelector } from "metabase/lib/redux";
+import { connect, useSelector } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import ModelDetailPageView from "metabase/models/components/ModelDetailPage";
 import { loadMetadataForCard } from "metabase/questions/actions";
diff --git a/frontend/src/metabase/nav/components/ProfileLink/ProfileLink.jsx b/frontend/src/metabase/nav/components/ProfileLink/ProfileLink.jsx
index 4f31e1157fb70b577ce0c974bc9bd35b59a35ead..512aefd4b362fd5b1b05432efffe12cb6a1de285 100644
--- a/frontend/src/metabase/nav/components/ProfileLink/ProfileLink.jsx
+++ b/frontend/src/metabase/nav/components/ProfileLink/ProfileLink.jsx
@@ -1,7 +1,6 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { useState } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -22,7 +21,7 @@ import {
 } from "metabase/home/selectors";
 import { color } from "metabase/lib/colors";
 import { capitalize } from "metabase/lib/formatting";
-import { useSelector } from "metabase/lib/redux";
+import { connect, useSelector } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import { openDiagnostics } from "metabase/redux/app";
 import {
@@ -199,7 +198,6 @@ function ProfileLink({
           )}
         </Modal>
       ) : null}
-
       {modalOpen === "diagnostic" && (
         <ErrorDiagnosticModalWrapper isModalOpen={true} onClose={closeModal} />
       )}
diff --git a/frontend/src/metabase/nav/containers/AppBar/AppBar.tsx b/frontend/src/metabase/nav/containers/AppBar/AppBar.tsx
index d8ac9a57c3f6e681dde14194b767396ea4284f42..0af5940965e54e7af3be9eaf1264ce3584300038 100644
--- a/frontend/src/metabase/nav/containers/AppBar/AppBar.tsx
+++ b/frontend/src/metabase/nav/containers/AppBar/AppBar.tsx
@@ -1,9 +1,9 @@
-import { connect } from "react-redux";
 import { withRouter } from "react-router";
 import _ from "underscore";
 
 import { logout } from "metabase/auth/actions";
 import Collections from "metabase/entities/collections";
+import { connect } from "metabase/lib/redux";
 import { closeNavbar, toggleNavbar } from "metabase/redux/app";
 import type { RouterProps } from "metabase/selectors/app";
 import {
diff --git a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbar.tsx b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbar.tsx
index 6bb8ba6838e2b54b7f7a4458ac2cd1d309d47f8b..9941547c89f19c717443d04441cc2044bf11111b 100644
--- a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbar.tsx
+++ b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbar.tsx
@@ -1,12 +1,12 @@
 import type { LocationDescriptor } from "history";
 import { useEffect, useMemo } from "react";
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import _ from "underscore";
 
 import { skipToken, useGetCollectionQuery } from "metabase/api";
 import { useQuestionQuery } from "metabase/common/hooks";
 import { getDashboard } from "metabase/dashboard/selectors";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import { closeNavbar, openNavbar } from "metabase/redux/app";
 import type Question from "metabase-lib/v1/Question";
diff --git a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/BookmarkList/BookmarkList.tsx b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/BookmarkList/BookmarkList.tsx
index b6203199eb684a5b6c5a6f88461327d2547028c0..a16d0662aa59f02393e67012b3b104b01c7d0993 100644
--- a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/BookmarkList/BookmarkList.tsx
+++ b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/BookmarkList/BookmarkList.tsx
@@ -9,7 +9,6 @@ import {
   verticalListSortingStrategy,
 } from "@dnd-kit/sortable";
 import { useCallback, useEffect, useState } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import CollapseSection from "metabase/components/CollapseSection";
@@ -18,6 +17,7 @@ import Tooltip from "metabase/core/components/Tooltip";
 import GrabberS from "metabase/css/components/grabber.module.css";
 import CS from "metabase/css/core/index.css";
 import Bookmarks from "metabase/entities/bookmarks";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import { PLUGIN_COLLECTIONS } from "metabase/plugins";
 import { Icon } from "metabase/ui";
diff --git a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/MainNavbarContainer.tsx b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/MainNavbarContainer.tsx
index 5ed0456608ffc9db13787dc4e27068456fbbae75..a58efe206e05b308164eb5ea46ce89e3aff2c642 100644
--- a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/MainNavbarContainer.tsx
+++ b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/MainNavbarContainer.tsx
@@ -1,6 +1,5 @@
 import type { LocationDescriptor } from "history";
 import { memo, useCallback, useMemo, useState } from "react";
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import {
@@ -22,6 +21,7 @@ import Collections, {
   getCollectionIcon,
 } from "metabase/entities/collections";
 import Databases from "metabase/entities/databases";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import { getHasDataAccess } from "metabase/selectors/data";
 import { getUser, getUserIsAdmin } from "metabase/selectors/user";
diff --git a/frontend/src/metabase/nav/containers/Navbar.tsx b/frontend/src/metabase/nav/containers/Navbar.tsx
index e6dfaf3a000f4ade0f270b8370632c343ad401af..a6f349021bcfb0b8a767589a8653bb90c0e3b2e5 100644
--- a/frontend/src/metabase/nav/containers/Navbar.tsx
+++ b/frontend/src/metabase/nav/containers/Navbar.tsx
@@ -1,11 +1,11 @@
 import type { Location } from "history";
 import { useMemo } from "react";
-import { connect } from "react-redux";
 import { withRouter } from "react-router";
 import _ from "underscore";
 
 import { getAdminPaths } from "metabase/admin/app/selectors";
 import Database from "metabase/entities/databases";
+import { connect } from "metabase/lib/redux";
 import { getIsNavbarOpen } from "metabase/selectors/app";
 import { getUser } from "metabase/selectors/user";
 import type { User } from "metabase-types/api";
diff --git a/frontend/src/metabase/nav/containers/QuestionLineage/QuestionLineage.tsx b/frontend/src/metabase/nav/containers/QuestionLineage/QuestionLineage.tsx
index 69322fa599cee67f44343022f29d5f992c5d57f7..431355feeb563637c49c30fc0096cdb69a507d6d 100644
--- a/frontend/src/metabase/nav/containers/QuestionLineage/QuestionLineage.tsx
+++ b/frontend/src/metabase/nav/containers/QuestionLineage/QuestionLineage.tsx
@@ -1,5 +1,4 @@
-import { connect } from "react-redux";
-
+import { connect } from "metabase/lib/redux";
 import {
   getOriginalQuestion,
   getQuestion,
diff --git a/frontend/src/metabase/parameters/components/ValuesSourceModal/ValuesSourceTypeModal.tsx b/frontend/src/metabase/parameters/components/ValuesSourceModal/ValuesSourceTypeModal.tsx
index 9e30874c8a0176a9a334a0e6855d916ced6e6b13..290246a801386fa749710764bd7de296686f1b11 100644
--- a/frontend/src/metabase/parameters/components/ValuesSourceModal/ValuesSourceTypeModal.tsx
+++ b/frontend/src/metabase/parameters/components/ValuesSourceModal/ValuesSourceTypeModal.tsx
@@ -1,6 +1,5 @@
 import type { ChangeEvent } from "react";
 import { useCallback, useLayoutEffect, useMemo, useState } from "react";
-import { connect } from "react-redux";
 import { jt, t } from "ttag";
 import _ from "underscore";
 
@@ -15,7 +14,7 @@ import SelectButton from "metabase/core/components/SelectButton";
 import Questions from "metabase/entities/questions";
 import Tables from "metabase/entities/tables";
 import { useSafeAsyncFunction } from "metabase/hooks/use-safe-async-function";
-import { useSelector } from "metabase/lib/redux";
+import { connect, useSelector } from "metabase/lib/redux";
 import { getLearnUrl } from "metabase/selectors/settings";
 import { getShowMetabaseLinks } from "metabase/selectors/whitelabel";
 import { Box, Flex, Icon } from "metabase/ui";
diff --git a/frontend/src/metabase/public/containers/PublicAction/PublicActionLoader.tsx b/frontend/src/metabase/public/containers/PublicAction/PublicActionLoader.tsx
index b2b89f1993ce3d4a9aac43b1e8e874c77e3854de..1513feeb05b1f44dc0ff94a2d6ed95253400502b 100644
--- a/frontend/src/metabase/public/containers/PublicAction/PublicActionLoader.tsx
+++ b/frontend/src/metabase/public/containers/PublicAction/PublicActionLoader.tsx
@@ -1,8 +1,8 @@
 import { useCallback, useState } from "react";
-import { connect } from "react-redux";
 import { useMount } from "react-use";
 
 import { useSafeAsyncFunction } from "metabase/hooks/use-safe-async-function";
+import { connect } from "metabase/lib/redux";
 import { SyncedEmbedFrame } from "metabase/public/components/EmbedFrame";
 import { setErrorPage } from "metabase/redux/app";
 import { PublicApi } from "metabase/services";
diff --git a/frontend/src/metabase/public/containers/PublicApp/PublicApp.tsx b/frontend/src/metabase/public/containers/PublicApp/PublicApp.tsx
index 4dc0002792848f7704ae110c63a1e998fed6dc49..642697b97c8f0fdca94c91ffd86cf79908c44b34 100644
--- a/frontend/src/metabase/public/containers/PublicApp/PublicApp.tsx
+++ b/frontend/src/metabase/public/containers/PublicApp/PublicApp.tsx
@@ -1,5 +1,4 @@
-import { connect } from "react-redux";
-
+import { connect } from "metabase/lib/redux";
 import { PublicError } from "metabase/public/components/PublicError";
 import { PublicNotFound } from "metabase/public/components/PublicNotFound";
 import { getErrorPage } from "metabase/selectors/app";
diff --git a/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboard.tsx b/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboard.tsx
index 706094a49640e076a713884e4cb6062265faabef..4a7694d2504c93eed5d60cd3e9934991f371e123 100644
--- a/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboard.tsx
+++ b/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboard.tsx
@@ -1,7 +1,6 @@
 import type { Query } from "history";
 import { useEffect, useRef } from "react";
 import type { ConnectedProps } from "react-redux";
-import { connect } from "react-redux";
 import { usePrevious, useUnmount } from "react-use";
 import _ from "underscore";
 
@@ -29,6 +28,7 @@ import type {
   FetchDashboardResult,
   SuccessfulFetchDashboardResult,
 } from "metabase/dashboard/types";
+import { connect } from "metabase/lib/redux";
 import { type DispatchFn, useDispatch } from "metabase/lib/redux";
 import { LocaleProvider } from "metabase/public/LocaleProvider";
 import type { PublicOrEmbeddedDashboardEventHandlersProps } from "metabase/public/containers/PublicOrEmbeddedDashboard/types";
diff --git a/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboardView-filters.stories.tsx b/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboardView-filters.stories.tsx
index ecf7e84676ee164e4948d9c61e7696ed95fa1e04..f0150cb41b2f7919a09bbfc7773dfb3ab5a1b5e9 100644
--- a/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboardView-filters.stories.tsx
+++ b/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboardView-filters.stories.tsx
@@ -3,12 +3,12 @@ import createAsyncCallback from "@loki/create-async-callback";
 import type { StoryContext, StoryFn } from "@storybook/react";
 import { userEvent, within } from "@storybook/testing-library";
 import { type ComponentProps, useEffect } from "react";
-import { Provider } from "react-redux";
 
 import { getStore } from "__support__/entities-store";
 import { createMockMetadata } from "__support__/metadata";
 import { getNextId } from "__support__/utils";
 import { NumberColumn, StringColumn } from "__support__/visualizations";
+import { MetabaseReduxProvider } from "metabase/lib/redux/custom-context";
 import { getDashboardUiParameters } from "metabase/parameters/utils/dashboards";
 import { publicReducers } from "metabase/reducers-public";
 import TABLE_RAW_SERIES from "metabase/visualizations/components/TableSimple/stories-data/table-simple-orders-with-people.json";
@@ -101,9 +101,9 @@ function ReduxDecorator(Story: StoryFn, context: StoryContext) {
 
   const store = getStore(publicReducers, initialState);
   return (
-    <Provider store={store}>
+    <MetabaseReduxProvider store={store}>
       <Story />
-    </Provider>
+    </MetabaseReduxProvider>
   );
 }
 
diff --git a/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboardView.stories.tsx b/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboardView.stories.tsx
index 1eb763c6668977fb84342cd03056ee05a1f422fd..3a219f6715f330dac150ac7620862de4098edc6b 100644
--- a/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboardView.stories.tsx
+++ b/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboardView.stories.tsx
@@ -2,7 +2,6 @@
 import createAsyncCallback from "@loki/create-async-callback";
 import type { StoryFn } from "@storybook/react";
 import { type ComponentProps, useEffect } from "react";
-import { Provider } from "react-redux";
 
 import { getStore } from "__support__/entities-store";
 import { getNextId } from "__support__/utils";
@@ -10,6 +9,7 @@ import { NumberColumn, StringColumn } from "__support__/visualizations";
 import PopoverWithTrigger from "metabase/components/PopoverWithTrigger";
 import TippyPopoverWithTrigger from "metabase/components/PopoverWithTrigger/TippyPopoverWithTrigger";
 import LegacyTooltip from "metabase/core/components/Tooltip";
+import { MetabaseReduxProvider } from "metabase/lib/redux";
 import { publicReducers } from "metabase/reducers-public";
 import { Box, Card, Popover, Text, Tooltip } from "metabase/ui";
 import { registerVisualization } from "metabase/visualizations";
@@ -51,9 +51,9 @@ export default {
 
 function ReduxDecorator(Story: StoryFn) {
   return (
-    <Provider store={store}>
+    <MetabaseReduxProvider store={store}>
       <Story />
-    </Provider>
+    </MetabaseReduxProvider>
   );
 }
 
diff --git a/frontend/src/metabase/public/containers/PublicOrEmbeddedQuestion/PublicOrEmbeddedQuestionView.stories.tsx b/frontend/src/metabase/public/containers/PublicOrEmbeddedQuestion/PublicOrEmbeddedQuestionView.stories.tsx
index 4eb11bfcf0e976271769d5cf1b14190e917d4e94..808bf9f384344bf254d7de2b19aa7cb2d5d42119 100644
--- a/frontend/src/metabase/public/containers/PublicOrEmbeddedQuestion/PublicOrEmbeddedQuestionView.stories.tsx
+++ b/frontend/src/metabase/public/containers/PublicOrEmbeddedQuestion/PublicOrEmbeddedQuestionView.stories.tsx
@@ -3,7 +3,6 @@ import createAsyncCallback from "@loki/create-async-callback";
 import type { StoryFn } from "@storybook/react";
 import { userEvent, within } from "@storybook/testing-library";
 import { type ComponentProps, useEffect } from "react";
-import { Provider } from "react-redux";
 
 import { getStore } from "__support__/entities-store";
 import { createMockMetadata } from "__support__/metadata";
@@ -13,6 +12,7 @@ import {
   NumberColumn,
   StringColumn,
 } from "__support__/visualizations";
+import { MetabaseReduxProvider } from "metabase/lib/redux";
 import { publicReducers } from "metabase/reducers-public";
 import { Box } from "metabase/ui";
 import { registerVisualization } from "metabase/visualizations";
@@ -52,9 +52,9 @@ export default {
 
 function ReduxDecorator(Story: StoryFn) {
   return (
-    <Provider store={store}>
+    <MetabaseReduxProvider store={store}>
       <Story />
-    </Provider>
+    </MetabaseReduxProvider>
   );
 }
 
diff --git a/frontend/src/metabase/query_builder/components/AlertModals/AlertEditChannels.jsx b/frontend/src/metabase/query_builder/components/AlertModals/AlertEditChannels.jsx
index d0ff379b91a1557c65c0da31e805ca92bbf562aa..f25227acc0cd63b2a19cca1636dc48d333e9e55a 100644
--- a/frontend/src/metabase/query_builder/components/AlertModals/AlertEditChannels.jsx
+++ b/frontend/src/metabase/query_builder/components/AlertModals/AlertEditChannels.jsx
@@ -1,12 +1,12 @@
 /* eslint-disable react/prop-types */
 import cx from "classnames";
 import { Component } from "react";
-import { connect } from "react-redux";
 import { jt, t } from "ttag";
 import _ from "underscore";
 
 import CS from "metabase/css/core/index.css";
 import Users from "metabase/entities/users";
+import { connect } from "metabase/lib/redux";
 import { fetchPulseFormInput } from "metabase/pulse/actions";
 import { PulseEditChannels } from "metabase/pulse/components/PulseEditChannels";
 import { getPulseFormInput } from "metabase/pulse/selectors";
diff --git a/frontend/src/metabase/query_builder/components/AlertModals/AlertEditForm.jsx b/frontend/src/metabase/query_builder/components/AlertModals/AlertEditForm.jsx
index 2bd9ea213fdfe816fff2fc3bf5aa1db564502fc0..a5ff24160cc244f62b21bfe2c0bdb9706d8fd4d8 100644
--- a/frontend/src/metabase/query_builder/components/AlertModals/AlertEditForm.jsx
+++ b/frontend/src/metabase/query_builder/components/AlertModals/AlertEditForm.jsx
@@ -1,7 +1,7 @@
 /* eslint-disable react/prop-types */
 import { Component } from "react";
-import { connect } from "react-redux";
 
+import { connect } from "metabase/lib/redux";
 import { getUserIsAdmin } from "metabase/selectors/user";
 
 import { AlertEditChannels } from "./AlertEditChannels";
diff --git a/frontend/src/metabase/query_builder/components/AlertModals/RawDataAlertTip.jsx b/frontend/src/metabase/query_builder/components/AlertModals/RawDataAlertTip.jsx
index 1b783fe41e75d5b5582bdddab3a74d5fb688439a..cab6c5e59764b07b39f555b902268e97812077f6 100644
--- a/frontend/src/metabase/query_builder/components/AlertModals/RawDataAlertTip.jsx
+++ b/frontend/src/metabase/query_builder/components/AlertModals/RawDataAlertTip.jsx
@@ -1,8 +1,8 @@
 /* eslint-disable react/prop-types */
 import cx from "classnames";
-import { connect } from "react-redux";
 
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import {
   getQuestion,
   getVisualizationSettings,
diff --git a/frontend/src/metabase/query_builder/components/DataSelector/DataSelector.jsx b/frontend/src/metabase/query_builder/components/DataSelector/DataSelector.jsx
index 6ed0ae8039a44dd376474fb07176d71bee9956e2..c60ec747daa03563424d8a1e84928f9989e2d38b 100644
--- a/frontend/src/metabase/query_builder/components/DataSelector/DataSelector.jsx
+++ b/frontend/src/metabase/query_builder/components/DataSelector/DataSelector.jsx
@@ -2,7 +2,6 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Component, createRef } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -16,6 +15,7 @@ import Questions from "metabase/entities/questions";
 import Schemas from "metabase/entities/schemas";
 import Search from "metabase/entities/search";
 import Tables from "metabase/entities/tables";
+import { connect } from "metabase/lib/redux";
 import { getHasDataAccess } from "metabase/selectors/data";
 import { getMetadata } from "metabase/selectors/metadata";
 import { getSetting } from "metabase/selectors/settings";
diff --git a/frontend/src/metabase/query_builder/components/DataSelector/saved-entity-picker/SavedEntityPicker.jsx b/frontend/src/metabase/query_builder/components/DataSelector/saved-entity-picker/SavedEntityPicker.jsx
index ebb7401480dc6c770c8bc93c161e88a9ec660804..2944d867c89e016682798878a84db6b10fcfc012 100644
--- a/frontend/src/metabase/query_builder/components/DataSelector/saved-entity-picker/SavedEntityPicker.jsx
+++ b/frontend/src/metabase/query_builder/components/DataSelector/saved-entity-picker/SavedEntityPicker.jsx
@@ -1,6 +1,5 @@
 import PropTypes from "prop-types";
 import { useCallback, useMemo, useState } from "react";
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import {
@@ -14,6 +13,7 @@ import Collection, {
   PERSONAL_COLLECTIONS,
   buildCollectionTree,
 } from "metabase/entities/collections";
+import { connect } from "metabase/lib/redux";
 import { Icon } from "metabase/ui";
 
 import SavedEntityList from "./SavedEntityList";
diff --git a/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetEditor.jsx b/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetEditor.jsx
index 8a6ad03d2abfcb7f04d57a83bfe1b0e2ac520155..e89c56354f26ba9f3d7988aeb83f5ec82e58b4fa 100644
--- a/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetEditor.jsx
+++ b/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetEditor.jsx
@@ -2,7 +2,6 @@ import cx from "classnames";
 import { merge } from "icepick";
 import PropTypes from "prop-types";
 import { useCallback, useEffect, useMemo, useState } from "react";
-import { connect } from "react-redux";
 import { usePrevious } from "react-use";
 import { t } from "ttag";
 
@@ -15,6 +14,7 @@ import Button from "metabase/core/components/Button";
 import ButtonsS from "metabase/css/components/buttons.module.css";
 import CS from "metabase/css/core/index.css";
 import { useToggle } from "metabase/hooks/use-toggle";
+import { connect } from "metabase/lib/redux";
 import { getSemanticTypeIcon } from "metabase/lib/schema_metadata";
 import { setDatasetEditorTab } from "metabase/query_builder/actions";
 import { calcInitialEditorHeight } from "metabase/query_builder/components/NativeQueryEditor/utils";
diff --git a/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetFieldMetadataSidebar/SemanticTypePicker/FKTargetPicker.tsx b/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetFieldMetadataSidebar/SemanticTypePicker/FKTargetPicker.tsx
index 8f1612b923708fb174d1b0ffb61b991ed81aee74..a7c98e4a9596f82ddf123ae06a34e48be81610b5 100644
--- a/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetFieldMetadataSidebar/SemanticTypePicker/FKTargetPicker.tsx
+++ b/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetFieldMetadataSidebar/SemanticTypePicker/FKTargetPicker.tsx
@@ -1,11 +1,11 @@
 import { useField } from "formik";
 import { useEffect, useMemo } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
 import Select from "metabase/core/components/Select";
 import Databases from "metabase/entities/databases";
+import { connect } from "metabase/lib/redux";
 import type Field from "metabase-lib/v1/metadata/Field";
 import type { DatabaseId } from "metabase-types/api";
 
diff --git a/frontend/src/metabase/query_builder/components/NativeQueryEditor/NativeQueryEditor.tsx b/frontend/src/metabase/query_builder/components/NativeQueryEditor/NativeQueryEditor.tsx
index 7007337925bd95e7c1d0b91ecac21098bc64cd24..4f69899c8190a57a4fc64bfd398cc0b181fa5466 100644
--- a/frontend/src/metabase/query_builder/components/NativeQueryEditor/NativeQueryEditor.tsx
+++ b/frontend/src/metabase/query_builder/components/NativeQueryEditor/NativeQueryEditor.tsx
@@ -1,7 +1,6 @@
 import type { Ace } from "ace-builds";
 import * as ace from "ace-builds/src-noconflict/ace";
 import { Component, createRef } from "react";
-import { connect } from "react-redux";
 import type { ResizableBox, ResizableBoxProps } from "react-resizable";
 import slugg from "slugg";
 import { t } from "ttag";
@@ -25,6 +24,7 @@ import Snippets from "metabase/entities/snippets";
 import { SQLBehaviour } from "metabase/lib/ace/sql_behaviour";
 import { isEventOverElement } from "metabase/lib/dom";
 import { getEngineNativeAceMode } from "metabase/lib/engine";
+import { connect } from "metabase/lib/redux";
 import { checkNotNull } from "metabase/lib/types";
 import SnippetFormModal from "metabase/query_builder/components/template_tags/SnippetFormModal";
 import type { QueryModalType } from "metabase/query_builder/constants";
diff --git a/frontend/src/metabase/query_builder/components/NewDatasetModal/NewDatasetModal.jsx b/frontend/src/metabase/query_builder/components/NewDatasetModal/NewDatasetModal.jsx
index 81a34bc7a88777f9fcf365e271249026e05f5d44..d2b71b22fbc4ab1a3a04943322dd8da8d2ca38c1 100644
--- a/frontend/src/metabase/query_builder/components/NewDatasetModal/NewDatasetModal.jsx
+++ b/frontend/src/metabase/query_builder/components/NewDatasetModal/NewDatasetModal.jsx
@@ -1,11 +1,11 @@
 import PropTypes from "prop-types";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import ModalContent from "metabase/components/ModalContent";
 import Button from "metabase/core/components/Button";
 import Link from "metabase/core/components/Link";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import { turnQuestionIntoModel } from "metabase/query_builder/actions";
 
 import {
diff --git a/frontend/src/metabase/query_builder/components/dataref/TableInfoLoader.tsx b/frontend/src/metabase/query_builder/components/dataref/TableInfoLoader.tsx
index c07df2bef517dd0ad3aa20dac7946e149db8a39f..851ccdb3e32c9b74a94fd4d5e3ea4284d4fac983 100644
--- a/frontend/src/metabase/query_builder/components/dataref/TableInfoLoader.tsx
+++ b/frontend/src/metabase/query_builder/components/dataref/TableInfoLoader.tsx
@@ -1,9 +1,9 @@
 import { useEffect, useState } from "react";
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import Tables from "metabase/entities/tables";
 import { useSafeAsyncFunction } from "metabase/hooks/use-safe-async-function";
+import { connect } from "metabase/lib/redux";
 import type Table from "metabase-lib/v1/metadata/Table";
 
 type OwnProps = {
diff --git a/frontend/src/metabase/query_builder/components/dataref/TablePane.tsx b/frontend/src/metabase/query_builder/components/dataref/TablePane.tsx
index 55bd55c136a2a7419af077d1bde1f233fc5a1b95..5d85419b44f79feaa3a5daebbb8cf5a042f60f22 100644
--- a/frontend/src/metabase/query_builder/components/dataref/TablePane.tsx
+++ b/frontend/src/metabase/query_builder/components/dataref/TablePane.tsx
@@ -1,4 +1,3 @@
-import { connect } from "react-redux";
 import { msgid, ngettext, t } from "ttag";
 import _ from "underscore";
 
@@ -8,6 +7,7 @@ import {
 } from "metabase/components/MetadataInfo/MetadataInfo.styled";
 import CS from "metabase/css/core/index.css";
 import Tables from "metabase/entities/tables";
+import { connect } from "metabase/lib/redux";
 import SidebarContent from "metabase/query_builder/components/SidebarContent";
 import ConnectedTableList from "metabase/query_builder/components/dataref/ConnectedTableList";
 import type Table from "metabase-lib/v1/metadata/Table";
diff --git a/frontend/src/metabase/query_builder/components/expressions/ExpressionEditorTextfield/ExpressionEditorTextfield.tsx b/frontend/src/metabase/query_builder/components/expressions/ExpressionEditorTextfield/ExpressionEditorTextfield.tsx
index 3ee32b96f228de75e201562915fd268dcf653bea..71ba78efb307cdaa13bee2d01a6efcc135b43eab 100644
--- a/frontend/src/metabase/query_builder/components/expressions/ExpressionEditorTextfield/ExpressionEditorTextfield.tsx
+++ b/frontend/src/metabase/query_builder/components/expressions/ExpressionEditorTextfield/ExpressionEditorTextfield.tsx
@@ -3,12 +3,12 @@ import * as ace from "ace-builds/src-noconflict/ace";
 import * as React from "react";
 import type { ICommand, IMarker } from "react-ace";
 import AceEditor from "react-ace";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
 import { getColumnIcon } from "metabase/common/utils/columns";
 import ExplicitSize from "metabase/components/ExplicitSize";
+import { connect } from "metabase/lib/redux";
 import { getMetadata } from "metabase/selectors/metadata";
 import { getShowMetabaseLinks } from "metabase/selectors/whitelabel";
 import type { IconName } from "metabase/ui";
diff --git a/frontend/src/metabase/query_builder/components/template_tags/SnippetForm/SnippetForm.tsx b/frontend/src/metabase/query_builder/components/template_tags/SnippetForm/SnippetForm.tsx
index 5f48d252283b0f3ef4e5b810651f93ebd3ec2f97..1efa539a8986587f6d92bc338c7da105b594049d 100644
--- a/frontend/src/metabase/query_builder/components/template_tags/SnippetForm/SnippetForm.tsx
+++ b/frontend/src/metabase/query_builder/components/template_tags/SnippetForm/SnippetForm.tsx
@@ -1,5 +1,4 @@
 import { useCallback, useMemo } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 import * as Yup from "yup";
@@ -14,6 +13,7 @@ import SnippetCollections from "metabase/entities/snippet-collections";
 import Snippets from "metabase/entities/snippets";
 import { Form, FormProvider } from "metabase/forms";
 import * as Errors from "metabase/lib/errors";
+import { connect } from "metabase/lib/redux";
 import type {
   Collection,
   NativeQuerySnippet,
diff --git a/frontend/src/metabase/query_builder/components/template_tags/SnippetSidebar/SnippetSidebar.jsx b/frontend/src/metabase/query_builder/components/template_tags/SnippetSidebar/SnippetSidebar.jsx
index 5a32e91b131534c9ba54771cb368b5f99fbdc2b5..17f23dabf7373ad860f6cca84bf5ba9fc6052ad3 100644
--- a/frontend/src/metabase/query_builder/components/template_tags/SnippetSidebar/SnippetSidebar.jsx
+++ b/frontend/src/metabase/query_builder/components/template_tags/SnippetSidebar/SnippetSidebar.jsx
@@ -2,7 +2,6 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import * as React from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -14,6 +13,7 @@ import Search from "metabase/entities/search";
 import SnippetCollections from "metabase/entities/snippet-collections";
 import Snippets from "metabase/entities/snippets";
 import { color } from "metabase/lib/colors";
+import { connect } from "metabase/lib/redux";
 import {
   PLUGIN_SNIPPET_SIDEBAR_HEADER_BUTTONS,
   PLUGIN_SNIPPET_SIDEBAR_MODALS,
diff --git a/frontend/src/metabase/query_builder/components/template_tags/TagEditorParam.tsx b/frontend/src/metabase/query_builder/components/template_tags/TagEditorParam.tsx
index a708641c87108ba72e41ce4f7bc5d7b0c10b752c..800e33c7b03fcffeb84d2bf2635f5597e7e3996d 100644
--- a/frontend/src/metabase/query_builder/components/template_tags/TagEditorParam.tsx
+++ b/frontend/src/metabase/query_builder/components/template_tags/TagEditorParam.tsx
@@ -1,8 +1,8 @@
 import { Component } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
+import { connect } from "metabase/lib/redux";
 import { ValuesSourceSettings } from "metabase/parameters/components/ValuesSourceSettings";
 import type { EmbeddingParameterVisibility } from "metabase/public/lib/types";
 import { getOriginalQuestion } from "metabase/query_builder/selectors";
diff --git a/frontend/src/metabase/query_builder/components/view/QuestionRowCount/QuestionRowCount.tsx b/frontend/src/metabase/query_builder/components/view/QuestionRowCount/QuestionRowCount.tsx
index 21685518fe8de543e9df019659864c0d33703a72..48e5c2f05e3e617333de79fec5a7b90f1e49bdfe 100644
--- a/frontend/src/metabase/query_builder/components/view/QuestionRowCount/QuestionRowCount.tsx
+++ b/frontend/src/metabase/query_builder/components/view/QuestionRowCount/QuestionRowCount.tsx
@@ -1,5 +1,4 @@
 import { useMemo } from "react";
-import { connect } from "react-redux";
 import { msgid, ngettext, t } from "ttag";
 import _ from "underscore";
 
@@ -7,6 +6,7 @@ import PopoverWithTrigger from "metabase/components/PopoverWithTrigger";
 import CS from "metabase/css/core/index.css";
 import Database from "metabase/entities/databases";
 import { formatNumber } from "metabase/lib/formatting";
+import { connect } from "metabase/lib/redux";
 import { setLimit } from "metabase/query_builder/actions";
 import LimitPopover from "metabase/query_builder/components/LimitPopover";
 import {
diff --git a/frontend/src/metabase/query_builder/components/view/View/View/View.jsx b/frontend/src/metabase/query_builder/components/view/View/View/View.jsx
index 221f398bc9b6c544c1adc0a0972c75a1536a414f..1e12a889daa56353eabebab13725d52b68bfee29 100644
--- a/frontend/src/metabase/query_builder/components/view/View/View/View.jsx
+++ b/frontend/src/metabase/query_builder/components/view/View/View/View.jsx
@@ -1,6 +1,5 @@
 /* eslint-disable react/prop-types */
 
-import { connect } from "react-redux";
 import { match } from "ts-pattern";
 import { t } from "ttag";
 import _ from "underscore";
@@ -13,6 +12,7 @@ import CS from "metabase/css/core/index.css";
 import QueryBuilderS from "metabase/css/query_builder.module.css";
 import Bookmarks from "metabase/entities/bookmarks";
 import Questions from "metabase/entities/questions";
+import { connect } from "metabase/lib/redux";
 import {
   rememberLastUsedDatabase,
   setArchivedQuestion,
diff --git a/frontend/src/metabase/query_builder/components/view/sidebars/DatasetManagementSection/DatasetManagementSection.jsx b/frontend/src/metabase/query_builder/components/view/sidebars/DatasetManagementSection/DatasetManagementSection.jsx
index cfbf9fecaa67a65805bc1d80b41c3aeb98a6630d..84d30e098c5d090b157c7d7675513bd5a79c64fa 100644
--- a/frontend/src/metabase/query_builder/components/view/sidebars/DatasetManagementSection/DatasetManagementSection.jsx
+++ b/frontend/src/metabase/query_builder/components/view/sidebars/DatasetManagementSection/DatasetManagementSection.jsx
@@ -1,8 +1,8 @@
 import PropTypes from "prop-types";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import { PLUGIN_MODERATION } from "metabase/plugins";
 import {
   setQueryBuilderMode,
diff --git a/frontend/src/metabase/query_builder/containers/QueryBuilder.tsx b/frontend/src/metabase/query_builder/containers/QueryBuilder.tsx
index a2318c62fe7b66857b81c29df085119d508a7680..40aa47f8f3773dad183265cfdd21763e28387bba 100644
--- a/frontend/src/metabase/query_builder/containers/QueryBuilder.tsx
+++ b/frontend/src/metabase/query_builder/containers/QueryBuilder.tsx
@@ -1,6 +1,6 @@
 import type { Location } from "history";
 import { useCallback, useEffect, useMemo, useRef, useState } from "react";
-import { type ConnectedProps, connect } from "react-redux";
+import type { ConnectedProps } from "react-redux";
 import type { Route, WithRouterProps } from "react-router";
 import { push } from "react-router-redux";
 import { useMount, usePrevious, useUnmount } from "react-use";
@@ -17,7 +17,7 @@ import { useFavicon } from "metabase/hooks/use-favicon";
 import { useForceUpdate } from "metabase/hooks/use-force-update";
 import { useLoadingTimer } from "metabase/hooks/use-loading-timer";
 import { useWebNotification } from "metabase/hooks/use-web-notification";
-import { useSelector } from "metabase/lib/redux";
+import { connect, useSelector } from "metabase/lib/redux";
 import { closeNavbar } from "metabase/redux/app";
 import { getIsNavbarOpen } from "metabase/selectors/app";
 import { getMetadata } from "metabase/selectors/metadata";
diff --git a/frontend/src/metabase/questions/containers/ArchiveQuestionModal.jsx b/frontend/src/metabase/questions/containers/ArchiveQuestionModal.jsx
index 77e93c0e8f2c20fc573b8ac939e4bcd3299c79c6..0a0065deb1bf291c6b5ba721164a4f43c4a42400 100644
--- a/frontend/src/metabase/questions/containers/ArchiveQuestionModal.jsx
+++ b/frontend/src/metabase/questions/containers/ArchiveQuestionModal.jsx
@@ -1,9 +1,9 @@
 /* eslint-disable react/prop-types */
 import { Component } from "react";
-import { connect } from "react-redux";
 import { msgid, ngettext, t } from "ttag";
 
 import { ArchiveModal } from "metabase/components/ArchiveModal";
+import { connect } from "metabase/lib/redux";
 import { setArchivedQuestion } from "metabase/query_builder/actions";
 
 const mapDispatchToProps = dispatch => ({
diff --git a/frontend/src/metabase/reference/components/FieldsToGroupBy.jsx b/frontend/src/metabase/reference/components/FieldsToGroupBy.jsx
index 215633a4a1638b9b8efb51d0013940d09b68a0e4..b8146e6422a1e7cb4ca412b936d796c15ba29001 100644
--- a/frontend/src/metabase/reference/components/FieldsToGroupBy.jsx
+++ b/frontend/src/metabase/reference/components/FieldsToGroupBy.jsx
@@ -1,10 +1,10 @@
 /* eslint-disable react/prop-types */
 import cx from "classnames";
 import { Component } from "react";
-import { connect } from "react-redux";
 
 import L from "metabase/components/List/List.module.css";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import { fetchTableMetadata } from "metabase/redux/metadata";
 import D from "metabase/reference/components/Detail.module.css";
 import FieldToGroupBy from "metabase/reference/components/FieldToGroupBy";
diff --git a/frontend/src/metabase/reference/databases/DatabaseDetail.jsx b/frontend/src/metabase/reference/databases/DatabaseDetail.jsx
index 42fc4f612c40a95e8dac3323743016505a929eb8..d3137af089922007587f66c61949b83b1a85c045 100644
--- a/frontend/src/metabase/reference/databases/DatabaseDetail.jsx
+++ b/frontend/src/metabase/reference/databases/DatabaseDetail.jsx
@@ -2,13 +2,13 @@
 import cx from "classnames";
 import { useFormik } from "formik";
 import PropTypes from "prop-types";
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import { t } from "ttag";
 
 import List from "metabase/components/List";
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import Detail from "metabase/reference/components/Detail";
 import EditHeader from "metabase/reference/components/EditHeader";
diff --git a/frontend/src/metabase/reference/databases/DatabaseDetailContainer.jsx b/frontend/src/metabase/reference/databases/DatabaseDetailContainer.jsx
index 78a01d269e96611d71b1d462b70ea14db2a63cfd..4626e22f33e8f7212ee51ef707ff5d9aa8965e20 100644
--- a/frontend/src/metabase/reference/databases/DatabaseDetailContainer.jsx
+++ b/frontend/src/metabase/reference/databases/DatabaseDetailContainer.jsx
@@ -2,10 +2,10 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 
 import SidebarLayout from "metabase/components/SidebarLayout";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import DatabaseDetail from "metabase/reference/databases/DatabaseDetail";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/databases/DatabaseList.jsx b/frontend/src/metabase/reference/databases/DatabaseList.jsx
index 76def9d187da800ef363ae6ca9d5906eb7f248a2..b02f2966f612edece486d432714f862f1ac533d1 100644
--- a/frontend/src/metabase/reference/databases/DatabaseList.jsx
+++ b/frontend/src/metabase/reference/databases/DatabaseList.jsx
@@ -1,7 +1,6 @@
 /* eslint "react/prop-types": "warn" */
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import List from "metabase/components/List";
@@ -9,6 +8,7 @@ import S from "metabase/components/List/List.module.css";
 import ListItem from "metabase/components/ListItem";
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import { NoDatabasesEmptyState } from "metabase/reference/databases/NoDatabasesEmptyState";
 
diff --git a/frontend/src/metabase/reference/databases/DatabaseListContainer.jsx b/frontend/src/metabase/reference/databases/DatabaseListContainer.jsx
index cbf960c5dc066e4fbed670c0c8b500b60a68ab3d..cb04525b5ac314b847f1002915bdd7ba96f46719 100644
--- a/frontend/src/metabase/reference/databases/DatabaseListContainer.jsx
+++ b/frontend/src/metabase/reference/databases/DatabaseListContainer.jsx
@@ -2,10 +2,10 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 
 import SidebarLayout from "metabase/components/SidebarLayout";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import DatabaseList from "metabase/reference/databases/DatabaseList";
 import BaseSidebar from "metabase/reference/guide/BaseSidebar";
diff --git a/frontend/src/metabase/reference/databases/FieldDetail.jsx b/frontend/src/metabase/reference/databases/FieldDetail.jsx
index 0760bbc07355012b39c1efa4febf7d2d916e5989..2fc056262d2be38f96b5fb678a43f81243771d1e 100644
--- a/frontend/src/metabase/reference/databases/FieldDetail.jsx
+++ b/frontend/src/metabase/reference/databases/FieldDetail.jsx
@@ -2,13 +2,13 @@
 import cx from "classnames";
 import { useFormik } from "formik";
 import PropTypes from "prop-types";
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import { t } from "ttag";
 
 import List from "metabase/components/List";
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import S from "metabase/reference/Reference.module.css";
 import Detail from "metabase/reference/components/Detail";
diff --git a/frontend/src/metabase/reference/databases/FieldDetailContainer.jsx b/frontend/src/metabase/reference/databases/FieldDetailContainer.jsx
index 7251e9ee3561dca8b64bfd779b31c573e23033ad..88ec64dc8f6861501ca464eb0699c959437dbaa7 100644
--- a/frontend/src/metabase/reference/databases/FieldDetailContainer.jsx
+++ b/frontend/src/metabase/reference/databases/FieldDetailContainer.jsx
@@ -2,10 +2,10 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 
 import SidebarLayout from "metabase/components/SidebarLayout";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import FieldDetail from "metabase/reference/databases/FieldDetail";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/databases/FieldList.jsx b/frontend/src/metabase/reference/databases/FieldList.jsx
index 5cb38352dd57ef6f588f2c5dcc7c4b71a69b9bf5..f69ccf7821718fdd016593ffb196fbe1a1d49969 100644
--- a/frontend/src/metabase/reference/databases/FieldList.jsx
+++ b/frontend/src/metabase/reference/databases/FieldList.jsx
@@ -3,7 +3,6 @@
 import cx from "classnames";
 import { useFormik } from "formik";
 import PropTypes from "prop-types";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import EmptyState from "metabase/components/EmptyState";
@@ -11,6 +10,7 @@ import List from "metabase/components/List";
 import S from "metabase/components/List/List.module.css";
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import R from "metabase/reference/Reference.module.css";
 import EditHeader from "metabase/reference/components/EditHeader";
diff --git a/frontend/src/metabase/reference/databases/FieldListContainer.jsx b/frontend/src/metabase/reference/databases/FieldListContainer.jsx
index 8526b4ca1b3de43c58ff484eb95eccad1c3bb13e..4e4f99953b41bf6b7214ba4ab83336951f3b4cae 100644
--- a/frontend/src/metabase/reference/databases/FieldListContainer.jsx
+++ b/frontend/src/metabase/reference/databases/FieldListContainer.jsx
@@ -2,10 +2,10 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 
 import SidebarLayout from "metabase/components/SidebarLayout";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import FieldList from "metabase/reference/databases/FieldList";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/databases/TableDetail.jsx b/frontend/src/metabase/reference/databases/TableDetail.jsx
index 737708c88fd785b13bebf74cb69c19f262af578b..b9048c34f3f29cd39d0aa553294cbc4061211059 100644
--- a/frontend/src/metabase/reference/databases/TableDetail.jsx
+++ b/frontend/src/metabase/reference/databases/TableDetail.jsx
@@ -2,13 +2,13 @@
 import cx from "classnames";
 import { useFormik } from "formik";
 import PropTypes from "prop-types";
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import { t } from "ttag";
 
 import List from "metabase/components/List";
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import S from "metabase/reference/Reference.module.css";
 import Detail from "metabase/reference/components/Detail";
diff --git a/frontend/src/metabase/reference/databases/TableDetailContainer.jsx b/frontend/src/metabase/reference/databases/TableDetailContainer.jsx
index f4fe5c16e39df1202453e00e2b98fb839b076be3..817124cc7393dbb7a46aaedd2e5bd73fe9d54cdc 100644
--- a/frontend/src/metabase/reference/databases/TableDetailContainer.jsx
+++ b/frontend/src/metabase/reference/databases/TableDetailContainer.jsx
@@ -2,10 +2,10 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 
 import SidebarLayout from "metabase/components/SidebarLayout";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import TableDetail from "metabase/reference/databases/TableDetail";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/databases/TableList.jsx b/frontend/src/metabase/reference/databases/TableList.jsx
index a196e5233590cd9e15b0c60bbfb17f9e62b88c96..65fc9c9fd4f3caa17d7ca0af39af92f9aa570832 100644
--- a/frontend/src/metabase/reference/databases/TableList.jsx
+++ b/frontend/src/metabase/reference/databases/TableList.jsx
@@ -2,7 +2,6 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -12,6 +11,7 @@ import S from "metabase/components/List/List.module.css";
 import ListItem from "metabase/components/ListItem";
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import R from "metabase/reference/Reference.module.css";
 
diff --git a/frontend/src/metabase/reference/databases/TableListContainer.jsx b/frontend/src/metabase/reference/databases/TableListContainer.jsx
index 640d16151dd6d742d38383e335551e3c6d501c6e..190072b63540c68fecd894c70bf8bf2a74cf6738 100644
--- a/frontend/src/metabase/reference/databases/TableListContainer.jsx
+++ b/frontend/src/metabase/reference/databases/TableListContainer.jsx
@@ -2,10 +2,10 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 
 import SidebarLayout from "metabase/components/SidebarLayout";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import TableList from "metabase/reference/databases/TableList";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/databases/TableQuestions.jsx b/frontend/src/metabase/reference/databases/TableQuestions.jsx
index 72c76311ffe9f1eb04af25e79a612f09c063b5f7..2aadfad1489f38e90301ca4dfe172e6dd5401087 100644
--- a/frontend/src/metabase/reference/databases/TableQuestions.jsx
+++ b/frontend/src/metabase/reference/databases/TableQuestions.jsx
@@ -3,7 +3,6 @@ import cx from "classnames";
 import moment from "moment-timezone"; // eslint-disable-line no-restricted-imports -- deprecated usage
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import AdminAwareEmptyState from "metabase/components/AdminAwareEmptyState";
@@ -12,6 +11,7 @@ import S from "metabase/components/List/List.module.css";
 import ListItem from "metabase/components/ListItem";
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import * as metadataActions from "metabase/redux/metadata";
 import { getMetadata } from "metabase/selectors/metadata";
diff --git a/frontend/src/metabase/reference/databases/TableQuestionsContainer.jsx b/frontend/src/metabase/reference/databases/TableQuestionsContainer.jsx
index 21bc8e28301ad43231036c81fdd13e2214a90aa5..495d93e2160bc2cba106aeccdebc5916a2dd8dbf 100644
--- a/frontend/src/metabase/reference/databases/TableQuestionsContainer.jsx
+++ b/frontend/src/metabase/reference/databases/TableQuestionsContainer.jsx
@@ -2,11 +2,11 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 
 import SidebarLayout from "metabase/components/SidebarLayout";
 import CS from "metabase/css/core/index.css";
 import Questions from "metabase/entities/questions";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import TableQuestions from "metabase/reference/databases/TableQuestions";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/segments/SegmentDetail.jsx b/frontend/src/metabase/reference/segments/SegmentDetail.jsx
index bd9b85bd0d93b48853bd9553e868d5ddb02eedf8..84e0e2ef63b42719415e440c732a6c706287dc9d 100644
--- a/frontend/src/metabase/reference/segments/SegmentDetail.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentDetail.jsx
@@ -2,13 +2,13 @@
 import cx from "classnames";
 import { useFormik } from "formik";
 import PropTypes from "prop-types";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import List from "metabase/components/List";
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import Link from "metabase/core/components/Link";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import Detail from "metabase/reference/components/Detail";
 import EditHeader from "metabase/reference/components/EditHeader";
diff --git a/frontend/src/metabase/reference/segments/SegmentDetailContainer.jsx b/frontend/src/metabase/reference/segments/SegmentDetailContainer.jsx
index 62852c3bc1557bb59b6e861ee46ca08208ee80c2..89d89fa386743b4e98004205844f4a2b938cc113 100644
--- a/frontend/src/metabase/reference/segments/SegmentDetailContainer.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentDetailContainer.jsx
@@ -2,10 +2,10 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 
 import SidebarLayout from "metabase/components/SidebarLayout";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
 import SegmentDetail from "metabase/reference/segments/SegmentDetail";
diff --git a/frontend/src/metabase/reference/segments/SegmentFieldDetail.jsx b/frontend/src/metabase/reference/segments/SegmentFieldDetail.jsx
index 7baf315c42a97c6a654191bef831c85db38559a0..16d3ac987b4d5d9278a2347aef110f82422fbc08 100644
--- a/frontend/src/metabase/reference/segments/SegmentFieldDetail.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentFieldDetail.jsx
@@ -2,12 +2,12 @@
 import cx from "classnames";
 import { useFormik } from "formik";
 import PropTypes from "prop-types";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import List from "metabase/components/List";
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import S from "metabase/reference/Reference.module.css";
 import Detail from "metabase/reference/components/Detail";
diff --git a/frontend/src/metabase/reference/segments/SegmentFieldDetailContainer.jsx b/frontend/src/metabase/reference/segments/SegmentFieldDetailContainer.jsx
index c92bc7736c26dc5a75915c2852fc5ec6c2e56269..79ef8608c977596cc1d0a0ac9b3265637db480c5 100644
--- a/frontend/src/metabase/reference/segments/SegmentFieldDetailContainer.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentFieldDetailContainer.jsx
@@ -2,10 +2,10 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 
 import SidebarLayout from "metabase/components/SidebarLayout";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
 import SegmentFieldDetail from "metabase/reference/segments/SegmentFieldDetail";
diff --git a/frontend/src/metabase/reference/segments/SegmentFieldList.jsx b/frontend/src/metabase/reference/segments/SegmentFieldList.jsx
index f5f08dc062af68918731df2276e08766e20571d9..1fc5810a82bfbe5fdb12adb44a0bff1d2e8daa53 100644
--- a/frontend/src/metabase/reference/segments/SegmentFieldList.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentFieldList.jsx
@@ -2,7 +2,6 @@
 import cx from "classnames";
 import { useFormik } from "formik";
 import PropTypes from "prop-types";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import EmptyState from "metabase/components/EmptyState";
@@ -10,6 +9,7 @@ import List from "metabase/components/List";
 import S from "metabase/components/List/List.module.css";
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import R from "metabase/reference/Reference.module.css";
 import EditHeader from "metabase/reference/components/EditHeader";
diff --git a/frontend/src/metabase/reference/segments/SegmentFieldListContainer.jsx b/frontend/src/metabase/reference/segments/SegmentFieldListContainer.jsx
index 52b2da5781ad2bbebfd79412d37fbe0e270ebb01..ddce9191b7d6a915e34a8e18ff12a69510e421c4 100644
--- a/frontend/src/metabase/reference/segments/SegmentFieldListContainer.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentFieldListContainer.jsx
@@ -2,10 +2,10 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 
 import SidebarLayout from "metabase/components/SidebarLayout";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
 import SegmentFieldList from "metabase/reference/segments/SegmentFieldList";
diff --git a/frontend/src/metabase/reference/segments/SegmentListContainer.jsx b/frontend/src/metabase/reference/segments/SegmentListContainer.jsx
index 3a3a16998d27cb74c2378b0dadfc86f52b20a375..903ba066b1e8a355a5c99f87ba430a2e9564c913 100644
--- a/frontend/src/metabase/reference/segments/SegmentListContainer.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentListContainer.jsx
@@ -2,10 +2,10 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 
 import SidebarLayout from "metabase/components/SidebarLayout";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import BaseSidebar from "metabase/reference/guide/BaseSidebar";
 import * as actions from "metabase/reference/reference";
diff --git a/frontend/src/metabase/reference/segments/SegmentQuestions.jsx b/frontend/src/metabase/reference/segments/SegmentQuestions.jsx
index 6d5ca70e3c9d2f11b122543f5701f3e2767118c4..6609a8e1810eb43785dd4da3d03689cdd5c2f72c 100644
--- a/frontend/src/metabase/reference/segments/SegmentQuestions.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentQuestions.jsx
@@ -1,7 +1,6 @@
 /* eslint "react/prop-types": "warn" */
 import cx from "classnames";
 import PropTypes from "prop-types";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import { useQuestionListQuery } from "metabase/common/hooks";
@@ -11,6 +10,7 @@ import S from "metabase/components/List/List.module.css";
 import ListItem from "metabase/components/ListItem";
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import * as metadataActions from "metabase/redux/metadata";
 import { getMetadata } from "metabase/selectors/metadata";
diff --git a/frontend/src/metabase/reference/segments/SegmentQuestionsContainer.jsx b/frontend/src/metabase/reference/segments/SegmentQuestionsContainer.jsx
index 1bff43bc79b36675937f2653b9ba2de0649ae288..0b29595b18d283417c6cd0f40c9f0c0924ab3cdf 100644
--- a/frontend/src/metabase/reference/segments/SegmentQuestionsContainer.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentQuestionsContainer.jsx
@@ -2,11 +2,11 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 
 import SidebarLayout from "metabase/components/SidebarLayout";
 import CS from "metabase/css/core/index.css";
 import Questions from "metabase/entities/questions";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
 import SegmentQuestions from "metabase/reference/segments/SegmentQuestions";
diff --git a/frontend/src/metabase/reference/segments/SegmentRevisions.jsx b/frontend/src/metabase/reference/segments/SegmentRevisions.jsx
index 2f77733a551415db50e5f51b2a78ec2fb6c3b7dc..235cb06db5c84c7560f18be7c94426269e57b1fa 100644
--- a/frontend/src/metabase/reference/segments/SegmentRevisions.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentRevisions.jsx
@@ -2,7 +2,6 @@ import cx from "classnames";
 import { getIn } from "icepick";
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 
 import Revision from "metabase/admin/datamodel/components/revisions/Revision";
@@ -11,6 +10,7 @@ import S from "metabase/components/List/List.module.css";
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
 import CS from "metabase/css/core/index.css";
 import { assignUserColors } from "metabase/lib/formatting";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 
 import ReferenceHeader from "../components/ReferenceHeader";
diff --git a/frontend/src/metabase/reference/segments/SegmentRevisionsContainer.jsx b/frontend/src/metabase/reference/segments/SegmentRevisionsContainer.jsx
index b89c9a6df44195b271d1b19d199e9abd6f997d31..712c758373e810a1ed8e4860279a128415868973 100644
--- a/frontend/src/metabase/reference/segments/SegmentRevisionsContainer.jsx
+++ b/frontend/src/metabase/reference/segments/SegmentRevisionsContainer.jsx
@@ -2,10 +2,10 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 
 import SidebarLayout from "metabase/components/SidebarLayout";
 import CS from "metabase/css/core/index.css";
+import { connect } from "metabase/lib/redux";
 import * as metadataActions from "metabase/redux/metadata";
 import * as actions from "metabase/reference/reference";
 import SegmentRevisions from "metabase/reference/segments/SegmentRevisions";
diff --git a/frontend/src/metabase/sharing/components/AddEditSidebar/AddEditSidebar.jsx b/frontend/src/metabase/sharing/components/AddEditSidebar/AddEditSidebar.jsx
index 4c3a1fff8fa3c58669563cae0058721fa2751c56..710c0a7b70b54311efb7ab4c18f889cdcd9f2c9a 100644
--- a/frontend/src/metabase/sharing/components/AddEditSidebar/AddEditSidebar.jsx
+++ b/frontend/src/metabase/sharing/components/AddEditSidebar/AddEditSidebar.jsx
@@ -1,6 +1,5 @@
-import { connect } from "react-redux";
-
 import { getParameters } from "metabase/dashboard/selectors";
+import { connect } from "metabase/lib/redux";
 
 import _AddEditEmailSidebar from "./AddEditEmailSidebar";
 import _AddEditSlackSidebar from "./AddEditSlackSidebar";
diff --git a/frontend/src/metabase/sharing/components/PulsesListSidebar.jsx b/frontend/src/metabase/sharing/components/PulsesListSidebar.jsx
index 858e5d2654ff09525f157640e0e333f5f01fdfd3..556347839399c31d2502d00dcd38de1609781d5e 100644
--- a/frontend/src/metabase/sharing/components/PulsesListSidebar.jsx
+++ b/frontend/src/metabase/sharing/components/PulsesListSidebar.jsx
@@ -2,7 +2,6 @@
 
 import cx from "classnames";
 import PropTypes from "prop-types";
-import { connect } from "react-redux";
 import { msgid, ngettext, t } from "ttag";
 import _ from "underscore";
 
@@ -17,6 +16,7 @@ import {
   formatTimeWithUnit,
 } from "metabase/lib/formatting";
 import { getActivePulseParameters } from "metabase/lib/pulse";
+import { connect } from "metabase/lib/redux";
 import { formatFrame } from "metabase/lib/time";
 import { Icon } from "metabase/ui";
 
diff --git a/frontend/src/metabase/sharing/components/SharingSidebar/SharingSidebar.jsx b/frontend/src/metabase/sharing/components/SharingSidebar/SharingSidebar.jsx
index c9db06a96f131a9d04d7d26d4b8f1f7d3ec878cb..2338be884edc9e9b956ae7a3992f1806ebe2edd8 100644
--- a/frontend/src/metabase/sharing/components/SharingSidebar/SharingSidebar.jsx
+++ b/frontend/src/metabase/sharing/components/SharingSidebar/SharingSidebar.jsx
@@ -2,7 +2,6 @@
 
 import PropTypes from "prop-types";
 import { Component } from "react";
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper";
@@ -13,6 +12,7 @@ import {
   cleanPulse,
   createChannel,
 } from "metabase/lib/pulse";
+import { connect } from "metabase/lib/redux";
 import {
   cancelEditingPulse,
   fetchPulseFormInput,
diff --git a/frontend/src/metabase/status/containers/DatabaseStatus/DatabaseStatus.tsx b/frontend/src/metabase/status/containers/DatabaseStatus/DatabaseStatus.tsx
index 5c6cc434986a6826cf9ebaed21612b0203bbc64f..9f97af717fbc3190eca6bc81d5107f8506ad89b6 100644
--- a/frontend/src/metabase/status/containers/DatabaseStatus/DatabaseStatus.tsx
+++ b/frontend/src/metabase/status/containers/DatabaseStatus/DatabaseStatus.tsx
@@ -1,7 +1,7 @@
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import Databases from "metabase/entities/databases";
+import { connect } from "metabase/lib/redux";
 import { isSyncInProgress } from "metabase/lib/syncing";
 import { getUser } from "metabase/selectors/user";
 import type Database from "metabase-lib/v1/metadata/Database";
diff --git a/frontend/src/metabase/timelines/collections/containers/DeleteEventModal/DeleteEventModal.tsx b/frontend/src/metabase/timelines/collections/containers/DeleteEventModal/DeleteEventModal.tsx
index 7daf64e32c4990d858594f5bc584611dc432f4e3..34511976ea576bbb8960319ace5cc7f980691408 100644
--- a/frontend/src/metabase/timelines/collections/containers/DeleteEventModal/DeleteEventModal.tsx
+++ b/frontend/src/metabase/timelines/collections/containers/DeleteEventModal/DeleteEventModal.tsx
@@ -1,9 +1,9 @@
-import { connect } from "react-redux";
 import { goBack, push } from "react-router-redux";
 import _ from "underscore";
 
 import TimelineEvents from "metabase/entities/timeline-events";
 import Timelines from "metabase/entities/timelines";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import DeleteEventModal from "metabase/timelines/common/components/DeleteEventModal";
 import type { Timeline, TimelineEvent } from "metabase-types/api";
diff --git a/frontend/src/metabase/timelines/collections/containers/DeleteTimelineModal/DeleteTimelineModal.tsx b/frontend/src/metabase/timelines/collections/containers/DeleteTimelineModal/DeleteTimelineModal.tsx
index 012dbde6ee970d8e17132e869c615fd95401a12f..9215b6c4767df15cbd28a2858d8fa18267360bbb 100644
--- a/frontend/src/metabase/timelines/collections/containers/DeleteTimelineModal/DeleteTimelineModal.tsx
+++ b/frontend/src/metabase/timelines/collections/containers/DeleteTimelineModal/DeleteTimelineModal.tsx
@@ -1,8 +1,8 @@
-import { connect } from "react-redux";
 import { goBack, push } from "react-router-redux";
 import _ from "underscore";
 
 import Timelines from "metabase/entities/timelines";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import DeleteTimelineModal from "metabase/timelines/common/components/DeleteTimelineModal";
 import type { Timeline } from "metabase-types/api";
diff --git a/frontend/src/metabase/timelines/collections/containers/EditEventModal/EditEventModal.tsx b/frontend/src/metabase/timelines/collections/containers/EditEventModal/EditEventModal.tsx
index 75d7abd1b2b58a44f8e39266fd4ca9a75f119811..384977289094356cd0cd4063c37b1b335e8125a6 100644
--- a/frontend/src/metabase/timelines/collections/containers/EditEventModal/EditEventModal.tsx
+++ b/frontend/src/metabase/timelines/collections/containers/EditEventModal/EditEventModal.tsx
@@ -1,9 +1,9 @@
-import { connect } from "react-redux";
 import { goBack, push } from "react-router-redux";
 import _ from "underscore";
 
 import TimelineEvents from "metabase/entities/timeline-events";
 import Timelines from "metabase/entities/timelines";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import EditEventModal from "metabase/timelines/common/components/EditEventModal";
 import type { Timeline, TimelineEvent } from "metabase-types/api";
diff --git a/frontend/src/metabase/timelines/collections/containers/EditTimelineModal/EditTimelineModal.tsx b/frontend/src/metabase/timelines/collections/containers/EditTimelineModal/EditTimelineModal.tsx
index 25e10d66349bc7e13a96bbe1284a14bb1ffce64d..117d600931269185868f53fbe4b6362d3751ea6d 100644
--- a/frontend/src/metabase/timelines/collections/containers/EditTimelineModal/EditTimelineModal.tsx
+++ b/frontend/src/metabase/timelines/collections/containers/EditTimelineModal/EditTimelineModal.tsx
@@ -1,8 +1,8 @@
-import { connect } from "react-redux";
 import { goBack, push } from "react-router-redux";
 import _ from "underscore";
 
 import Timelines from "metabase/entities/timelines";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import EditTimelineModal from "metabase/timelines/common/components/EditTimelineModal";
 import type { Timeline } from "metabase-types/api";
diff --git a/frontend/src/metabase/timelines/collections/containers/MoveEventModal/MoveEventModal.tsx b/frontend/src/metabase/timelines/collections/containers/MoveEventModal/MoveEventModal.tsx
index d4059f89ac665437f5451b297b93faeb81507d12..2bdc8d748eccb695cc0acc1e3007114409738785 100644
--- a/frontend/src/metabase/timelines/collections/containers/MoveEventModal/MoveEventModal.tsx
+++ b/frontend/src/metabase/timelines/collections/containers/MoveEventModal/MoveEventModal.tsx
@@ -1,10 +1,10 @@
-import { connect } from "react-redux";
 import { goBack, push } from "react-router-redux";
 import _ from "underscore";
 
 import Collections from "metabase/entities/collections";
 import TimelineEvents from "metabase/entities/timeline-events";
 import Timelines from "metabase/entities/timelines";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import MoveEventModal from "metabase/timelines/common/components/MoveEventModal";
 import type { Timeline, TimelineEvent } from "metabase-types/api";
diff --git a/frontend/src/metabase/timelines/collections/containers/MoveTimelineModal/MoveTimelineModal.tsx b/frontend/src/metabase/timelines/collections/containers/MoveTimelineModal/MoveTimelineModal.tsx
index 5338b38157b7681b56407951455fec4a98b6d454..d3f7ff5329fa8b0512a5e0de2867333b16653c3c 100644
--- a/frontend/src/metabase/timelines/collections/containers/MoveTimelineModal/MoveTimelineModal.tsx
+++ b/frontend/src/metabase/timelines/collections/containers/MoveTimelineModal/MoveTimelineModal.tsx
@@ -1,8 +1,8 @@
-import { connect } from "react-redux";
 import { goBack } from "react-router-redux";
 import _ from "underscore";
 
 import Timelines from "metabase/entities/timelines";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import MoveTimelineModal from "metabase/timelines/common/components/MoveTimelineModal";
 import type { Timeline } from "metabase-types/api";
diff --git a/frontend/src/metabase/timelines/collections/containers/NewEventModal/NewEventModal.tsx b/frontend/src/metabase/timelines/collections/containers/NewEventModal/NewEventModal.tsx
index fb67f1ef7ac1827ee24cc20c1c9f53e030c16777..a43d8cdea113ca34f859839c859e680762cd6830 100644
--- a/frontend/src/metabase/timelines/collections/containers/NewEventModal/NewEventModal.tsx
+++ b/frontend/src/metabase/timelines/collections/containers/NewEventModal/NewEventModal.tsx
@@ -1,9 +1,9 @@
-import { connect } from "react-redux";
 import { goBack, push } from "react-router-redux";
 import _ from "underscore";
 
 import TimelineEvents from "metabase/entities/timeline-events";
 import Timelines from "metabase/entities/timelines";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import NewEventModal from "metabase/timelines/common/components/NewEventModal";
 import type { Collection, Timeline, TimelineEvent } from "metabase-types/api";
diff --git a/frontend/src/metabase/timelines/collections/containers/NewEventWithTimelineModal/NewEventWithTimelineModal.tsx b/frontend/src/metabase/timelines/collections/containers/NewEventWithTimelineModal/NewEventWithTimelineModal.tsx
index 7d0ee9f67a7fd00c96ed1527aef77d349e98bb6f..62d258803372758a4b5bd85de57ce11b84f67c2e 100644
--- a/frontend/src/metabase/timelines/collections/containers/NewEventWithTimelineModal/NewEventWithTimelineModal.tsx
+++ b/frontend/src/metabase/timelines/collections/containers/NewEventWithTimelineModal/NewEventWithTimelineModal.tsx
@@ -1,9 +1,9 @@
-import { connect } from "react-redux";
 import { goBack, push } from "react-router-redux";
 import _ from "underscore";
 
 import Collections from "metabase/entities/collections";
 import Timelines from "metabase/entities/timelines";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import NewEventModal from "metabase/timelines/common/components/NewEventModal";
 import type { Collection, TimelineEvent } from "metabase-types/api";
diff --git a/frontend/src/metabase/timelines/collections/containers/NewTimelineModal/NewTimelineModal.tsx b/frontend/src/metabase/timelines/collections/containers/NewTimelineModal/NewTimelineModal.tsx
index 8084a6d844a761fb8bf8193e550cfec8bafc22d0..ab81754706fa78c5ccbca2855db085b87ffc2bbb 100644
--- a/frontend/src/metabase/timelines/collections/containers/NewTimelineModal/NewTimelineModal.tsx
+++ b/frontend/src/metabase/timelines/collections/containers/NewTimelineModal/NewTimelineModal.tsx
@@ -1,9 +1,9 @@
-import { connect } from "react-redux";
 import { goBack, push } from "react-router-redux";
 import _ from "underscore";
 
 import Collections from "metabase/entities/collections";
 import Timelines from "metabase/entities/timelines";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import NewTimelineModal from "metabase/timelines/common/components/NewTimelineModal";
 import type { Timeline } from "metabase-types/api";
diff --git a/frontend/src/metabase/timelines/collections/containers/TimelineArchiveModal/TimelineArchiveModal.tsx b/frontend/src/metabase/timelines/collections/containers/TimelineArchiveModal/TimelineArchiveModal.tsx
index 0ea891ce8519bf266181805ec48101f7c6dc65c1..df37d3effb5c4655c04aeecd8bda86962971e7fc 100644
--- a/frontend/src/metabase/timelines/collections/containers/TimelineArchiveModal/TimelineArchiveModal.tsx
+++ b/frontend/src/metabase/timelines/collections/containers/TimelineArchiveModal/TimelineArchiveModal.tsx
@@ -1,9 +1,9 @@
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import _ from "underscore";
 
 import TimelineEvents from "metabase/entities/timeline-events";
 import Timelines from "metabase/entities/timelines";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import type { Timeline, TimelineEvent } from "metabase-types/api";
 import type { State } from "metabase-types/store";
diff --git a/frontend/src/metabase/timelines/collections/containers/TimelineDetailsModal/TimelineDetailsModal.tsx b/frontend/src/metabase/timelines/collections/containers/TimelineDetailsModal/TimelineDetailsModal.tsx
index 3d74da52a103f1749f878933bcaf31ae15ccc960..8b600ffb67070a801659eeef7bf87294f1792bfc 100644
--- a/frontend/src/metabase/timelines/collections/containers/TimelineDetailsModal/TimelineDetailsModal.tsx
+++ b/frontend/src/metabase/timelines/collections/containers/TimelineDetailsModal/TimelineDetailsModal.tsx
@@ -1,9 +1,9 @@
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import _ from "underscore";
 
 import TimelineEvents from "metabase/entities/timeline-events";
 import Timelines from "metabase/entities/timelines";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import type { Timeline, TimelineEvent } from "metabase-types/api";
 import type { State } from "metabase-types/store";
diff --git a/frontend/src/metabase/timelines/collections/containers/TimelineListArchiveModal/TimelineListArchiveModal.tsx b/frontend/src/metabase/timelines/collections/containers/TimelineListArchiveModal/TimelineListArchiveModal.tsx
index 8efd721d3273acfa945764a32846e20fb2c3e34f..673ac3c7289cad7f9c14124859bd6c674333bce6 100644
--- a/frontend/src/metabase/timelines/collections/containers/TimelineListArchiveModal/TimelineListArchiveModal.tsx
+++ b/frontend/src/metabase/timelines/collections/containers/TimelineListArchiveModal/TimelineListArchiveModal.tsx
@@ -1,9 +1,9 @@
-import { connect } from "react-redux";
 import { push } from "react-router-redux";
 import _ from "underscore";
 
 import Collections from "metabase/entities/collections";
 import Timelines from "metabase/entities/timelines";
+import { connect } from "metabase/lib/redux";
 import * as Urls from "metabase/lib/urls";
 import type { Collection, TimelineEvent } from "metabase-types/api";
 import type { State } from "metabase-types/store";
diff --git a/frontend/src/metabase/timelines/common/containers/EventForm/EventForm.tsx b/frontend/src/metabase/timelines/common/containers/EventForm/EventForm.tsx
index eddd58ff663c762afd2c224ebc659b17a04d2ff5..5740655f85ab7d4260da71d428b73e652ae50e69 100644
--- a/frontend/src/metabase/timelines/common/containers/EventForm/EventForm.tsx
+++ b/frontend/src/metabase/timelines/common/containers/EventForm/EventForm.tsx
@@ -1,5 +1,4 @@
-import { connect } from "react-redux";
-
+import { connect } from "metabase/lib/redux";
 import { getSetting } from "metabase/selectors/settings";
 import type { State } from "metabase-types/store";
 
diff --git a/frontend/src/metabase/timelines/questions/containers/EditEventModal/EditEventModal.tsx b/frontend/src/metabase/timelines/questions/containers/EditEventModal/EditEventModal.tsx
index d0e8180a68441b16db42b4476e6aba9df9d86ea6..1197c9df9ffd10e4f0e026b0908ae322db335826 100644
--- a/frontend/src/metabase/timelines/questions/containers/EditEventModal/EditEventModal.tsx
+++ b/frontend/src/metabase/timelines/questions/containers/EditEventModal/EditEventModal.tsx
@@ -1,8 +1,8 @@
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
 import TimelineEvents from "metabase/entities/timeline-events";
+import { connect } from "metabase/lib/redux";
 import { addUndo } from "metabase/redux/undo";
 import EditEventModal from "metabase/timelines/common/components/EditEventModal";
 import type { TimelineEvent } from "metabase-types/api";
diff --git a/frontend/src/metabase/timelines/questions/containers/MoveEventModal/MoveEventModal.tsx b/frontend/src/metabase/timelines/questions/containers/MoveEventModal/MoveEventModal.tsx
index 235b05717efcb2f13a9f9d026435e6990c718631..3c962d9049098d0f267bb89e5f7cd73ebe5d6963 100644
--- a/frontend/src/metabase/timelines/questions/containers/MoveEventModal/MoveEventModal.tsx
+++ b/frontend/src/metabase/timelines/questions/containers/MoveEventModal/MoveEventModal.tsx
@@ -1,9 +1,9 @@
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import Collections, { ROOT_COLLECTION } from "metabase/entities/collections";
 import TimelineEvents from "metabase/entities/timeline-events";
 import Timelines from "metabase/entities/timelines";
+import { connect } from "metabase/lib/redux";
 import MoveEventModal from "metabase/timelines/common/components/MoveEventModal";
 import type { Timeline, TimelineEvent } from "metabase-types/api";
 import type { State } from "metabase-types/store";
diff --git a/frontend/src/metabase/timelines/questions/containers/NewEventModal/NewEventModal.tsx b/frontend/src/metabase/timelines/questions/containers/NewEventModal/NewEventModal.tsx
index dcf8d1ad8f78ff367f2420ce9898e2e36aca3714..dcb36f53583ef93371c82cd975ee4212f4061deb 100644
--- a/frontend/src/metabase/timelines/questions/containers/NewEventModal/NewEventModal.tsx
+++ b/frontend/src/metabase/timelines/questions/containers/NewEventModal/NewEventModal.tsx
@@ -1,10 +1,10 @@
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
 import Collections, { ROOT_COLLECTION } from "metabase/entities/collections";
 import TimelineEvents from "metabase/entities/timeline-events";
 import Timelines from "metabase/entities/timelines";
+import { connect } from "metabase/lib/redux";
 import { addUndo } from "metabase/redux/undo";
 import NewEventModal from "metabase/timelines/common/components/NewEventModal";
 import type { Collection, TimelineEvent } from "metabase-types/api";
diff --git a/frontend/src/metabase/timelines/questions/containers/TimelinePanel/TimelinePanel.tsx b/frontend/src/metabase/timelines/questions/containers/TimelinePanel/TimelinePanel.tsx
index 9ab97692b761934083826b29e9546d2133939378..240e1b75907bd92ab68e0cfb980c72104599b595 100644
--- a/frontend/src/metabase/timelines/questions/containers/TimelinePanel/TimelinePanel.tsx
+++ b/frontend/src/metabase/timelines/questions/containers/TimelinePanel/TimelinePanel.tsx
@@ -1,8 +1,8 @@
-import { connect } from "react-redux";
 import _ from "underscore";
 
 import Collections, { ROOT_COLLECTION } from "metabase/entities/collections";
 import TimelineEvents from "metabase/entities/timeline-events";
+import { connect } from "metabase/lib/redux";
 import type { TimelineEvent } from "metabase-types/api";
 import type { State } from "metabase-types/store";
 
diff --git a/frontend/src/metabase/visualizations/components/ChoroplethMap.jsx b/frontend/src/metabase/visualizations/components/ChoroplethMap.jsx
index 145baf4d6e9efd04b491fc5b867f4faf0086298a..7f3987dc0a36de22ff3ce2ef30e1a9e6f9eb6b3f 100644
--- a/frontend/src/metabase/visualizations/components/ChoroplethMap.jsx
+++ b/frontend/src/metabase/visualizations/components/ChoroplethMap.jsx
@@ -3,7 +3,6 @@ import cx from "classnames";
 import Color from "color";
 import * as d3 from "d3";
 import { Component } from "react";
-import { connect } from "react-redux";
 import ss from "simple-statistics";
 import { t } from "ttag";
 import _ from "underscore";
@@ -12,6 +11,7 @@ import { getMetabaseInstanceUrl } from "embedding-sdk/store/selectors";
 import LoadingSpinner from "metabase/components/LoadingSpinner";
 import CS from "metabase/css/core/index.css";
 import { formatValue } from "metabase/lib/formatting";
+import { connect } from "metabase/lib/redux";
 import MetabaseSettings from "metabase/lib/settings";
 import { getIsEmbeddingSdk } from "metabase/selectors/embed";
 import { MinColumnsError } from "metabase/visualizations/lib/errors";
diff --git a/frontend/src/metabase/visualizations/components/ClickActions/ClickActionsPopover.tsx b/frontend/src/metabase/visualizations/components/ClickActions/ClickActionsPopover.tsx
index 15efac9bfde33a0ac1073a8456a774aa5f38a1c2..66140352df0cc69a9fea21f425a59d7bfde92c3a 100644
--- a/frontend/src/metabase/visualizations/components/ClickActions/ClickActionsPopover.tsx
+++ b/frontend/src/metabase/visualizations/components/ClickActions/ClickActionsPopover.tsx
@@ -1,8 +1,8 @@
 import { Component } from "react";
-import { connect } from "react-redux";
 import type * as tippy from "tippy.js";
 
 import { getEventTarget } from "metabase/lib/dom";
+import { connect } from "metabase/lib/redux";
 import { performAction } from "metabase/visualizations/lib/action";
 import type {
   ClickObject,
diff --git a/frontend/src/metabase/visualizations/components/ObjectDetail/ObjectDetail.tsx b/frontend/src/metabase/visualizations/components/ObjectDetail/ObjectDetail.tsx
index fcbdf440798a72effb83dcb7264ac2a63dd20e55..ba12f3afbf2259f2b7d577b09b7de231ba93ff01 100644
--- a/frontend/src/metabase/visualizations/components/ObjectDetail/ObjectDetail.tsx
+++ b/frontend/src/metabase/visualizations/components/ObjectDetail/ObjectDetail.tsx
@@ -1,6 +1,5 @@
-import { connect } from "react-redux";
-
 import Tables from "metabase/entities/tables";
+import { connect } from "metabase/lib/redux";
 import {
   closeObjectDetail,
   followForeignKey,
diff --git a/frontend/src/metabase/visualizations/components/TableInteractive/TableInteractive.jsx b/frontend/src/metabase/visualizations/components/TableInteractive/TableInteractive.jsx
index f256660b536d467727deca8619e4e080e63998f7..e2a975af8e38e6f70ce7cec7490af0ca260b0390 100644
--- a/frontend/src/metabase/visualizations/components/TableInteractive/TableInteractive.jsx
+++ b/frontend/src/metabase/visualizations/components/TableInteractive/TableInteractive.jsx
@@ -2,7 +2,6 @@
 import cx from "classnames";
 import PropTypes from "prop-types";
 import { Component, createRef, forwardRef } from "react";
-import { connect } from "react-redux";
 import { Grid, ScrollSync } from "react-virtualized";
 import { t } from "ttag";
 import _ from "underscore";
@@ -20,6 +19,7 @@ import { withMantineTheme } from "metabase/hoc/MantineTheme";
 import { getScrollBarSize } from "metabase/lib/dom";
 import { formatValue } from "metabase/lib/formatting";
 import { renderRoot, unmountRoot } from "metabase/lib/react-compat";
+import { connect } from "metabase/lib/redux";
 import { setUIControls, zoomInRow } from "metabase/query_builder/actions";
 import {
   getIsShowingRawTable,
diff --git a/frontend/src/metabase/visualizations/components/Visualization/Visualization.jsx b/frontend/src/metabase/visualizations/components/Visualization/Visualization.jsx
index d0868e0cb0dfedd47a4abb032d8c879e3b2c437f..7bfab7fd96f19b9f338ff6bb0e91d14474d625a1 100644
--- a/frontend/src/metabase/visualizations/components/Visualization/Visualization.jsx
+++ b/frontend/src/metabase/visualizations/components/Visualization/Visualization.jsx
@@ -1,7 +1,6 @@
 /* eslint-disable react/prop-types */
 import cx from "classnames";
 import { PureComponent } from "react";
-import { connect } from "react-redux";
 import { t } from "ttag";
 import _ from "underscore";
 
@@ -11,6 +10,7 @@ import ExplicitSize from "metabase/components/ExplicitSize";
 import CS from "metabase/css/core/index.css";
 import DashboardS from "metabase/css/dashboard.module.css";
 import { formatNumber } from "metabase/lib/formatting";
+import { connect } from "metabase/lib/redux";
 import { equals } from "metabase/lib/utils";
 import { getIsShowingRawTable } from "metabase/query_builder/selectors";
 import { getIsEmbeddingSdk } from "metabase/selectors/embed";
diff --git a/frontend/src/metabase/visualizations/visualizations/PivotTable/PivotTable.tsx b/frontend/src/metabase/visualizations/visualizations/PivotTable/PivotTable.tsx
index 1e1d6b1ec2c0cff42caa0f1658dbfdf630af42a1..7b54b40dab4104f1222bf6cc982dceb9b32b3034 100644
--- a/frontend/src/metabase/visualizations/visualizations/PivotTable/PivotTable.tsx
+++ b/frontend/src/metabase/visualizations/visualizations/PivotTable/PivotTable.tsx
@@ -2,7 +2,6 @@ import cx from "classnames";
 import type * as React from "react";
 import { useCallback, useEffect, useMemo, useRef, useState } from "react";
 import { findDOMNode } from "react-dom";
-import { connect } from "react-redux";
 import { useMount, usePrevious } from "react-use";
 import type { OnScrollParams } from "react-virtualized";
 import { AutoSizer, Collection, Grid, ScrollSync } from "react-virtualized";
@@ -18,6 +17,7 @@ import {
   multiLevelPivot,
 } from "metabase/lib/data_grid";
 import { getScrollBarSize } from "metabase/lib/dom";
+import { connect } from "metabase/lib/redux";
 import { getSetting } from "metabase/selectors/settings";
 import { useMantineTheme } from "metabase/ui";
 import {
diff --git a/frontend/test/__support__/storybook.tsx b/frontend/test/__support__/storybook.tsx
index 2a11a258f56e42cbc1afa54a526f744a99e2670b..cbb27f80c190cded666ad9b92a2818700a92ff3e 100644
--- a/frontend/test/__support__/storybook.tsx
+++ b/frontend/test/__support__/storybook.tsx
@@ -1,8 +1,8 @@
 // Storybook helpers
-import { Provider } from "react-redux";
 
 import type { MetabaseTheme } from "embedding-sdk";
 import { SdkThemeProvider } from "embedding-sdk/components/private/SdkThemeProvider";
+import { MetabaseReduxProvider } from "metabase/lib/redux";
 import { mainReducers } from "metabase/reducers-main";
 import { StaticVisualization } from "metabase/static-viz/components/StaticVisualization";
 import { createStaticRenderingContext } from "metabase/static-viz/lib/rendering-context";
@@ -22,9 +22,9 @@ export const ReduxProvider = ({
   children: React.ReactNode;
   storeInitialState?: Record<string, any>;
 }) => (
-  <Provider store={getStore(mainReducers, storeInitialState)}>
+  <MetabaseReduxProvider store={getStore(mainReducers, storeInitialState)}>
     {children}
-  </Provider>
+  </MetabaseReduxProvider>
 );
 
 export const VisualizationWrapper = ({
diff --git a/frontend/test/__support__/ui.tsx b/frontend/test/__support__/ui.tsx
index 31fa8a9ffc5093723167c6414ac31b1d7b7b749a..547cb266aa6b30b5433ca44872b902ad2e7b5c96 100644
--- a/frontend/test/__support__/ui.tsx
+++ b/frontend/test/__support__/ui.tsx
@@ -10,7 +10,6 @@ import { KBarProvider } from "kbar";
 import type * as React from "react";
 import { DragDropContextProvider } from "react-dnd";
 import HTML5Backend from "react-dnd-html5-backend";
-import { Provider } from "react-redux";
 import { Router, useRouterHistory } from "react-router";
 import { routerMiddleware, routerReducer } from "react-router-redux";
 import _ from "underscore";
@@ -25,6 +24,7 @@ import { createMockSdkState } from "embedding-sdk/test/mocks/state";
 import { Api } from "metabase/api";
 import { UndoListing } from "metabase/containers/UndoListing";
 import { baseStyle } from "metabase/css/core/base.styled";
+import { MetabaseReduxProvider } from "metabase/lib/redux";
 import { mainReducers } from "metabase/reducers-main";
 import { publicReducers } from "metabase/reducers-public";
 import { ThemeProvider } from "metabase/ui";
@@ -141,13 +141,13 @@ export function renderWithProviders(
   const wrapper = (props: any) => {
     if (mode === "sdk") {
       return (
-        <Provider store={store}>
+        <MetabaseReduxProvider store={store}>
           <MetabaseProviderInternal
             {...props}
             {...sdkProviderProps}
             store={store}
           />
-        </Provider>
+        </MetabaseReduxProvider>
       );
     }
 
@@ -203,7 +203,7 @@ export function TestWrapper({
   theme?: MantineThemeOverride;
 }): JSX.Element {
   return (
-    <Provider store={store}>
+    <MetabaseReduxProvider store={store}>
       <MaybeDNDProvider hasDND={withDND}>
         <ThemeProvider theme={theme}>
           <GlobalStylesForTest />
@@ -216,7 +216,7 @@ export function TestWrapper({
           {withUndos && <UndoListing />}
         </ThemeProvider>
       </MaybeDNDProvider>
-    </Provider>
+    </MetabaseReduxProvider>
   );
 }