diff --git a/frontend/src/components/ACLPage/List/List.tsx b/frontend/src/components/ACLPage/List/List.tsx
index 61a443932..8d04050ff 100644
--- a/frontend/src/components/ACLPage/List/List.tsx
+++ b/frontend/src/components/ACLPage/List/List.tsx
@@ -26,6 +26,8 @@ import ResourcePageHeading from 'components/common/ResourcePageHeading/ResourceP
 import BreakableTextCell from 'components/common/NewTable/BreakableTextCell';
 import { useQueryPersister } from 'components/common/NewTable/ColumnFilter';
 import { ActionPermissionWrapper } from 'components/common/ActionComponent';
+import useFts from 'components/common/Fts/useFts';
+import Fts from 'components/common/Fts/Fts';
 
 import * as S from './List.styled';
 
@@ -33,7 +35,8 @@ const ACList: React.FC = () => {
   const { clusterName } = useAppParams<{ clusterName: ClusterName }>();
   const [searchParams, setSearchParams] = useSearchParams();
   const [search, setSearch] = useState(searchParams.get('q') || '');
-  const { data: aclList } = useAcls({ clusterName, search });
+  const { isFtsEnabled } = useFts('acl');
+  const { data: aclList } = useAcls({ clusterName, search, fts: isFtsEnabled });
   const { deleteResource } = useDeleteAcl(clusterName);
   const modal = useConfirm(true);
   const theme = useTheme();
@@ -211,6 +214,7 @@ const ACList: React.FC = () => {
           placeholder="Search by Principal Name"
           value={search}
           onChange={setSearch}
+          extraActions={}
         />
       
       
 {
-  const { data } = useConsumerGroups({ clusterName, search: '' });
+  const { isFtsEnabled } = useFts('consumer_groups');
+  const { data } = useConsumerGroups({
+    clusterName,
+    search: '',
+    fts: isFtsEnabled,
+  });
   const consumerGroups = useMemo(() => {
     return (
       data?.consumerGroups?.map((cg) => {
diff --git a/frontend/src/components/ClusterPage/ClusterPage.tsx b/frontend/src/components/ClusterPage/ClusterPage.tsx
index a0cc13e13..b48dba526 100644
--- a/frontend/src/components/ClusterPage/ClusterPage.tsx
+++ b/frontend/src/components/ClusterPage/ClusterPage.tsx
@@ -42,7 +42,7 @@ const ClusterPage: React.FC = () => {
   const { clusterName } = useAppParams();
   const appInfo = React.useContext(GlobalSettingsContext);
 
-  const { data } = useClusters();
+  const { data, isFetched } = useClusters();
   const contextValue = React.useMemo(() => {
     const cluster = data?.find(({ name }) => name === clusterName);
     const features = cluster?.features || [];
@@ -61,9 +61,17 @@ const ClusterPage: React.FC = () => {
       hasAclViewConfigured:
         features.includes(ClusterFeaturesEnum.KAFKA_ACL_VIEW) ||
         features.includes(ClusterFeaturesEnum.KAFKA_ACL_EDIT),
+      ftsEnabled: features.includes(ClusterFeaturesEnum.FTS_ENABLED),
+      ftsDefaultEnabled: features.includes(
+        ClusterFeaturesEnum.FTS_DEFAULT_ENABLED
+      ),
     };
   }, [clusterName, data]);
 
+  if (!isFetched) {
+    return ;
+  }
+
   return (
     }>
       
diff --git a/frontend/src/components/ClusterPage/__tests__/ClusterPage.spec.tsx b/frontend/src/components/ClusterPage/__tests__/ClusterPage.spec.tsx
index 238c13155..1b8b42710 100644
--- a/frontend/src/components/ClusterPage/__tests__/ClusterPage.spec.tsx
+++ b/frontend/src/components/ClusterPage/__tests__/ClusterPage.spec.tsx
@@ -52,6 +52,7 @@ describe('ClusterPage', () => {
   const renderComponent = async (pathname: string, payload: Cluster[] = []) => {
     (useClusters as jest.Mock).mockImplementation(() => ({
       data: payload,
+      isFetched: true,
     }));
     await render(
       
diff --git a/frontend/src/components/Connect/List/List.tsx b/frontend/src/components/Connect/List/List.tsx
index c3a595688..08f078ca5 100644
--- a/frontend/src/components/Connect/List/List.tsx
+++ b/frontend/src/components/Connect/List/List.tsx
@@ -1,11 +1,7 @@
 import React from 'react';
-import useAppParams from 'lib/hooks/useAppParams';
-import { ClusterNameRoute } from 'lib/paths';
 import Table, { TagCell } from 'components/common/NewTable';
 import { FullConnectorInfo } from 'generated-sources';
-import { useConnectors } from 'lib/hooks/api/kafkaConnect';
 import { ColumnDef } from '@tanstack/react-table';
-import { useSearchParams } from 'react-router-dom';
 import { useQueryPersister } from 'components/common/NewTable/ColumnFilter';
 import { useLocalStoragePersister } from 'components/common/NewTable/ColumnResizer/lib';
 import BreakableTextCell from 'components/common/NewTable/BreakableTextCell';
@@ -77,14 +73,9 @@ const kafkaConnectColumns: ColumnDef[] = [
   },
 ];
 
-const List: React.FC = () => {
-  const { clusterName } = useAppParams();
-  const [searchParams] = useSearchParams();
-  const { data: connectors } = useConnectors(
-    clusterName,
-    searchParams.get('q') || ''
-  );
+type ConnectorsListProps = { connectors: FullConnectorInfo[] | undefined };
 
+const List: React.FC = ({ connectors }) => {
   const filterPersister = useQueryPersister(kafkaConnectColumns);
   const columnSizingPersister = useLocalStoragePersister('KafkaConnect');
 
diff --git a/frontend/src/components/Connect/List/ListPage.tsx b/frontend/src/components/Connect/List/ListPage.tsx
index 3b257dd6d..e68f79a19 100644
--- a/frontend/src/components/Connect/List/ListPage.tsx
+++ b/frontend/src/components/Connect/List/ListPage.tsx
@@ -4,6 +4,9 @@ import { ClusterNameRoute } from 'lib/paths';
 import Search from 'components/common/Search/Search';
 import PageLoader from 'components/common/PageLoader/PageLoader';
 import { useConnectors } from 'lib/hooks/api/kafkaConnect';
+import Fts from 'components/common/Fts/Fts';
+import useFts from 'components/common/Fts/useFts';
+import { useSearchParams } from 'react-router-dom';
 
 import * as S from './ListPage.styled';
 import List from './List';
@@ -11,16 +14,25 @@ import ConnectorsStatistics from './Statistics/Statistics';
 
 const ListPage: React.FC = () => {
   const { clusterName } = useAppParams();
-  const { data, isLoading } = useConnectors(clusterName);
+  const { isFtsEnabled } = useFts('connects');
+  const [searchParams] = useSearchParams();
+  const { data, isLoading } = useConnectors(
+    clusterName,
+    searchParams.get('q') || '',
+    isFtsEnabled
+  );
 
   return (
     <>
       
       
-        
+        }
+        />
       
       }>
-        
+
>
   );
diff --git a/frontend/src/components/Connect/List/__tests__/List.spec.tsx b/frontend/src/components/Connect/List/__tests__/List.spec.tsx
index 9e09fc50c..679c4299e 100644
--- a/frontend/src/components/Connect/List/__tests__/List.spec.tsx
+++ b/frontend/src/components/Connect/List/__tests__/List.spec.tsx
@@ -15,6 +15,7 @@ import {
   useResetConnectorOffsets,
   useUpdateConnectorState,
 } from 'lib/hooks/api/kafkaConnect';
+import { FullConnectorInfo } from 'generated-sources';
 
 const mockedUsedNavigate = jest.fn();
 const mockDelete = jest.fn();
@@ -34,11 +35,14 @@ jest.mock('lib/hooks/api/kafkaConnect', () => ({
 
 const clusterName = 'local';
 
-const renderComponent = (contextValue: ContextProps = initialValue) =>
+const renderComponent = (
+  contextValue: ContextProps = initialValue,
+  data: FullConnectorInfo[] = connectors
+) =>
   render(
     
       
-
+
,
     { initialEntries: [clusterConnectorsPath(clusterName)] }
@@ -47,9 +51,6 @@ const renderComponent = (contextValue: ContextProps = initialValue) =>
 describe('Connectors List', () => {
   describe('when the connectors are loaded', () => {
     beforeEach(() => {
-      (useConnectors as jest.Mock).mockImplementation(() => ({
-        data: connectors,
-      }));
       const restartConnector = jest.fn();
       (useUpdateConnectorState as jest.Mock).mockImplementation(() => ({
         mutateAsync: restartConnector,
@@ -84,7 +85,7 @@ describe('Connectors List', () => {
     });
 
     it('renders empty table', async () => {
-      renderComponent();
+      renderComponent(undefined, []);
       expect(screen.getByRole('table')).toBeInTheDocument();
       expect(
         screen.getByRole('row', { name: 'No connectors found' })
diff --git a/frontend/src/components/ConsumerGroups/List.tsx b/frontend/src/components/ConsumerGroups/List.tsx
index 2a8fc619e..ad66e718c 100644
--- a/frontend/src/components/ConsumerGroups/List.tsx
+++ b/frontend/src/components/ConsumerGroups/List.tsx
@@ -17,11 +17,14 @@ import { useConsumerGroups } from 'lib/hooks/api/consumers';
 import Tooltip from 'components/common/Tooltip/Tooltip';
 import ResourcePageHeading from 'components/common/ResourcePageHeading/ResourcePageHeading';
 import { useLocalStoragePersister } from 'components/common/NewTable/ColumnResizer/lib';
+import useFts from 'components/common/Fts/useFts';
+import Fts from 'components/common/Fts/Fts';
 
 const List = () => {
   const { clusterName } = useAppParams();
   const [searchParams] = useSearchParams();
   const navigate = useNavigate();
+  const { isFtsEnabled } = useFts('consumer_groups');
 
   const consumerGroups = useConsumerGroups({
     clusterName,
@@ -32,6 +35,7 @@ const List = () => {
     page: Number(searchParams.get('page') || 1),
     perPage: Number(searchParams.get('perPage') || PER_PAGE),
     search: searchParams.get('q') || '',
+    fts: isFtsEnabled,
   });
 
   const columns = React.useMemo[]>(
@@ -104,7 +108,10 @@ const List = () => {
     <>
       
       
-        
+        }
+        />(
     left: 0;
     bottom: 0;
     padding: 16px;
+    scrollbar-gutter: stable;
+    scrollbar-width: thin;
     overflow-y: auto;
     transition:
       width 0.25s,
diff --git a/frontend/src/components/Schemas/List/List.tsx b/frontend/src/components/Schemas/List/List.tsx
index 252d9b1b1..dcc34d6ab 100644
--- a/frontend/src/components/Schemas/List/List.tsx
+++ b/frontend/src/components/Schemas/List/List.tsx
@@ -24,6 +24,8 @@ import { useNavigate, useSearchParams } from 'react-router-dom';
 import { PER_PAGE } from 'lib/constants';
 import { useGetSchemas } from 'lib/hooks/api/schemas';
 import ResourcePageHeading from 'components/common/ResourcePageHeading/ResourcePageHeading';
+import useFts from 'components/common/Fts/useFts';
+import Fts from 'components/common/Fts/Fts';
 
 import GlobalSchemaSelector from './GlobalSchemaSelector/GlobalSchemaSelector';
 
@@ -32,6 +34,7 @@ const List: React.FC = () => {
   const { clusterName } = useAppParams();
   const navigate = useNavigate();
   const [searchParams] = useSearchParams();
+  const { isFtsEnabled } = useFts('schemas');
   const {
     isInitialLoading,
     isError,
@@ -45,6 +48,7 @@ const List: React.FC = () => {
     sortOrder:
       (searchParams.get('sortDirection')?.toUpperCase() as SortOrder) ||
       undefined,
+    fts: isFtsEnabled,
   });
 
   const columns = React.useMemo[]>(
@@ -111,7 +115,10 @@ const List: React.FC = () => {
         )}
       
       
-        
+        }
+        />
       
       {isInitialLoading || isError ? (
         
diff --git a/frontend/src/components/Topics/List/ListPage.tsx b/frontend/src/components/Topics/List/ListPage.tsx
index d8508175c..811bde1a7 100644
--- a/frontend/src/components/Topics/List/ListPage.tsx
+++ b/frontend/src/components/Topics/List/ListPage.tsx
@@ -12,11 +12,15 @@ import PageLoader from 'components/common/PageLoader/PageLoader';
 import TopicTable from 'components/Topics/List/TopicTable';
 import { Action, ResourceType } from 'generated-sources';
 import ResourcePageHeading from 'components/common/ResourcePageHeading/ResourcePageHeading';
+import Fts from 'components/common/Fts/Fts';
+import useFts from 'components/common/Fts/useFts';
 
 const ListPage: React.FC = () => {
   const { isReadOnly } = React.useContext(ClusterContext);
   const [searchParams, setSearchParams] = useSearchParams();
 
+  useFts('topics');
+
   // Set the search params to the url based on the localStorage value
   React.useEffect(() => {
     if (!searchParams.has('perPage')) {
@@ -62,7 +66,10 @@ const ListPage: React.FC = () => {
         )}
       
       
-        
+        }
+        />