You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by tk...@apache.org on 2023/12/03 12:23:10 UTC

(ignite-3) branch main updated: IGNITE-21006 Introduction of auxiliary class CompletableFutures (#2913)

This is an automated email from the ASF dual-hosted git repository.

tkalkirill pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new a3743fff1c IGNITE-21006 Introduction of auxiliary class CompletableFutures (#2913)
a3743fff1c is described below

commit a3743fff1ccfa16f12c6af494a60006673b4675f
Author: Kirill Tkalenko <tk...@yandex.ru>
AuthorDate: Sun Dec 3 15:23:03 2023 +0300

    IGNITE-21006 Introduction of auxiliary class CompletableFutures (#2913)
---
 .../internal/catalog/CatalogManagerImpl.java       |   3 +-
 .../ignite/internal/catalog/ClockWaiter.java       |   4 +-
 .../internal/catalog/CatalogManagerSelfTest.java   |  23 ++--
 .../internal/catalog/CatalogSystemViewTest.java    |   4 +-
 .../catalog/storage/UpdateLogImplTest.java         |   8 +-
 .../ignite/internal/catalog/CatalogTestUtils.java  |   4 +-
 .../handler/ClientPrimaryReplicaTracker.java       |  14 +--
 .../client/handler/JdbcQueryEventHandlerImpl.java  |   3 +-
 .../sql/ClientSqlCursorNextPageRequest.java        |   3 +-
 .../requests/sql/ClientSqlExecuteRequest.java      |   3 +-
 .../handler/requests/sql/ClientSqlResultSet.java   |   4 +-
 .../handler/JdbcQueryEventHandlerImplTest.java     |   7 +-
 .../ignite/client/handler/FakePlacementDriver.java |   4 +-
 .../ignite/internal/client/ReliableChannel.java    |  16 +--
 .../ignite/internal/client/TcpClientChannel.java   |   3 +-
 .../internal/client/sql/ClientAsyncResultSet.java  |   3 +-
 .../ignite/internal/client/sql/ClientSession.java  |   3 +-
 .../client/table/ClientKeyValueBinaryView.java     |   9 +-
 .../internal/client/table/ClientKeyValueView.java  |   9 +-
 .../client/table/ClientRecordBinaryView.java       |  13 +--
 .../internal/client/table/ClientRecordView.java    |  13 +--
 .../ignite/internal/client/table/ClientTable.java  |   3 +-
 .../ignite/client/fakes/FakeAsyncResultSet.java    |   4 +-
 .../org/apache/ignite/client/fakes/FakeCursor.java |   4 +-
 .../ignite/client/fakes/FakeInternalTable.java     |  20 ++--
 .../apache/ignite/client/fakes/FakeSession.java    |   3 +-
 .../apache/ignite/client/fakes/FakeTxManager.java  |   8 +-
 .../internal/client/ClientFutureUtilsTest.java     |   3 +-
 .../RepeatedFinishClientTransactionTest.java       |   4 +-
 .../cluster/management/ClusterInitializer.java     |   3 +-
 .../management/ClusterManagementGroupManager.java  |   9 +-
 .../cluster/management/raft/CmgRaftService.java    |   3 +-
 .../cluster/management/ClusterInitializerTest.java |   3 +-
 .../internal/deployunit/DeploymentManagerImpl.java |   9 +-
 .../metastore/ClusterStatusWatchListener.java      |   4 +-
 .../metastore/DeploymentUnitStoreImpl.java         |   5 +-
 .../metastore/NodeStatusWatchListener.java         |   4 +-
 .../internal/compute/loader/JobContextManager.java |   5 +-
 .../compute/loader/JobContextManagerTest.java      |   3 +-
 .../ConfigurationNamedListListener.java            |  10 +-
 .../configuration/ConfigurationChanger.java        |   3 +-
 .../configuration/ConfigurationRegistry.java       |   4 +-
 .../notifications/ConfigurationListenerTest.java   | 108 +++++++++----------
 .../ConfigurationListenerTestUtils.java            |  12 +--
 .../testframework/ConfigurationExtensionTest.java  |   8 +-
 .../configuration/TestConfigurationChanger.java    |   4 +-
 .../internal/event/AbstractEventProducer.java      |   4 +-
 .../apache/ignite/internal/util/AsyncWrapper.java  |   4 +-
 .../ignite/internal/util/CompletableFutures.java   |  85 +++++++++++++++
 .../causality/IncrementalVersionedValueTest.java   |   5 +-
 .../ignite/internal/event/EventProducerTest.java   |   5 +-
 .../OrderingFutureCallbackInterferenceTest.java    |   6 +-
 .../future/OrderingFutureCallbackOrderingTest.java |  14 +--
 .../future/OrderingFutureConcurrencyTest.java      |   6 +-
 .../ignite/internal/future/OrderingFutureTest.java |  16 +--
 .../internal/streamer/StreamerSubscriberTest.java  |   3 +-
 .../internal/util/CompletableFuturesTest.java      | 117 +++++++++++++++++++++
 .../ignite/internal/util/IgniteUtilsTest.java      |   6 +-
 .../testframework/util/DirectExecutor.java         |   4 +-
 .../ItDistributionZonesFilterTest.java             |   4 +-
 .../distributionzones/DistributionZoneManager.java |  37 +++----
 .../CausalityDataNodesEngine.java                  |   3 +-
 .../rebalance/DistributionZoneRebalanceEngine.java |  10 +-
 .../utils/CatalogAlterZoneEventListener.java       |  18 ++--
 .../DistributionZoneCausalityDataNodesTest.java    |  17 +--
 .../DistributionZoneRebalanceEngineTest.java       |   8 +-
 .../utils/CatalogAlterZoneEventListenerTest.java   |  28 ++---
 .../internal/network/file/ItFileTransferTest.java  |  10 +-
 .../ignite/internal/network/file/FileSender.java   |   8 +-
 .../network/file/FileTransferServiceImpl.java      |   4 +-
 .../network/file/FileTransferServiceImplTest.java  |   6 +-
 .../internal/index/ItBuildIndexOneNodeTest.java    |   7 +-
 .../index/IndexAvailabilityController.java         |  16 +--
 .../internal/index/IndexBuildController.java       |   7 +-
 .../ignite/internal/index/IndexBuildTask.java      |   6 +-
 .../apache/ignite/internal/index/IndexChooser.java |   8 +-
 .../index/IndexAvailabilityControllerTest.java     |   4 +-
 .../ignite/internal/index/IndexBuilderTest.java    |   6 +-
 .../ignite/internal/index/IndexManagerTest.java    |   6 +-
 .../impl/ItMetaStorageManagerImplTest.java         |   3 +-
 .../ItMetaStorageMultipleNodesAbstractTest.java    |   4 +-
 ...MetaStorageSafeTimePropagationAbstractTest.java |   3 +-
 .../metastorage/impl/ItMetaStorageWatchTest.java   |  14 +--
 .../impl/MetaStorageLeaderElectionListener.java    |  10 +-
 .../metastorage/impl/MetaStorageManagerImpl.java   |   4 +-
 .../metastorage/server/WatchProcessor.java         |  11 +-
 .../server/BasicOperationsKeyValueStorageTest.java |  20 ++--
 .../metastorage/server/WatchProcessorTest.java     |   8 +-
 .../metastorage/server/time/ClusterTimeTest.java   |   8 +-
 .../ignite/internal/metrics/MetricManager.java     |   8 +-
 .../ignite/internal/network/netty/NettyClient.java |   9 +-
 .../ignite/internal/network/netty/NettyServer.java |  11 +-
 .../ignite/network/DefaultMessagingService.java    |   5 +-
 .../network/recovery/VaultStateIdsTest.java        |  13 +--
 .../persistence/checkpoint/Checkpointer.java       |   6 +-
 .../persistence/compaction/Compactor.java          |   4 +-
 .../checkpoint/CheckpointPagesTest.java            |  10 +-
 .../checkpoint/CheckpointWorkflowTest.java         |   4 +-
 .../placementdriver/TestPlacementDriver.java       |   3 +-
 .../internal/placementdriver/ActiveActorTest.java  |   3 +-
 .../ItPrimaryReplicaChoiceTest.java                |   3 +-
 .../PlacementDriverManagerTest.java                |   3 +-
 .../placementdriver/AssignmentsTracker.java        |   4 +-
 .../placementdriver/PlacementDriverManager.java    |   4 +-
 .../placementdriver/leases/LeaseTracker.java       |   3 +-
 .../internal/placementdriver/LeaseTrackerTest.java |   4 +-
 .../internal/placementdriver/LeaseUpdaterTest.java |   3 +-
 .../placementdriver/PlacementDriverTest.java       |   7 +-
 .../raft/jraft/rpc/impl/AbstractClientService.java |   4 +-
 .../service/ItAbstractListenerSnapshotTest.java    |   3 +-
 .../ItPlacementDriverReplicaSideTest.java          |   3 +-
 .../raft/client/TopologyAwareRaftGroupService.java |   6 +-
 .../replicator/PlacementDriverReplicaSideTest.java |   7 +-
 .../internal/replicator/ReplicaManagerTest.java    |  14 +--
 .../rocksdb/flush/RocksDbFlushListener.java        |   3 +-
 .../internal/rocksdb/flush/RocksDbFlusher.java     |   4 +-
 .../configuration/generator/DefaultsGenerator.java |   6 +-
 .../ItDistributedConfigurationPropertiesTest.java  |   3 +-
 .../ItDistributedConfigurationStorageTest.java     |   4 +-
 .../runner/app/ItIgniteNodeRestartTest.java        |   7 +-
 .../org/apache/ignite/internal/app/IgniteImpl.java |   3 +-
 .../storage/DistributedConfigurationStorage.java   |   3 +-
 .../storage/LocalConfigurationStorage.java         |   6 +-
 .../storage/LocalFileConfigurationStorage.java     |   6 +-
 .../storage/ConfigurationStorageTest.java          |   4 +-
 .../ignite/internal/schema/SchemaManager.java      |   6 +-
 .../authentication/AuthenticationManagerImpl.java  |   3 +-
 .../ignite/internal/sql/api/SessionImpl.java       |   8 +-
 .../internal/sql/engine/AsyncSqlCursorImpl.java    |   5 +-
 .../sql/engine/QueryTransactionWrapper.java        |   5 +-
 .../internal/sql/engine/SqlQueryProcessor.java     |   3 +-
 .../sql/engine/exec/ExecutionServiceImpl.java      |   5 +-
 .../sql/engine/exec/ddl/DdlCommandHandler.java     |   6 +-
 .../sql/engine/message/MessageServiceImpl.java     |   5 +-
 .../sql/engine/schema/SqlSchemaManagerImpl.java    |   5 +-
 .../ignite/internal/sql/engine/util/Commons.java   |   7 --
 .../ignite/internal/sql/api/SessionImplTest.java   |  50 ++++-----
 .../sql/engine/exec/ExecutionServiceImplTest.java  |  18 ++--
 .../ddl/DistributionZoneDdlCommandHandlerTest.java |   4 +-
 .../sql/engine/exec/rel/ExchangeExecutionTest.java |   3 +-
 .../engine/exec/rel/ModifyNodeExecutionTest.java   |   7 +-
 .../engine/framework/ClusterServiceFactory.java    |   6 +-
 .../engine/framework/PredefinedSchemaManager.java  |   4 +-
 .../internal/storage/util/MvPartitionStorages.java |  16 +--
 .../storage/util/MvPartitionStoragesTest.java      |  16 +--
 .../storage/impl/TestMvPartitionStorage.java       |   3 +-
 .../internal/storage/impl/TestMvTableStorage.java  |  14 +--
 .../pagememory/AbstractPageMemoryTableStorage.java |   6 +-
 .../PersistentPageMemoryStorageEngine.java         |   4 +-
 .../VolatilePageMemoryStorageEngine.java           |   4 +-
 .../pagememory/VolatilePageMemoryTableStorage.java |   6 +-
 .../mv/VolatilePageMemoryMvPartitionStorage.java   |   4 +-
 .../storage/rocksdb/RocksDbStorageEngine.java      |   4 +-
 .../storage/rocksdb/RocksDbTableStorage.java       |  14 +--
 .../internal/systemview/SystemViewManagerTest.java |  10 +-
 .../ignite/distributed/ReplicaUnavailableTest.java |   6 +-
 .../ignite/internal/table/ItColocationTest.java    |  15 +--
 ...ctClientStreamerPartitionAwarenessProvider.java |   6 +-
 .../internal/table/distributed/LowWatermark.java   |   4 +-
 .../internal/table/distributed/PartitionMover.java |   3 +-
 .../PartitionReplicatorNodeRecovery.java           |   8 +-
 .../internal/table/distributed/TableManager.java   |  34 +++---
 .../ignite/internal/table/distributed/gc/MvGc.java |   6 +-
 .../snapshot/incoming/IncomingSnapshotCopier.java  |  20 ++--
 .../replicator/PartitionReplicaListener.java       |  90 ++++++++--------
 .../distributed/storage/InternalTableImpl.java     |   7 +-
 .../ignite/internal/utils/RebalanceUtil.java       |   5 +-
 .../table/distributed/LowWatermarkTest.java        |  13 +--
 .../table/distributed/PartitionMoverTest.java      |   4 +-
 .../table/distributed/TableManagerTest.java        |  27 ++---
 .../incoming/IncomingSnapshotCopierTest.java       |   5 +-
 .../SnapshotAwarePartitionDataStorageTest.java     |   3 +-
 .../PartitionReplicaListenerDurableUnlockTest.java |  12 +--
 .../PartitionReplicaListenerIndexLockingTest.java  |   3 +-
 .../replication/PartitionReplicaListenerTest.java  |  15 +--
 .../SchemaCompatibilityValidatorTest.java          |   4 +-
 .../apache/ignite/distributed/ItTxTestCluster.java |   6 +-
 .../schema/AlwaysSyncedSchemaSyncService.java      |   4 +-
 .../table/impl/DummyValidationSchemasSource.java   |   4 +-
 .../ignite/internal/tx/impl/HeapLockManager.java   |   4 +-
 .../ignite/internal/tx/impl/OrphanDetector.java    |   6 +-
 .../internal/tx/impl/ReadOnlyTransactionImpl.java  |   4 +-
 .../ignite/internal/tx/impl/TxManagerImpl.java     |  11 +-
 .../state/rocksdb/TxStateRocksDbStorage.java       |  12 +--
 .../internal/tx/AbstractLockManagerEventsTest.java |   4 +-
 .../apache/ignite/internal/tx/TxManagerTest.java   |  22 ++--
 .../tx/impl/ReadWriteTransactionImplTest.java      |   4 +-
 .../tx/storage/state/test/TestTxStateStorage.java  |   8 +-
 188 files changed, 1071 insertions(+), 724 deletions(-)

diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
index 8d8a5c9e82..a93614192f 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/CatalogManagerImpl.java
@@ -27,6 +27,7 @@ import static org.apache.ignite.internal.catalog.CatalogParamsValidationUtils.va
 import static org.apache.ignite.internal.catalog.commands.CatalogUtils.fromParams;
 import static org.apache.ignite.internal.catalog.commands.CatalogUtils.fromParamsAndPreviousValue;
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -330,7 +331,7 @@ public class CatalogManagerImpl extends AbstractEventProducer<CatalogEvent, Cata
     @Override
     public CompletableFuture<Void> execute(List<CatalogCommand> commands) {
         if (nullOrEmpty(commands)) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         return saveUpdateAndWaitForActivation(new BulkUpdateProducer(List.copyOf(commands)));
diff --git a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/ClockWaiter.java b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/ClockWaiter.java
index c7c6a7f911..cbb8ad84f2 100644
--- a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/ClockWaiter.java
+++ b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/ClockWaiter.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.catalog;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.CompletableFuture;
@@ -160,7 +160,7 @@ public class ClockWaiter implements IgniteComponent {
         HybridTimestamp now = clock.now();
 
         if (targetTimestamp.compareTo(now) <= 0) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         CompletableFuture<Void> future = nowTracker.waitFor(targetTimestamp.longValue());
diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
index a8b3185757..d5b91dd392 100644
--- a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
+++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogManagerSelfTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.catalog;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static java.util.stream.Collectors.toList;
 import static org.apache.ignite.internal.catalog.CatalogService.DEFAULT_SCHEMA_NAME;
@@ -50,6 +49,8 @@ import static org.apache.ignite.internal.testframework.matchers.CompletableFutur
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrowFast;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.trueCompletedFuture;
 import static org.apache.ignite.sql.ColumnType.DECIMAL;
 import static org.apache.ignite.sql.ColumnType.INT32;
 import static org.apache.ignite.sql.ColumnType.INT64;
@@ -1034,7 +1035,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
 
             updateHandlerCapture.getValue().handle(update, clock.now(), 0);
 
-            return completedFuture(false);
+            return falseCompletedFuture();
         });
 
         CompletableFuture<Void> createTableFut = manager.execute(simpleTable("T"));
@@ -1094,7 +1095,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
     @Test
     public void testTableEvents() {
         EventListener<CatalogEventParameters> eventListener = mock(EventListener.class);
-        when(eventListener.notify(any(), any())).thenReturn(completedFuture(false));
+        when(eventListener.notify(any(), any())).thenReturn(falseCompletedFuture());
 
         manager.listen(CatalogEvent.TABLE_CREATE, eventListener);
         manager.listen(CatalogEvent.TABLE_DROP, eventListener);
@@ -1115,7 +1116,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
         CatalogCommand dropIndexCmd = DropIndexCommand.builder().schemaName(SCHEMA_NAME).indexName(INDEX_NAME).build();
 
         EventListener<CatalogEventParameters> eventListener = mock(EventListener.class);
-        when(eventListener.notify(any(), any())).thenReturn(completedFuture(false));
+        when(eventListener.notify(any(), any())).thenReturn(falseCompletedFuture());
 
         manager.listen(CatalogEvent.INDEX_CREATE, eventListener);
         manager.listen(CatalogEvent.INDEX_DROP, eventListener);
@@ -1396,7 +1397,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
                 .build();
 
         EventListener<CatalogEventParameters> eventListener = mock(EventListener.class);
-        when(eventListener.notify(any(), any())).thenReturn(completedFuture(false));
+        when(eventListener.notify(any(), any())).thenReturn(falseCompletedFuture());
 
         manager.listen(CatalogEvent.ZONE_CREATE, eventListener);
         manager.listen(CatalogEvent.ZONE_DROP, eventListener);
@@ -1418,7 +1419,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
     @Test
     public void testColumnEvents() {
         EventListener<CatalogEventParameters> eventListener = mock(EventListener.class);
-        when(eventListener.notify(any(), any())).thenReturn(completedFuture(false));
+        when(eventListener.notify(any(), any())).thenReturn(falseCompletedFuture());
 
         manager.listen(CatalogEvent.TABLE_ALTER, eventListener);
 
@@ -1479,7 +1480,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
 
                 result.complete(null);
 
-                return completedFuture(true);
+                return trueCompletedFuture();
             } catch (Throwable t) {
                 result.completeExceptionally(t);
 
@@ -1517,7 +1518,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
 
         ArgumentCaptor<DropIndexEventParameters> captor = ArgumentCaptor.forClass(DropIndexEventParameters.class);
 
-        doReturn(completedFuture(false)).when(eventListener).notify(captor.capture(), any());
+        doReturn(falseCompletedFuture()).when(eventListener).notify(captor.capture(), any());
 
         manager.listen(CatalogEvent.INDEX_DROP, eventListener);
 
@@ -1915,7 +1916,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
                 }
             }
 
-            return completedFuture(false);
+            return falseCompletedFuture();
         });
 
         assertThat(
@@ -1941,7 +1942,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
                 }
             }
 
-            return completedFuture(false);
+            return falseCompletedFuture();
         });
 
         String tableName = TABLE_NAME + "_new";
@@ -1972,7 +1973,7 @@ public class CatalogManagerSelfTest extends BaseCatalogManagerTest {
                 }
             }
 
-            return completedFuture(false);
+            return falseCompletedFuture();
         });
 
         createSomeTable(TABLE_NAME);
diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogSystemViewTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogSystemViewTest.java
index 4a47983c61..e7a7b3fbfd 100644
--- a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogSystemViewTest.java
+++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/CatalogSystemViewTest.java
@@ -17,12 +17,12 @@
 
 package org.apache.ignite.internal.catalog;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.stream.Collectors.toList;
 import static org.apache.ignite.internal.catalog.CatalogManagerImpl.INITIAL_CAUSALITY_TOKEN;
 import static org.apache.ignite.internal.catalog.CatalogService.SYSTEM_SCHEMA_NAME;
 import static org.apache.ignite.internal.catalog.CatalogTestUtils.columnParams;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
 import static org.apache.ignite.sql.ColumnType.INT32;
 import static org.apache.ignite.sql.ColumnType.STRING;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -253,7 +253,7 @@ public class CatalogSystemViewTest extends BaseCatalogManagerTest {
     @EnumSource(SystemViewType.class)
     public void testCreateSystemViewDoesNotReplaceExistingViewWithTheSameNameIfItsStructureIsTheSame(SystemViewType type) {
         EventListener<CatalogEventParameters> eventListener = mock(EventListener.class);
-        when(eventListener.notify(any(), any())).thenReturn(completedFuture(false));
+        when(eventListener.notify(any(), any())).thenReturn(falseCompletedFuture());
 
         manager.listen(CatalogEvent.SYSTEM_VIEW_CREATE, eventListener);
 
diff --git a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/storage/UpdateLogImplTest.java b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/storage/UpdateLogImplTest.java
index f08c469409..8b8c3fc26d 100644
--- a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/storage/UpdateLogImplTest.java
+++ b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/storage/UpdateLogImplTest.java
@@ -17,10 +17,10 @@
 
 package org.apache.ignite.internal.catalog.storage;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.waitForCondition;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.equalTo;
@@ -85,7 +85,7 @@ class UpdateLogImplTest extends BaseIgniteAbstractTest {
     @Test
     void logReplayedOnStart() throws Exception {
         // First, let's append a few entries to the update log.
-        UpdateLogImpl updateLogImpl = createAndStartUpdateLogImpl((update, ts, causalityToken) -> completedFuture(null));
+        UpdateLogImpl updateLogImpl = createAndStartUpdateLogImpl((update, ts, causalityToken) -> nullCompletedFuture());
 
         assertThat(metastore.deployWatches(), willCompleteSuccessfully());
 
@@ -103,7 +103,7 @@ class UpdateLogImplTest extends BaseIgniteAbstractTest {
         createAndStartUpdateLogImpl((update, ts, causalityToken) -> {
             actualUpdates.add(update);
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         // Let's check that we have recovered to the latest version.
@@ -172,7 +172,7 @@ class UpdateLogImplTest extends BaseIgniteAbstractTest {
             appliedVersions.add(update.version());
             causalityTokens.add(causalityToken);
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         long revisionBefore = metastore.appliedRevision();
diff --git a/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/CatalogTestUtils.java b/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/CatalogTestUtils.java
index d621ba1eb8..4932bb0878 100644
--- a/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/CatalogTestUtils.java
+++ b/modules/catalog/src/testFixtures/java/org/apache/ignite/internal/catalog/CatalogTestUtils.java
@@ -17,9 +17,9 @@
 
 package org.apache.ignite.internal.catalog;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.catalog.CatalogService.DEFAULT_SCHEMA_NAME;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
@@ -273,7 +273,7 @@ public class CatalogTestUtils {
         @Override
         public synchronized CompletableFuture<Boolean> append(VersionedUpdate update) {
             if (update.version() - 1 != lastSeenVersion) {
-                return completedFuture(false);
+                return falseCompletedFuture();
             }
 
             lastSeenVersion = update.version();
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientPrimaryReplicaTracker.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientPrimaryReplicaTracker.java
index c037538201..89d44e71dc 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientPrimaryReplicaTracker.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/ClientPrimaryReplicaTracker.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.client.handler;
 
+import static java.util.concurrent.CompletableFuture.completedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
 import static org.apache.ignite.lang.ErrorGroups.Table.TABLE_NOT_FOUND_ERR;
 
 import java.util.ArrayList;
@@ -142,7 +144,7 @@ public class ClientPrimaryReplicaTracker implements EventListener<EventParameter
         // Check happy path: if we already have all replicas, and this.maxStartTime >= maxStartTime, return synchronously.
         PrimaryReplicasResult fastRes = primaryReplicasNoWait(tableId, maxStartTime, timestamp, false);
         if (fastRes != null) {
-            return CompletableFuture.completedFuture(fastRes);
+            return completedFuture(fastRes);
         }
 
         // Request primary for all partitions.
@@ -272,7 +274,7 @@ public class ClientPrimaryReplicaTracker implements EventListener<EventParameter
 
         try {
             if (exception != null) {
-                return CompletableFuture.completedFuture(false);
+                return falseCompletedFuture();
             }
 
             return notifyInternal(parameters);
@@ -285,24 +287,24 @@ public class ClientPrimaryReplicaTracker implements EventListener<EventParameter
         if (parameters instanceof DropTableEventParameters) {
             removeTable((DropTableEventParameters) parameters);
 
-            return CompletableFuture.completedFuture(false);
+            return falseCompletedFuture();
         }
 
         if (!(parameters instanceof PrimaryReplicaEventParameters)) {
             assert false : "Unexpected event parameters: " + parameters.getClass();
 
-            return CompletableFuture.completedFuture(false);
+            return falseCompletedFuture();
         }
 
         PrimaryReplicaEventParameters primaryReplicaEvent = (PrimaryReplicaEventParameters) parameters;
         if (!(primaryReplicaEvent.groupId() instanceof TablePartitionId)) {
-            return CompletableFuture.completedFuture(false);
+            return falseCompletedFuture();
         }
 
         TablePartitionId tablePartitionId = (TablePartitionId) primaryReplicaEvent.groupId();
         updatePrimaryReplica(tablePartitionId, primaryReplicaEvent.startTime(), primaryReplicaEvent.leaseholder());
 
-        return CompletableFuture.completedFuture(false); // false: don't remove listener.
+        return falseCompletedFuture(); // false: don't remove listener.
     }
 
     private void removeTable(DropTableEventParameters dropTableEvent) {
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImpl.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImpl.java
index 1005000876..46579fcda5 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImpl.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImpl.java
@@ -20,6 +20,7 @@ package org.apache.ignite.client.handler;
 import static org.apache.ignite.internal.jdbc.proto.IgniteQueryErrorCode.UNKNOWN;
 import static org.apache.ignite.internal.jdbc.proto.IgniteQueryErrorCode.UNSUPPORTED_OPERATION;
 import static org.apache.ignite.internal.util.ArrayUtils.OBJECT_EMPTY_ARRAY;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.lang.ErrorGroups.Client.CONNECTION_ERR;
 
 import it.unimi.dsi.fastutil.ints.IntArrayList;
@@ -452,7 +453,7 @@ public class JdbcQueryEventHandlerImpl implements JdbcQueryEventHandler {
             tx = null;
 
             if (tx0 == null) {
-                return CompletableFuture.completedFuture(null);
+                return nullCompletedFuture();
             }
 
             return commit ? tx0.commitAsync() : tx0.rollbackAsync();
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlCursorNextPageRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlCursorNextPageRequest.java
index 1100ddef36..318208a8ec 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlCursorNextPageRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlCursorNextPageRequest.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.client.handler.requests.sql;
 
 import static org.apache.ignite.client.handler.requests.sql.ClientSqlCommon.packCurrentPage;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.client.handler.ClientResourceRegistry;
@@ -63,7 +64,7 @@ public class ClientSqlCursorNextPageRequest {
 
                         return resultSet.closeAsync();
                     } else {
-                        return CompletableFuture.completedFuture(null);
+                        return nullCompletedFuture();
                     }
                 })
                 .toCompletableFuture();
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlExecuteRequest.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlExecuteRequest.java
index 5219c8c6d5..702c5f6325 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlExecuteRequest.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlExecuteRequest.java
@@ -19,6 +19,7 @@ package org.apache.ignite.client.handler.requests.sql;
 
 import static org.apache.ignite.client.handler.requests.sql.ClientSqlCommon.packCurrentPage;
 import static org.apache.ignite.client.handler.requests.table.ClientTableCommon.readTx;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.HashMap;
 import java.util.List;
@@ -141,7 +142,7 @@ public class ClientSqlExecuteRequest {
             packCurrentPage(out, asyncResultSet);
 
             return hasResource
-                    ? CompletableFuture.completedFuture(null)
+                    ? nullCompletedFuture()
                     : asyncResultSet.closeAsync().thenCompose(res -> session.closeAsync());
         } else {
             return asyncResultSet.closeAsync().thenCompose(res -> session.closeAsync());
diff --git a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlResultSet.java b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlResultSet.java
index e95625b117..802cce0723 100644
--- a/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlResultSet.java
+++ b/modules/client-handler/src/main/java/org/apache/ignite/client/handler/requests/sql/ClientSqlResultSet.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.client.handler.requests.sql;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicBoolean;
 import org.apache.ignite.client.handler.ClientHandlerMetricSource;
@@ -78,6 +80,6 @@ class ClientSqlResultSet {
             return resultSet.closeAsync().thenCompose(res -> session.closeAsync()).toCompletableFuture();
         }
 
-        return CompletableFuture.completedFuture(null);
+        return nullCompletedFuture();
     }
 }
diff --git a/modules/client-handler/src/test/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImplTest.java b/modules/client-handler/src/test/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImplTest.java
index d0f84e1e25..bb5113e613 100644
--- a/modules/client-handler/src/test/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImplTest.java
+++ b/modules/client-handler/src/test/java/org/apache/ignite/client/handler/JdbcQueryEventHandlerImplTest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.client.handler;
 import static org.apache.ignite.internal.jdbc.proto.event.Response.STATUS_FAILED;
 import static org.apache.ignite.internal.jdbc.proto.event.Response.STATUS_SUCCESS;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.is;
@@ -143,7 +144,7 @@ class JdbcQueryEventHandlerImplTest extends BaseIgniteAbstractTest {
     public void explicitTxRollbackOnCloseRegistry() {
         InternalTransaction tx = mock(InternalTransaction.class);
 
-        when(tx.rollbackAsync()).thenReturn(CompletableFuture.completedFuture(null));
+        when(tx.rollbackAsync()).thenReturn(nullCompletedFuture());
         when(igniteTransactions.begin()).thenReturn(tx);
 
         long connectionId = acquireConnectionId();
@@ -164,8 +165,8 @@ class JdbcQueryEventHandlerImplTest extends BaseIgniteAbstractTest {
                 .thenReturn(CompletableFuture.failedFuture(new RuntimeException("Expected")));
 
         InternalTransaction tx = mock(InternalTransaction.class);
-        when(tx.commitAsync()).thenReturn(CompletableFuture.completedFuture(null));
-        when(tx.rollbackAsync()).thenReturn(CompletableFuture.completedFuture(null));
+        when(tx.commitAsync()).thenReturn(nullCompletedFuture());
+        when(tx.rollbackAsync()).thenReturn(nullCompletedFuture());
         when(igniteTransactions.begin()).thenReturn(tx);
 
         long connectionId = acquireConnectionId();
diff --git a/modules/client-handler/src/testFixtures/java/org/apache/ignite/client/handler/FakePlacementDriver.java b/modules/client-handler/src/testFixtures/java/org/apache/ignite/client/handler/FakePlacementDriver.java
index a43b052ee0..9cd149bbc7 100644
--- a/modules/client-handler/src/testFixtures/java/org/apache/ignite/client/handler/FakePlacementDriver.java
+++ b/modules/client-handler/src/testFixtures/java/org/apache/ignite/client/handler/FakePlacementDriver.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.client.handler;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -93,7 +95,7 @@ public class FakePlacementDriver extends AbstractEventProducer<PrimaryReplicaEve
 
     @Override
     public CompletableFuture<Void> previousPrimaryExpired(ReplicationGroupId grpId) {
-        return CompletableFuture.completedFuture(null);
+        return nullCompletedFuture();
     }
 
     private static ReplicaMeta getReplicaMeta(String leaseholder, long leaseStartTime) {
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/ReliableChannel.java b/modules/client/src/main/java/org/apache/ignite/internal/client/ReliableChannel.java
index a7ba04d227..ce1e5a22d8 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/ReliableChannel.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/ReliableChannel.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.client;
 
+import static java.util.concurrent.CompletableFuture.completedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.lang.ErrorGroups.Client.CLUSTER_ID_MISMATCH_ERR;
 import static org.apache.ignite.lang.ErrorGroups.Client.CONFIGURATION_ERR;
 import static org.apache.ignite.lang.ErrorGroups.Client.CONNECTION_ERR;
@@ -261,7 +263,7 @@ public final class ReliableChannel implements AutoCloseable {
             if (holder != null) {
                 return holder.getOrCreateChannelAsync().thenCompose(ch -> {
                     if (ch != null) {
-                        return CompletableFuture.completedFuture(ch);
+                        return completedFuture(ch);
                     } else {
                         return getDefaultChannelAsync();
                     }
@@ -273,7 +275,7 @@ public final class ReliableChannel implements AutoCloseable {
         ClientChannel nextCh = getNextChannelWithoutReconnect();
 
         if (nextCh != null) {
-            return CompletableFuture.completedFuture(nextCh);
+            return completedFuture(nextCh);
         }
 
         // 3. Default connection (with reconnect if necessary).
@@ -484,7 +486,7 @@ public final class ReliableChannel implements AutoCloseable {
     CompletableFuture<ClientChannel> channelsInitAsync() {
         // Do not establish connections if interrupted.
         if (!initChannelHolders()) {
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         }
 
         // Establish default channel connection.
@@ -552,11 +554,11 @@ public final class ReliableChannel implements AutoCloseable {
             var hld = channels.get(defaultChIdx);
 
             if (hld == null) {
-                return CompletableFuture.completedFuture(null);
+                return nullCompletedFuture();
             }
 
             CompletableFuture<ClientChannel> fut = hld.getOrCreateChannelAsync();
-            return fut == null ? CompletableFuture.completedFuture(null) : fut;
+            return fut == null ? nullCompletedFuture() : fut;
         } finally {
             curChannelsGuard.readLock().unlock();
         }
@@ -753,7 +755,7 @@ public final class ReliableChannel implements AutoCloseable {
          */
         private CompletableFuture<ClientChannel> getOrCreateChannelAsync(boolean ignoreThrottling) {
             if (close) {
-                return CompletableFuture.completedFuture(null);
+                return nullCompletedFuture();
             }
 
             var chFut0 = chFut;
@@ -764,7 +766,7 @@ public final class ReliableChannel implements AutoCloseable {
 
             synchronized (this) {
                 if (close) {
-                    return CompletableFuture.completedFuture(null);
+                    return nullCompletedFuture();
                 }
 
                 chFut0 = chFut;
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/TcpClientChannel.java b/modules/client/src/main/java/org/apache/ignite/internal/client/TcpClientChannel.java
index c44a93b1ec..4139959af0 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/TcpClientChannel.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/TcpClientChannel.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.client;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.ExceptionUtils.copyExceptionWithCause;
 import static org.apache.ignite.internal.util.ExceptionUtils.sneakyThrow;
 import static org.apache.ignite.lang.ErrorGroups.Client.CONNECTION_ERR;
@@ -617,7 +618,7 @@ class TcpClientChannel implements ClientChannel, ClientMessageHandler, ClientCon
             protocolCtx = new ProtocolContext(
                     srvVer, ProtocolBitmaskFeature.allFeaturesAsEnumSet(), serverIdleTimeout, clusterNode, clusterId);
 
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         } catch (Exception e) {
             log.warn("Failed to handle handshake response [remoteAddress=" + cfg.getAddress() + "]: " + e.getMessage(), e);
 
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/sql/ClientAsyncResultSet.java b/modules/client/src/main/java/org/apache/ignite/internal/client/sql/ClientAsyncResultSet.java
index d38c641c44..1df14b84cf 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/sql/ClientAsyncResultSet.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/sql/ClientAsyncResultSet.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.client.sql;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.lang.ErrorGroups.Sql.CURSOR_NO_MORE_PAGES_ERR;
 
 import java.util.ArrayList;
@@ -192,7 +193,7 @@ class ClientAsyncResultSet<T> implements AsyncResultSet<T> {
     @Override
     public CompletableFuture<Void> closeAsync() {
         if (resourceId == null || closed) {
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         }
 
         closed = true;
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/sql/ClientSession.java b/modules/client/src/main/java/org/apache/ignite/internal/client/sql/ClientSession.java
index 78aef7e541..448f2d7b09 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/sql/ClientSession.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/sql/ClientSession.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.client.sql;
 
 import static org.apache.ignite.internal.client.ClientUtils.sync;
 import static org.apache.ignite.internal.client.table.ClientTable.writeTx;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.Map;
 import java.util.Map.Entry;
@@ -279,7 +280,7 @@ public class ClientSession implements AbstractSession {
     @Override
     public CompletableFuture<Void> closeAsync() {
         // TODO IGNITE-17134 Cancel/close all active cursors, queries, futures.
-        return CompletableFuture.completedFuture(null);
+        return nullCompletedFuture();
     }
 
     /** {@inheritDoc} */
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueBinaryView.java b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueBinaryView.java
index 9c32d5b565..20838e0016 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueBinaryView.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueBinaryView.java
@@ -18,6 +18,9 @@
 package org.apache.ignite.internal.client.table;
 
 import static org.apache.ignite.internal.client.ClientUtils.sync;
+import static org.apache.ignite.internal.util.CompletableFutures.emptyCollectionCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.emptyMapCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -94,7 +97,7 @@ public class ClientKeyValueBinaryView implements KeyValueView<Tuple, Tuple> {
         Objects.requireNonNull(keys);
 
         if (keys.isEmpty()) {
-            return CompletableFuture.completedFuture(Collections.emptyMap());
+            return emptyMapCompletedFuture();
         }
 
         return tbl.doSchemaOutInOpAsync(
@@ -192,7 +195,7 @@ public class ClientKeyValueBinaryView implements KeyValueView<Tuple, Tuple> {
         Objects.requireNonNull(pairs);
 
         if (pairs.isEmpty()) {
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         }
 
         return tbl.doSchemaOutOpAsync(
@@ -310,7 +313,7 @@ public class ClientKeyValueBinaryView implements KeyValueView<Tuple, Tuple> {
         Objects.requireNonNull(keys);
 
         if (keys.isEmpty()) {
-            return CompletableFuture.completedFuture(Collections.emptyList());
+            return emptyCollectionCompletedFuture();
         }
 
         return tbl.doSchemaOutInOpAsync(
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueView.java b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueView.java
index f44b242ceb..9a6947512f 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueView.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientKeyValueView.java
@@ -19,6 +19,9 @@ package org.apache.ignite.internal.client.table;
 
 import static org.apache.ignite.internal.client.ClientUtils.sync;
 import static org.apache.ignite.internal.client.table.ClientTable.writeTx;
+import static org.apache.ignite.internal.util.CompletableFutures.emptyCollectionCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.emptyMapCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.lang.ErrorGroups.Common.INTERNAL_ERR;
 
 import java.util.BitSet;
@@ -153,7 +156,7 @@ public class ClientKeyValueView<K, V> implements KeyValueView<K, V> {
         Objects.requireNonNull(keys);
 
         if (keys.isEmpty()) {
-            return CompletableFuture.completedFuture(Collections.emptyMap());
+            return emptyMapCompletedFuture();
         }
 
         return tbl.doSchemaOutInOpAsync(
@@ -212,7 +215,7 @@ public class ClientKeyValueView<K, V> implements KeyValueView<K, V> {
         Objects.requireNonNull(pairs);
 
         if (pairs.isEmpty()) {
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         }
 
         return tbl.doSchemaOutOpAsync(
@@ -333,7 +336,7 @@ public class ClientKeyValueView<K, V> implements KeyValueView<K, V> {
         Objects.requireNonNull(keys);
 
         if (keys.isEmpty()) {
-            return CompletableFuture.completedFuture(Collections.emptyList());
+            return emptyCollectionCompletedFuture();
         }
 
         return tbl.doSchemaOutInOpAsync(
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordBinaryView.java b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordBinaryView.java
index 5c7d17c6ec..a8d5170e4f 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordBinaryView.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordBinaryView.java
@@ -17,8 +17,9 @@
 
 package org.apache.ignite.internal.client.table;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.client.ClientUtils.sync;
+import static org.apache.ignite.internal.util.CompletableFutures.emptyListCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -87,7 +88,7 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
         Objects.requireNonNull(keyRecs);
 
         if (keyRecs.isEmpty()) {
-            return completedFuture(Collections.emptyList());
+            return emptyListCompletedFuture();
         }
 
         return tbl.doSchemaOutInOpAsync(
@@ -129,7 +130,7 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
         Objects.requireNonNull(recs);
 
         if (recs.isEmpty()) {
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         }
 
         return tbl.doSchemaOutOpAsync(
@@ -188,7 +189,7 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
         Objects.requireNonNull(recs);
 
         if (recs.isEmpty()) {
-            return completedFuture(Collections.emptyList());
+            return emptyListCompletedFuture();
         }
 
         return tbl.doSchemaOutInOpAsync(
@@ -325,7 +326,7 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
         Objects.requireNonNull(keyRecs);
 
         if (keyRecs.isEmpty()) {
-            return CompletableFuture.completedFuture(Collections.emptyList());
+            return emptyListCompletedFuture();
         }
 
         return tbl.doSchemaOutInOpAsync(
@@ -348,7 +349,7 @@ public class ClientRecordBinaryView implements RecordView<Tuple> {
         Objects.requireNonNull(recs);
 
         if (recs.isEmpty()) {
-            return CompletableFuture.completedFuture(Collections.emptyList());
+            return emptyListCompletedFuture();
         }
 
         return tbl.doSchemaOutInOpAsync(
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordView.java b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordView.java
index 33745d7fbc..034f6c40d0 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordView.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientRecordView.java
@@ -17,8 +17,9 @@
 
 package org.apache.ignite.internal.client.table;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.client.ClientUtils.sync;
+import static org.apache.ignite.internal.util.CompletableFutures.emptyListCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -87,7 +88,7 @@ public class ClientRecordView<R> implements RecordView<R> {
         Objects.requireNonNull(keyRecs);
 
         if (keyRecs.isEmpty()) {
-            return completedFuture(Collections.emptyList());
+            return emptyListCompletedFuture();
         }
 
         return tbl.doSchemaOutInOpAsync(
@@ -129,7 +130,7 @@ public class ClientRecordView<R> implements RecordView<R> {
         Objects.requireNonNull(recs);
 
         if (recs.isEmpty()) {
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         }
 
         return tbl.doSchemaOutOpAsync(
@@ -188,7 +189,7 @@ public class ClientRecordView<R> implements RecordView<R> {
         Objects.requireNonNull(recs);
 
         if (recs.isEmpty()) {
-            return CompletableFuture.completedFuture(Collections.emptyList());
+            return emptyListCompletedFuture();
         }
 
         return tbl.doSchemaOutInOpAsync(
@@ -322,7 +323,7 @@ public class ClientRecordView<R> implements RecordView<R> {
         Objects.requireNonNull(keyRecs);
 
         if (keyRecs.isEmpty()) {
-            return CompletableFuture.completedFuture(Collections.emptyList());
+            return emptyListCompletedFuture();
         }
 
         return tbl.doSchemaOutInOpAsync(
@@ -345,7 +346,7 @@ public class ClientRecordView<R> implements RecordView<R> {
         Objects.requireNonNull(recs);
 
         if (recs.isEmpty()) {
-            return CompletableFuture.completedFuture(Collections.emptyList());
+            return emptyListCompletedFuture();
         }
 
         return tbl.doSchemaOutInOpAsync(
diff --git a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTable.java b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTable.java
index 51ffb9e35a..43ea6b766a 100644
--- a/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTable.java
+++ b/modules/client/src/main/java/org/apache/ignite/internal/client/table/ClientTable.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.client.table;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.lang.ErrorGroups.Client.CONNECTION_ERR;
 import static org.apache.ignite.lang.ErrorGroups.Common.INTERNAL_ERR;
 
@@ -381,7 +382,7 @@ public class ClientTable implements Table {
 
         CompletableFuture<ClientSchema> schemaFut = getSchema(schemaVersionOverride == null ? latestSchemaVer : schemaVersionOverride);
         CompletableFuture<List<String>> partitionsFut = provider == null || !provider.isPartitionAwarenessEnabled()
-                ? CompletableFuture.completedFuture(null)
+                ? nullCompletedFuture()
                 : getPartitionAssignment();
 
         // Wait for schema and partition assignment.
diff --git a/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeAsyncResultSet.java b/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeAsyncResultSet.java
index 20c0058cc7..5e96bbb538 100644
--- a/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeAsyncResultSet.java
+++ b/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeAsyncResultSet.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.client.fakes;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.time.Duration;
@@ -207,7 +209,7 @@ public class FakeAsyncResultSet implements AsyncResultSet {
     /** {@inheritDoc} */
     @Override
     public CompletableFuture<Void> closeAsync() {
-        return CompletableFuture.completedFuture(null);
+        return nullCompletedFuture();
     }
 
     private SqlRow getRow(Object... vals) {
diff --git a/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeCursor.java b/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeCursor.java
index 340c1459d3..92af4eaea8 100644
--- a/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeCursor.java
+++ b/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeCursor.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.client.fakes;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
@@ -38,7 +40,7 @@ public class FakeCursor implements AsyncSqlCursor<List<Object>> {
 
     @Override
     public CompletableFuture<Void> closeAsync() {
-        return CompletableFuture.completedFuture(null);
+        return nullCompletedFuture();
     }
 
     @Override
diff --git a/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeInternalTable.java b/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeInternalTable.java
index 6bab51f48c..770204fd04 100644
--- a/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeInternalTable.java
+++ b/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeInternalTable.java
@@ -18,6 +18,10 @@
 package org.apache.ignite.client.fakes;
 
 import static java.util.concurrent.CompletableFuture.completedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.booleanCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.trueCompletedFuture;
 
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
@@ -156,7 +160,7 @@ public class FakeInternalTable implements InternalTable {
     public CompletableFuture<Void> upsert(BinaryRowEx row, @Nullable InternalTransaction tx) {
         upsertImpl(keyExtractor.extractColumns(row), row);
 
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     private void upsertImpl(BinaryTuple key, BinaryRow row) {
@@ -172,7 +176,7 @@ public class FakeInternalTable implements InternalTable {
         }
 
         onDataAccess("upsertAll", rows);
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     @Override
@@ -206,7 +210,7 @@ public class FakeInternalTable implements InternalTable {
 
         onDataAccess("insert", row);
 
-        return completedFuture(old == null);
+        return booleanCompletedFuture(old == null);
     }
 
     @Override
@@ -227,7 +231,7 @@ public class FakeInternalTable implements InternalTable {
     public CompletableFuture<Boolean> replace(BinaryRowEx row, @Nullable InternalTransaction tx) {
         BinaryTuple key = keyExtractor.extractColumns(row);
 
-        return completedFuture(replaceImpl(key, row, tx) != null);
+        return booleanCompletedFuture(replaceImpl(key, row, tx) != null);
     }
 
     @Override
@@ -238,13 +242,13 @@ public class FakeInternalTable implements InternalTable {
 
         if (old == null || !old.tupleSlice().equals(oldRow.tupleSlice())) {
             onDataAccess("replace", oldRow);
-            return completedFuture(false);
+            return falseCompletedFuture();
         }
 
         upsertImpl(key, newRow);
 
         onDataAccess("replace", oldRow);
-        return completedFuture(true);
+        return trueCompletedFuture();
     }
 
     private @Nullable BinaryRow replaceImpl(BinaryTuple key, BinaryRow row, @Nullable InternalTransaction tx) {
@@ -283,7 +287,7 @@ public class FakeInternalTable implements InternalTable {
         }
 
         onDataAccess("delete", keyRow);
-        return completedFuture(old != null);
+        return booleanCompletedFuture(old != null);
     }
 
     @Override
@@ -300,7 +304,7 @@ public class FakeInternalTable implements InternalTable {
         }
 
         onDataAccess("deleteExact", oldRow);
-        return completedFuture(res);
+        return booleanCompletedFuture(res);
     }
 
     @Override
diff --git a/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeSession.java b/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeSession.java
index 3e07f3d14a..43f677b34d 100644
--- a/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeSession.java
+++ b/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeSession.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.client.fakes;
 
 import static org.apache.ignite.internal.client.ClientUtils.sync;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.lang.ErrorGroups.Sql.STMT_VALIDATION_ERR;
 
 import java.util.Map;
@@ -219,7 +220,7 @@ public class FakeSession implements AbstractSession {
     /** {@inheritDoc} */
     @Override
     public CompletableFuture<Void> closeAsync() {
-        return CompletableFuture.completedFuture(null);
+        return nullCompletedFuture();
     }
 
     /** {@inheritDoc} */
diff --git a/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeTxManager.java b/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeTxManager.java
index ef00ab2d48..43ff6feaa9 100644
--- a/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeTxManager.java
+++ b/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeTxManager.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.client.fakes;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.Map;
 import java.util.UUID;
@@ -109,7 +109,7 @@ public class FakeTxManager implements TxManager {
 
             @Override
             public CompletableFuture<Void> commitAsync() {
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             @Override
@@ -119,7 +119,7 @@ public class FakeTxManager implements TxManager {
 
             @Override
             public CompletableFuture<Void> rollbackAsync() {
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             @Override
@@ -187,7 +187,7 @@ public class FakeTxManager implements TxManager {
             boolean commit,
             @Nullable HybridTimestamp commitTimestamp
     ) {
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     @Override
diff --git a/modules/client/src/test/java/org/apache/ignite/internal/client/ClientFutureUtilsTest.java b/modules/client/src/test/java/org/apache/ignite/internal/client/ClientFutureUtilsTest.java
index d78e02caed..6774963985 100644
--- a/modules/client/src/test/java/org/apache/ignite/internal/client/ClientFutureUtilsTest.java
+++ b/modules/client/src/test/java/org/apache/ignite/internal/client/ClientFutureUtilsTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.client;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
@@ -34,7 +35,7 @@ import org.junit.jupiter.api.Test;
 public class ClientFutureUtilsTest {
     @Test
     public void testGetNowSafe() {
-        assertNull(ClientFutureUtils.getNowSafe(CompletableFuture.completedFuture(null)));
+        assertNull(ClientFutureUtils.getNowSafe(nullCompletedFuture()));
         assertNull(ClientFutureUtils.getNowSafe(CompletableFuture.failedFuture(new Exception("fail"))));
         assertNull(ClientFutureUtils.getNowSafe(new CompletableFuture<>()));
         assertEquals("test", ClientFutureUtils.getNowSafe(CompletableFuture.completedFuture("test")));
diff --git a/modules/client/src/test/java/org/apache/ignite/internal/client/RepeatedFinishClientTransactionTest.java b/modules/client/src/test/java/org/apache/ignite/internal/client/RepeatedFinishClientTransactionTest.java
index 379f7852e7..0fc6264fd3 100644
--- a/modules/client/src/test/java/org/apache/ignite/internal/client/RepeatedFinishClientTransactionTest.java
+++ b/modules/client/src/test/java/org/apache/ignite/internal/client/RepeatedFinishClientTransactionTest.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.client;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotSame;
 import static org.junit.jupiter.api.Assertions.assertSame;
@@ -189,7 +189,7 @@ public class RepeatedFinishClientTransactionTest extends BaseIgniteAbstractTest
                 throw new RuntimeException(e);
             }
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         @Override
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/ClusterInitializer.java b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/ClusterInitializer.java
index 9655c538b1..f248e6a7e7 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/ClusterInitializer.java
+++ b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/ClusterInitializer.java
@@ -38,6 +38,7 @@ import org.apache.ignite.internal.cluster.management.network.messages.InitErrorM
 import org.apache.ignite.internal.configuration.validation.ConfigurationValidator;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
+import org.apache.ignite.internal.util.CompletableFutures;
 import org.apache.ignite.internal.util.StringUtils;
 import org.apache.ignite.network.ClusterNode;
 import org.apache.ignite.network.ClusterService;
@@ -156,7 +157,7 @@ public class ClusterInitializer {
                                     initMessage.metaStorageNodes()
                             );
 
-                            return CompletableFuture.<Void>completedFuture(null);
+                            return CompletableFutures.<Void>nullCompletedFuture();
                         } else {
                             if (e instanceof CompletionException) {
                                 e = e.getCause();
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/ClusterManagementGroupManager.java b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/ClusterManagementGroupManager.java
index cb071bc8a9..88f71ac792 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/ClusterManagementGroupManager.java
+++ b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/ClusterManagementGroupManager.java
@@ -23,6 +23,7 @@ import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toSet;
 import static java.util.stream.Collectors.toUnmodifiableSet;
 import static org.apache.ignite.internal.cluster.management.ClusterTag.clusterTag;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.cancelOrConsume;
 
 import java.util.Collection;
@@ -231,7 +232,7 @@ public class ClusterManagementGroupManager implements IgniteComponent {
     public CompletableFuture<ClusterState> clusterState() {
         CompletableFuture<CmgRaftService> serviceFuture = raftService;
 
-        return serviceFuture == null ? completedFuture(null) : serviceFuture.thenCompose(CmgRaftService::readClusterState);
+        return serviceFuture == null ? nullCompletedFuture() : serviceFuture.thenCompose(CmgRaftService::readClusterState);
     }
 
     /**
@@ -409,7 +410,7 @@ public class ClusterManagementGroupManager implements IgniteComponent {
                             .collect(toUnmodifiableSet());
 
                     // TODO: IGNITE-18681 - respect removal timeout.
-                    return nodesToRemove.isEmpty() ? completedFuture(null) : service.removeFromCluster(nodesToRemove);
+                    return nodesToRemove.isEmpty() ? nullCompletedFuture() : service.removeFromCluster(nodesToRemove);
                 })
                 .thenApply(v -> service);
     }
@@ -556,7 +557,7 @@ public class ClusterManagementGroupManager implements IgniteComponent {
         if (serviceFuture != null) {
             serviceFuture.thenCompose(service -> service.isCurrentNodeLeader().thenCompose(isLeader -> {
                 if (!isLeader) {
-                    return completedFuture(null);
+                    return nullCompletedFuture();
                 }
 
                 return service.updateLearners(term);
@@ -609,7 +610,7 @@ public class ClusterManagementGroupManager implements IgniteComponent {
                             .collect(toList());
 
                     if (recipients.isEmpty()) {
-                        return completedFuture(null);
+                        return nullCompletedFuture();
                     }
 
                     return raftService.readClusterState()
diff --git a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftService.java b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftService.java
index 7b9a62adc2..453aa77361 100644
--- a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftService.java
+++ b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftService.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.cluster.management.raft;
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.stream.Collectors.toCollection;
 import static java.util.stream.Collectors.toSet;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.HashSet;
 import java.util.List;
@@ -309,7 +310,7 @@ public class CmgRaftService implements ManuallyCloseable {
                 .collect(toSet());
 
         if (currentLearnerNames.equals(newLearners)) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         PeersAndLearners newConfiguration = PeersAndLearners.fromConsistentIds(currentPeers, newLearners);
diff --git a/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/ClusterInitializerTest.java b/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/ClusterInitializerTest.java
index ebb4a80a26..518b204190 100644
--- a/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/ClusterInitializerTest.java
+++ b/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/ClusterInitializerTest.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.cluster.management;
 
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsString;
 import static org.hamcrest.Matchers.isA;
@@ -157,7 +158,7 @@ public class ClusterInitializerTest extends BaseIgniteAbstractTest {
                 });
 
         when(messagingService.send(any(ClusterNode.class), any(CancelInitMessage.class)))
-                .thenReturn(CompletableFuture.completedFuture(null));
+                .thenReturn(nullCompletedFuture());
 
         CompletableFuture<Void> initFuture = clusterInitializer.initCluster(
                 List.of(metastorageNode.name()),
diff --git a/modules/code-deployment/src/main/java/org/apache/ignite/internal/deployunit/DeploymentManagerImpl.java b/modules/code-deployment/src/main/java/org/apache/ignite/internal/deployunit/DeploymentManagerImpl.java
index bf3a7ee080..fcfbf0d908 100644
--- a/modules/code-deployment/src/main/java/org/apache/ignite/internal/deployunit/DeploymentManagerImpl.java
+++ b/modules/code-deployment/src/main/java/org/apache/ignite/internal/deployunit/DeploymentManagerImpl.java
@@ -18,13 +18,14 @@
 package org.apache.ignite.internal.deployunit;
 
 import static java.util.concurrent.CompletableFuture.allOf;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static org.apache.ignite.internal.deployunit.DeploymentStatus.DEPLOYED;
 import static org.apache.ignite.internal.deployunit.DeploymentStatus.OBSOLETE;
 import static org.apache.ignite.internal.deployunit.DeploymentStatus.REMOVING;
 import static org.apache.ignite.internal.deployunit.DeploymentStatus.UPLOADING;
 import static org.apache.ignite.internal.deployunit.UnitContent.toDeploymentUnit;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.trueCompletedFuture;
 
 import java.nio.file.Path;
 import java.time.Duration;
@@ -256,7 +257,7 @@ public class DeploymentManagerImpl implements IgniteDeployment {
                                 DEPLOYED
                         );
                     }
-                    return completedFuture(false);
+                    return falseCompletedFuture();
                 });
     }
 
@@ -353,10 +354,10 @@ public class DeploymentManagerImpl implements IgniteDeployment {
         return deploymentUnitStore.getAllNodes(id, version)
                 .thenCompose(nodes -> {
                     if (nodes.isEmpty()) {
-                        return completedFuture(false);
+                        return falseCompletedFuture();
                     }
                     if (nodes.contains(nodeName)) {
-                        return completedFuture(true);
+                        return trueCompletedFuture();
                     }
                     return messaging.downloadUnitContent(id, version, nodes)
                             .thenCompose(content -> {
diff --git a/modules/code-deployment/src/main/java/org/apache/ignite/internal/deployunit/metastore/ClusterStatusWatchListener.java b/modules/code-deployment/src/main/java/org/apache/ignite/internal/deployunit/metastore/ClusterStatusWatchListener.java
index af71ee6fb0..3b77a94379 100644
--- a/modules/code-deployment/src/main/java/org/apache/ignite/internal/deployunit/metastore/ClusterStatusWatchListener.java
+++ b/modules/code-deployment/src/main/java/org/apache/ignite/internal/deployunit/metastore/ClusterStatusWatchListener.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.internal.deployunit.metastore;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.internal.deployunit.metastore.status.UnitClusterStatus;
@@ -48,7 +48,7 @@ public class ClusterStatusWatchListener implements WatchListener {
                 clusterEventCallback.onUpdate(unitStatus);
             }
         }
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     @Override
diff --git a/modules/code-deployment/src/main/java/org/apache/ignite/internal/deployunit/metastore/DeploymentUnitStoreImpl.java b/modules/code-deployment/src/main/java/org/apache/ignite/internal/deployunit/metastore/DeploymentUnitStoreImpl.java
index 5b43b4ea26..e454b37908 100644
--- a/modules/code-deployment/src/main/java/org/apache/ignite/internal/deployunit/metastore/DeploymentUnitStoreImpl.java
+++ b/modules/code-deployment/src/main/java/org/apache/ignite/internal/deployunit/metastore/DeploymentUnitStoreImpl.java
@@ -25,6 +25,7 @@ import static org.apache.ignite.internal.metastorage.dsl.Conditions.notExists;
 import static org.apache.ignite.internal.metastorage.dsl.Conditions.revision;
 import static org.apache.ignite.internal.metastorage.dsl.Operations.noop;
 import static org.apache.ignite.internal.metastorage.dsl.Operations.put;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
 
 import java.util.List;
 import java.util.Objects;
@@ -233,13 +234,13 @@ public class DeploymentUnitStoreImpl implements DeploymentUnitStore {
                 .thenCompose(e -> {
                     byte[] value = e.value();
                     if (value == null) {
-                        return completedFuture(false);
+                        return falseCompletedFuture();
                     }
                     byte[] newValue = mapper.apply(value);
 
 
                     if (newValue == null) {
-                        return completedFuture(false);
+                        return falseCompletedFuture();
                     }
 
                     return metaStorage.invoke(
diff --git a/modules/code-deployment/src/main/java/org/apache/ignite/internal/deployunit/metastore/NodeStatusWatchListener.java b/modules/code-deployment/src/main/java/org/apache/ignite/internal/deployunit/metastore/NodeStatusWatchListener.java
index 88e04f1a27..5856fb2568 100644
--- a/modules/code-deployment/src/main/java/org/apache/ignite/internal/deployunit/metastore/NodeStatusWatchListener.java
+++ b/modules/code-deployment/src/main/java/org/apache/ignite/internal/deployunit/metastore/NodeStatusWatchListener.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.internal.deployunit.metastore;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
@@ -81,7 +81,7 @@ public class NodeStatusWatchListener implements WatchListener {
                     .thenComposeAsync(status -> deploymentUnitStore.getAllNodeStatuses(status.id(), status.version()), executor)
                     .thenAccept(nodes -> callback.onUpdate(nodeStatus, nodes));
         }
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     @Override
diff --git a/modules/compute/src/main/java/org/apache/ignite/internal/compute/loader/JobContextManager.java b/modules/compute/src/main/java/org/apache/ignite/internal/compute/loader/JobContextManager.java
index 87ec826a85..d159751155 100644
--- a/modules/compute/src/main/java/org/apache/ignite/internal/compute/loader/JobContextManager.java
+++ b/modules/compute/src/main/java/org/apache/ignite/internal/compute/loader/JobContextManager.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.compute.loader;
 
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.lang.reflect.Array;
 import java.util.Arrays;
@@ -135,7 +136,7 @@ public class JobContextManager {
         return deployment.clusterStatusAsync(unit.name(), unit.version())
                 .thenCompose(clusterStatus -> {
                     if (clusterStatus == DeploymentStatus.DEPLOYED) {
-                        return completedFuture(null);
+                        return nullCompletedFuture();
                     } else if (clusterStatus == null) {
                         return failedFuture(new DeploymentUnitNotFoundException(unit.name(), unit.version()));
                     } else {
@@ -160,7 +161,7 @@ public class JobContextManager {
             return deployment.onDemandDeploy(it.name(), it.version())
                     .thenCompose(result -> {
                         if (result) {
-                            return completedFuture(null);
+                            return nullCompletedFuture();
                         } else {
                             return failedFuture(
                                     new IgniteInternalException(Compute.CLASS_LOADER_ERR, "Failed to deploy on demand unit: " + it.render())
diff --git a/modules/compute/src/test/java/org/apache/ignite/internal/compute/loader/JobContextManagerTest.java b/modules/compute/src/test/java/org/apache/ignite/internal/compute/loader/JobContextManagerTest.java
index dc57c8b882..f23ef7a8c4 100644
--- a/modules/compute/src/test/java/org/apache/ignite/internal/compute/loader/JobContextManagerTest.java
+++ b/modules/compute/src/test/java/org/apache/ignite/internal/compute/loader/JobContextManagerTest.java
@@ -23,6 +23,7 @@ import static org.apache.ignite.internal.deployunit.DeploymentStatus.OBSOLETE;
 import static org.apache.ignite.internal.deployunit.DeploymentStatus.REMOVING;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.getPath;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrowFast;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertSame;
 import static org.mockito.ArgumentMatchers.any;
@@ -160,7 +161,7 @@ class JobContextManagerTest extends BaseIgniteAbstractTest {
 
     @Test
     public void throwsExceptionOnOnDemandDeploy() {
-        doReturn(completedFuture(false))
+        doReturn(falseCompletedFuture())
                 .when(deployment).onDemandDeploy(anyString(), any());
 
         List<DeploymentUnit> units = List.of(
diff --git a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/notifications/ConfigurationNamedListListener.java b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/notifications/ConfigurationNamedListListener.java
index 667bbbd51f..3b24146412 100644
--- a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/notifications/ConfigurationNamedListListener.java
+++ b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/notifications/ConfigurationNamedListListener.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.configuration.notifications;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.concurrent.CompletableFuture;
 
@@ -34,7 +34,7 @@ public interface ConfigurationNamedListListener<VIEWT> extends ConfigurationList
      * @return Future that signifies the end of the listener execution.
      */
     default CompletableFuture<?> onCreate(ConfigurationNotificationEvent<VIEWT> ctx) {
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     /**
@@ -46,7 +46,7 @@ public interface ConfigurationNamedListListener<VIEWT> extends ConfigurationList
      * @return Future that signifies the end of the listener execution.
      */
     default CompletableFuture<?> onRename(ConfigurationNotificationEvent<VIEWT> ctx) {
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     /**
@@ -56,12 +56,12 @@ public interface ConfigurationNamedListListener<VIEWT> extends ConfigurationList
      * @return Future that signifies the end of the listener execution.
      */
     default CompletableFuture<?> onDelete(ConfigurationNotificationEvent<VIEWT> ctx) {
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     /** {@inheritDoc} */
     @Override
     default CompletableFuture<?> onUpdate(ConfigurationNotificationEvent<VIEWT> ctx) {
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 }
diff --git a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java
index 1c6a65a31c..009a47da21 100644
--- a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java
+++ b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java
@@ -33,6 +33,7 @@ import static org.apache.ignite.internal.configuration.util.ConfigurationUtil.es
 import static org.apache.ignite.internal.configuration.util.ConfigurationUtil.fillFromPrefixMap;
 import static org.apache.ignite.internal.configuration.util.ConfigurationUtil.findEx;
 import static org.apache.ignite.internal.configuration.util.ConfigurationUtil.toPrefixMap;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.io.Serializable;
 import java.lang.reflect.Field;
@@ -613,7 +614,7 @@ public abstract class ConfigurationChanger implements DynamicConfigurationChange
             Map<String, Serializable> allChanges = createFlattenedUpdatesMap(localRoots.rootsWithoutDefaults, changes);
             if (allChanges.isEmpty() && onStartup) {
                 // We don't want an empty storage update if this is the initialization changer.
-                return CompletableFuture.completedFuture(null);
+                return nullCompletedFuture();
             }
 
             dropNulls(changes);
diff --git a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationRegistry.java b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationRegistry.java
index 6dc00dc53a..eaae04c0e0 100644
--- a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationRegistry.java
+++ b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationRegistry.java
@@ -17,10 +17,10 @@
 
 package org.apache.ignite.internal.configuration;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.configuration.notifications.ConfigurationNotifier.notifyListeners;
 import static org.apache.ignite.internal.configuration.util.ConfigurationUtil.checkConfigurationType;
 import static org.apache.ignite.internal.configuration.util.ConfigurationUtil.innerNodeVisitor;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.lang.reflect.Field;
 import java.util.ArrayList;
@@ -209,7 +209,7 @@ public class ConfigurationRegistry implements IgniteComponent {
 
             private CompletableFuture<Void> combineFutures(Collection<CompletableFuture<?>> futures) {
                 if (futures.isEmpty()) {
-                    return completedFuture(null);
+                    return nullCompletedFuture();
                 }
 
                 CompletableFuture<?>[] resultFutures = futures.stream()
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTest.java b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTest.java
index e227968811..0856087698 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTest.java
+++ b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.configuration.notifications;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.ignite.configuration.annotation.ConfigurationType.LOCAL;
@@ -32,6 +31,7 @@ import static org.apache.ignite.internal.configuration.notifications.Configurati
 import static org.apache.ignite.internal.configuration.notifications.ConfigurationNotifier.notifyListeners;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.hasCause;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -200,7 +200,7 @@ public class ConfigurationListenerTest {
 
             log.add("parent");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.child().listen(ctx -> {
@@ -209,7 +209,7 @@ public class ConfigurationListenerTest {
 
             log.add("child");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.child().str().listen(ctx -> {
@@ -218,13 +218,13 @@ public class ConfigurationListenerTest {
 
             log.add("str");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.children().listen(ctx -> {
             log.add("elements");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.change(parent -> parent.changeChild(child -> child.changeStr("foo"))).get(1, SECONDS);
@@ -242,13 +242,13 @@ public class ConfigurationListenerTest {
         config.listen(ctx -> {
             log.add("parent");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.child().listen(ctx -> {
             log.add("child");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.children().listen(ctx -> {
@@ -261,7 +261,7 @@ public class ConfigurationListenerTest {
 
             log.add("elements");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.children().listenElements(new ConfigurationNamedListListener<ChildView>() {
@@ -277,7 +277,7 @@ public class ConfigurationListenerTest {
 
                 log.add("create");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -285,7 +285,7 @@ public class ConfigurationListenerTest {
             public CompletableFuture<?> onUpdate(ConfigurationNotificationEvent<ChildView> ctx) {
                 log.add("update");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -295,7 +295,7 @@ public class ConfigurationListenerTest {
             ) {
                 log.add("rename");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -303,7 +303,7 @@ public class ConfigurationListenerTest {
             public CompletableFuture<?> onDelete(ConfigurationNotificationEvent<ChildView> ctx) {
                 log.add("delete");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
 
@@ -330,13 +330,13 @@ public class ConfigurationListenerTest {
         config.listen(ctx -> {
             log.add("parent");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.child().listen(ctx -> {
             log.add("child");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.children().listen(ctx -> {
@@ -353,7 +353,7 @@ public class ConfigurationListenerTest {
 
             log.add("elements");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.children().listenElements(new ConfigurationNamedListListener<ChildView>() {
@@ -362,7 +362,7 @@ public class ConfigurationListenerTest {
             public CompletableFuture<?> onCreate(ConfigurationNotificationEvent<ChildView> ctx) {
                 log.add("create");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -380,7 +380,7 @@ public class ConfigurationListenerTest {
 
                 log.add("update");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -390,7 +390,7 @@ public class ConfigurationListenerTest {
             ) {
                 log.add("rename");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -398,7 +398,7 @@ public class ConfigurationListenerTest {
             public CompletableFuture<?> onDelete(ConfigurationNotificationEvent<ChildView> ctx) {
                 log.add("delete");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
 
@@ -424,13 +424,13 @@ public class ConfigurationListenerTest {
         config.listen(ctx -> {
             log.add("parent");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.child().listen(ctx -> {
             log.add("child");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.children().listen(ctx -> {
@@ -449,7 +449,7 @@ public class ConfigurationListenerTest {
 
             log.add("elements");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.children().listenElements(new ConfigurationNamedListListener<ChildView>() {
@@ -458,7 +458,7 @@ public class ConfigurationListenerTest {
             public CompletableFuture<?> onCreate(ConfigurationNotificationEvent<ChildView> ctx) {
                 log.add("create");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -466,7 +466,7 @@ public class ConfigurationListenerTest {
             public CompletableFuture<?> onUpdate(ConfigurationNotificationEvent<ChildView> ctx) {
                 log.add("update");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -488,7 +488,7 @@ public class ConfigurationListenerTest {
 
                 log.add("rename");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -496,7 +496,7 @@ public class ConfigurationListenerTest {
             public CompletableFuture<?> onDelete(ConfigurationNotificationEvent<ChildView> ctx) {
                 log.add("delete");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
 
@@ -522,13 +522,13 @@ public class ConfigurationListenerTest {
         config.listen(ctx -> {
             log.add("parent");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.child().listen(ctx -> {
             log.add("child");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.children().listen(ctx -> {
@@ -548,7 +548,7 @@ public class ConfigurationListenerTest {
 
             log.add("elements");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.children().listenElements(new ConfigurationNamedListListener<ChildView>() {
@@ -557,7 +557,7 @@ public class ConfigurationListenerTest {
             public CompletableFuture<?> onCreate(ConfigurationNotificationEvent<ChildView> ctx) {
                 log.add("create");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -565,7 +565,7 @@ public class ConfigurationListenerTest {
             public CompletableFuture<?> onUpdate(ConfigurationNotificationEvent<ChildView> ctx) {
                 log.add("update");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -588,7 +588,7 @@ public class ConfigurationListenerTest {
 
                 log.add("rename");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -596,7 +596,7 @@ public class ConfigurationListenerTest {
             public CompletableFuture<?> onDelete(ConfigurationNotificationEvent<ChildView> ctx) {
                 log.add("delete");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
 
@@ -625,13 +625,13 @@ public class ConfigurationListenerTest {
         config.listen(ctx -> {
             log.add("parent");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.child().listen(ctx -> {
             log.add("child");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.children().listen(ctx -> {
@@ -644,7 +644,7 @@ public class ConfigurationListenerTest {
 
             log.add("elements");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.children().listenElements(new ConfigurationNamedListListener<ChildView>() {
@@ -653,7 +653,7 @@ public class ConfigurationListenerTest {
             public CompletableFuture<?> onCreate(ConfigurationNotificationEvent<ChildView> ctx) {
                 log.add("create");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -661,7 +661,7 @@ public class ConfigurationListenerTest {
             public CompletableFuture<?> onUpdate(ConfigurationNotificationEvent<ChildView> ctx) {
                 log.add("update");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -671,7 +671,7 @@ public class ConfigurationListenerTest {
             ) {
                 log.add("rename");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -686,12 +686,12 @@ public class ConfigurationListenerTest {
 
                 log.add("delete");
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
 
         config.children().get("name").listen(ctx -> {
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.change(parent ->
@@ -725,7 +725,7 @@ public class ConfigurationListenerTest {
 
             release.countDown();
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.children().get("name").listen(ctx -> {
@@ -733,7 +733,7 @@ public class ConfigurationListenerTest {
 
             log.add("deleted");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         Future<Void> fut = config.change(parent -> parent.changeChildren(elements ->
@@ -987,7 +987,7 @@ public class ConfigurationListenerTest {
 
         config.polyChild().commonIntVal().listen(event -> {
             intHolder.set(event.newValue());
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.polyChild().commonIntVal().update(42).get(1, SECONDS);
@@ -1004,7 +1004,7 @@ public class ConfigurationListenerTest {
             assertNull(ctx.newName(ChildView.class));
             assertNull(ctx.newName(InternalChildView.class));
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.child().str().update(randomUuid()).get(1, SECONDS);
@@ -1022,7 +1022,7 @@ public class ConfigurationListenerTest {
                 assertEquals("0", ctx.newName(ChildView.class));
                 assertEquals("0", ctx.newName(InternalChildView.class));
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -1034,7 +1034,7 @@ public class ConfigurationListenerTest {
                 assertEquals("1", ctx.newName(ChildView.class));
                 assertEquals("1", ctx.newName(InternalChildView.class));
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -1049,7 +1049,7 @@ public class ConfigurationListenerTest {
                 assertNull(ctx.newName(ChildView.class));
                 assertNull(ctx.newName(InternalChildView.class));
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -1061,7 +1061,7 @@ public class ConfigurationListenerTest {
                 assertEquals("1", ctx.newName(ChildView.class));
                 assertEquals("1", ctx.newName(InternalChildView.class));
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
 
@@ -1083,7 +1083,7 @@ public class ConfigurationListenerTest {
             assertNull(ctx.newName(StringPolyView.class));
             assertNull(ctx.newName(LongPolyView.class));
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         config.polyChild().commonIntVal().update(22).get(1, SECONDS);
@@ -1105,7 +1105,7 @@ public class ConfigurationListenerTest {
 
                 assertNull(ctx.newName(LongPolyView.class));
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -1121,7 +1121,7 @@ public class ConfigurationListenerTest {
 
                 assertNull(ctx.newName(LongPolyView.class));
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -1139,7 +1139,7 @@ public class ConfigurationListenerTest {
 
                 assertNull(ctx.newName(LongPolyView.class));
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             /** {@inheritDoc} */
@@ -1155,7 +1155,7 @@ public class ConfigurationListenerTest {
 
                 assertNull(ctx.newName(LongPolyView.class));
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
 
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTestUtils.java b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTestUtils.java
index 210b1c88b1..0ee7cb06c8 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTestUtils.java
+++ b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/notifications/ConfigurationListenerTestUtils.java
@@ -17,9 +17,9 @@
 
 package org.apache.ignite.internal.configuration.notifications;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -58,7 +58,7 @@ class ConfigurationListenerTestUtils {
                 return failedFuture(t);
             }
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         };
     }
 
@@ -128,7 +128,7 @@ class ConfigurationListenerTestUtils {
                     return failedFuture(t);
                 }
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         };
     }
@@ -151,7 +151,7 @@ class ConfigurationListenerTestUtils {
                     return failedFuture(t);
                 }
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         };
     }
@@ -174,7 +174,7 @@ class ConfigurationListenerTestUtils {
                     return failedFuture(t);
                 }
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         };
     }
@@ -197,7 +197,7 @@ class ConfigurationListenerTestUtils {
                     return failedFuture(t);
                 }
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         };
     }
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtensionTest.java b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtensionTest.java
index 71ff1c1ec2..48c4a323d5 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtensionTest.java
+++ b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/testframework/ConfigurationExtensionTest.java
@@ -17,9 +17,9 @@
 
 package org.apache.ignite.internal.configuration.testframework;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.CoreMatchers.instanceOf;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -80,19 +80,19 @@ class ConfigurationExtensionTest extends BaseIgniteAbstractTest {
         fieldCfg.listen(ctx -> {
             log.add("update");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         fieldCfg.joinTimeout().listen(ctx -> {
             log.add("join");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         fieldCfg.failureDetectionTimeout().listen(ctx -> {
             log.add("failure");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         fieldCfg.change(change -> change.changeJoinTimeout(1000_000)).get(1, SECONDS);
diff --git a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/TestConfigurationChanger.java b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/TestConfigurationChanger.java
index 8164ff2078..d67931550d 100644
--- a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/TestConfigurationChanger.java
+++ b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/TestConfigurationChanger.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.internal.configuration;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.Collection;
 import java.util.concurrent.CompletableFuture;
@@ -56,7 +56,7 @@ public class TestConfigurationChanger extends ConfigurationChanger {
             @Override
             public CompletableFuture<Void> onConfigurationUpdated(@Nullable SuperRoot oldRoot, SuperRoot newRoot, long storageRevision,
                     long notificationNumber) {
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         };
     }
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/event/AbstractEventProducer.java b/modules/core/src/main/java/org/apache/ignite/internal/event/AbstractEventProducer.java
index 32a08bca8d..155a7692dc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/event/AbstractEventProducer.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/event/AbstractEventProducer.java
@@ -19,7 +19,7 @@ package org.apache.ignite.internal.event;
 
 import static java.util.Collections.unmodifiableList;
 import static java.util.concurrent.CompletableFuture.allOf;
-import static java.util.concurrent.CompletableFuture.completedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -78,7 +78,7 @@ public abstract class AbstractEventProducer<T extends Event, P extends EventPara
         List<EventListener<P>> listeners = listenersByEvent.get(evt);
 
         if (listeners == null) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         CompletableFuture<?>[] futures = new CompletableFuture[listeners.size()];
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/AsyncWrapper.java b/modules/core/src/main/java/org/apache/ignite/internal/util/AsyncWrapper.java
index a4ff3f1f7e..f8ed328a17 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/AsyncWrapper.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/AsyncWrapper.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.util;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -44,7 +46,7 @@ public class AsyncWrapper<T> implements AsyncCursor<T> {
     private final Object lock = new Object();
 
     /** The tail of the request chain. Guarded by {@link #lock}. */
-    private CompletableFuture<BatchedResult<T>> requestChainTail = CompletableFuture.completedFuture(null);
+    private CompletableFuture<BatchedResult<T>> requestChainTail = nullCompletedFuture();
 
     private volatile boolean cancelled = false;
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/CompletableFutures.java b/modules/core/src/main/java/org/apache/ignite/internal/util/CompletableFutures.java
new file mode 100644
index 0000000000..874cbd837d
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/CompletableFutures.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.util;
+
+import static java.util.concurrent.CompletableFuture.completedFuture;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+
+/** Helper class for working with {@link CompletableFuture}. */
+public class CompletableFutures {
+    private static final CompletableFuture<Void> NULL_COMPLETED_FUTURE = completedFuture(null);
+
+    private static final CompletableFuture<Boolean> TRUE_COMPLETED_FUTURE = completedFuture(true);
+
+    private static final CompletableFuture<Boolean> FALSE_COMPLETED_FUTURE = completedFuture(false);
+
+    private static final CompletableFuture<List<?>> EMPTY_LIST_COMPLETED_FUTURE = completedFuture(List.of());
+
+    private static final CompletableFuture<Set<?>> EMPTY_SET_COMPLETED_FUTURE = completedFuture(Set.of());
+
+    private static final CompletableFuture<Map<?, ?>> EMPTY_MAP_COMPLETED_FUTURE = completedFuture(Map.of());
+
+    /** Returns a future completed with a {@code null} value. */
+    public static <T> CompletableFuture<T> nullCompletedFuture() {
+        return (CompletableFuture<T>) NULL_COMPLETED_FUTURE;
+    }
+
+    /** Returns a future completed with a {@code true} value. */
+    public static CompletableFuture<Boolean> trueCompletedFuture() {
+        return TRUE_COMPLETED_FUTURE;
+    }
+
+    /** Returns a future completed with a {@code false} value. */
+    public static CompletableFuture<Boolean> falseCompletedFuture() {
+        return FALSE_COMPLETED_FUTURE;
+    }
+
+    /**
+     * Returns a future completed with the given boolean value.
+     *
+     * @param b Boolean value.
+     */
+    public static CompletableFuture<Boolean> booleanCompletedFuture(boolean b) {
+        return b ? TRUE_COMPLETED_FUTURE : FALSE_COMPLETED_FUTURE;
+    }
+
+    /** Returns a future completed with an empty immutable {@link Collection}. */
+    public static <T> CompletableFuture<Collection<T>> emptyCollectionCompletedFuture() {
+        return (CompletableFuture<Collection<T>>) (CompletableFuture<?>) EMPTY_LIST_COMPLETED_FUTURE;
+    }
+
+    /** Returns a future completed with an empty immutable {@link List}. */
+    public static <T> CompletableFuture<List<T>> emptyListCompletedFuture() {
+        return (CompletableFuture<List<T>>) (CompletableFuture<?>) EMPTY_LIST_COMPLETED_FUTURE;
+    }
+
+    /** Returns a future completed with an empty immutable {@link Set}. */
+    public static <T> CompletableFuture<Set<T>> emptySetCompletedFuture() {
+        return (CompletableFuture<Set<T>>) (CompletableFuture<?>) EMPTY_SET_COMPLETED_FUTURE;
+    }
+
+    /** Returns a future completed with an empty immutable {@link Map}. */
+    public static <K, V> CompletableFuture<Map<K, V>> emptyMapCompletedFuture() {
+        return (CompletableFuture<Map<K, V>>) (CompletableFuture<?>) EMPTY_MAP_COMPLETED_FUTURE;
+    }
+}
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/causality/IncrementalVersionedValueTest.java b/modules/core/src/test/java/org/apache/ignite/internal/causality/IncrementalVersionedValueTest.java
index 5086666992..8aa6bb9999 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/causality/IncrementalVersionedValueTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/causality/IncrementalVersionedValueTest.java
@@ -25,6 +25,7 @@ import static org.apache.ignite.internal.testframework.IgniteTestUtils.assertThr
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.runRace;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsString;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -102,7 +103,7 @@ public class IncrementalVersionedValueTest extends BaseIgniteAbstractTest {
 
         assertEquals(TEST_VALUE + incrementCount, fut.get());
 
-        assertThrows(AssertionError.class, () -> versionedValue.update(1L, (i, t) -> completedFuture(null)));
+        assertThrows(AssertionError.class, () -> versionedValue.update(1L, (i, t) -> nullCompletedFuture()));
     }
 
     /**
@@ -380,7 +381,7 @@ public class IncrementalVersionedValueTest extends BaseIgniteAbstractTest {
         //noinspection unchecked
         BiFunction<Integer, Throwable, CompletableFuture<Integer>> closure = mock(BiFunction.class);
 
-        when(closure.apply(any(), any())).thenReturn(completedFuture(null));
+        when(closure.apply(any(), any())).thenReturn(nullCompletedFuture());
 
         int token = 0;
 
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/event/EventProducerTest.java b/modules/core/src/test/java/org/apache/ignite/internal/event/EventProducerTest.java
index 0c4d504406..dd60cf4107 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/event/EventProducerTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/event/EventProducerTest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.event;
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.runAsync;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -87,12 +88,12 @@ public class EventProducerTest {
                 listener = createEventListener((p, e) -> {
                     toRemoveFuture.complete(null);
 
-                    return completedFuture(false);
+                    return falseCompletedFuture();
                 });
 
                 listenerToRemove = listener;
             } else {
-                listener = createEventListener((p, e) -> completedFuture(false));
+                listener = createEventListener((p, e) -> falseCompletedFuture());
             }
 
             producer.listen(TestEvent.TEST, listener);
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/future/OrderingFutureCallbackInterferenceTest.java b/modules/core/src/test/java/org/apache/ignite/internal/future/OrderingFutureCallbackInterferenceTest.java
index b21c2d1f13..769dd84d5c 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/future/OrderingFutureCallbackInterferenceTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/future/OrderingFutureCallbackInterferenceTest.java
@@ -17,11 +17,11 @@
 
 package org.apache.ignite.internal.future;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.contains;
 
 import java.util.List;
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CopyOnWriteArrayList;
 import org.junit.jupiter.api.Test;
 
@@ -42,14 +42,14 @@ class OrderingFutureCallbackInterferenceTest {
         });
         future.thenComposeToCompletable(x -> {
             order.add(1);
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         });
         future.thenComposeToCompletable(x -> {
             throw cause;
         });
         future.thenComposeToCompletable(x -> {
             order.add(2);
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         });
 
         future.complete(1);
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/future/OrderingFutureCallbackOrderingTest.java b/modules/core/src/test/java/org/apache/ignite/internal/future/OrderingFutureCallbackOrderingTest.java
index 48aa0a67be..75135daf4b 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/future/OrderingFutureCallbackOrderingTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/future/OrderingFutureCallbackOrderingTest.java
@@ -17,11 +17,11 @@
 
 package org.apache.ignite.internal.future;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.contains;
 
 import java.util.List;
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CopyOnWriteArrayList;
 import org.junit.jupiter.api.Test;
 
@@ -38,11 +38,11 @@ class OrderingFutureCallbackOrderingTest {
 
         future.thenComposeToCompletable(x -> {
             order.add(1);
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         });
         future.thenComposeToCompletable(x -> {
             order.add(2);
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         });
 
         assertThat(order, contains(1, 2));
@@ -55,11 +55,11 @@ class OrderingFutureCallbackOrderingTest {
 
         future.thenComposeToCompletable(x -> {
             order.add(1);
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         });
         future.thenComposeToCompletable(x -> {
             order.add(2);
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         });
 
         future.complete(42);
@@ -145,7 +145,7 @@ class OrderingFutureCallbackOrderingTest {
 
         future.thenComposeToCompletable(x -> {
             order.add(1);
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         });
         future.thenCompose(x -> {
             order.add(2);
@@ -163,7 +163,7 @@ class OrderingFutureCallbackOrderingTest {
 
         future.thenComposeToCompletable(x -> {
             order.add(1);
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         });
         future.thenCompose(x -> {
             order.add(2);
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/future/OrderingFutureConcurrencyTest.java b/modules/core/src/test/java/org/apache/ignite/internal/future/OrderingFutureConcurrencyTest.java
index 66fd93d921..34740ffd09 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/future/OrderingFutureConcurrencyTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/future/OrderingFutureConcurrencyTest.java
@@ -17,12 +17,12 @@
 
 package org.apache.ignite.internal.future;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Stream;
@@ -85,7 +85,7 @@ class OrderingFutureConcurrencyTest {
             for (int i = 0; i < 10_000; i++) {
                 future.thenComposeToCompletable(x -> {
                     counter.incrementAndGet();
-                    return CompletableFuture.completedFuture(null);
+                    return nullCompletedFuture();
                 });
             }
         };
@@ -213,7 +213,7 @@ class OrderingFutureConcurrencyTest {
         THEN_COMPOSE_TO_COMPLETABLE {
             @Override
             void execute(OrderingFuture<?> future) {
-                future.thenComposeToCompletable(x -> CompletableFuture.completedFuture(null));
+                future.thenComposeToCompletable(x -> nullCompletedFuture());
             }
         },
         THEN_COMPOSE {
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/future/OrderingFutureTest.java b/modules/core/src/test/java/org/apache/ignite/internal/future/OrderingFutureTest.java
index 67c0389827..06e0f644b0 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/future/OrderingFutureTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/future/OrderingFutureTest.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.future;
 
+import static java.util.concurrent.CompletableFuture.completedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.instanceOf;
 import static org.hamcrest.Matchers.is;
@@ -302,7 +304,7 @@ class OrderingFutureTest {
         OrderingFuture<Integer> orderingFuture = OrderingFuture.completedFuture(3);
 
         CompletableFuture<Integer> completableFuture = orderingFuture.thenComposeToCompletable(
-                x -> CompletableFuture.completedFuture(x * 5)
+                x -> completedFuture(x * 5)
         );
 
         assertThat(completableFuture.getNow(999), is(15));
@@ -324,7 +326,7 @@ class OrderingFutureTest {
 
         CompletableFuture<Integer> completableFuture = orderingFuture.thenComposeToCompletable(value -> {
             called.set(true);
-            return CompletableFuture.completedFuture(value);
+            return completedFuture(value);
         });
 
         assertFalse(called.get());
@@ -336,7 +338,7 @@ class OrderingFutureTest {
         OrderingFuture<Integer> orderingFuture = new OrderingFuture<>();
 
         CompletableFuture<Integer> completableFuture = orderingFuture.thenComposeToCompletable(
-                x -> CompletableFuture.completedFuture(x * 5)
+                x -> completedFuture(x * 5)
         );
 
         orderingFuture.complete(3);
@@ -362,7 +364,7 @@ class OrderingFutureTest {
 
         CompletableFuture<Integer> completableFuture = orderingFuture.thenComposeToCompletable(value -> {
             called.set(true);
-            return CompletableFuture.completedFuture(value);
+            return completedFuture(value);
         });
         orderingFuture.completeExceptionally(cause);
 
@@ -399,7 +401,7 @@ class OrderingFutureTest {
         AtomicReference<Throwable> causeRef = new AtomicReference<>();
 
         OrderingFuture<Integer> future = new OrderingFuture<>();
-        future.thenComposeToCompletable(x -> CompletableFuture.completedFuture(null)).whenComplete((res, ex) -> causeRef.set(ex));
+        future.thenComposeToCompletable(x -> nullCompletedFuture()).whenComplete((res, ex) -> causeRef.set(ex));
 
         CancellationException cancellationException = new CancellationException("Oops");
         future.completeExceptionally(cancellationException);
@@ -416,7 +418,7 @@ class OrderingFutureTest {
 
         future.thenComposeToCompletable(x -> {
             intHolder.set(future.getNow(999));
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         });
 
         future.complete(1);
@@ -438,7 +440,7 @@ class OrderingFutureTest {
                 fail("Unexpected exception", e);
             }
 
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         });
 
         future.complete(1);
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/streamer/StreamerSubscriberTest.java b/modules/core/src/test/java/org/apache/ignite/internal/streamer/StreamerSubscriberTest.java
index 71a964d740..f364fc75dd 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/streamer/StreamerSubscriberTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/streamer/StreamerSubscriberTest.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.streamer;
 
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 
@@ -144,7 +145,7 @@ class StreamerSubscriberTest extends BaseIgniteAbstractTest {
 
             @Override
             public CompletableFuture<Void> refreshAsync() {
-                return CompletableFuture.completedFuture(null);
+                return nullCompletedFuture();
             }
         };
 
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/util/CompletableFuturesTest.java b/modules/core/src/test/java/org/apache/ignite/internal/util/CompletableFuturesTest.java
new file mode 100644
index 0000000000..dccf47b644
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/util/CompletableFuturesTest.java
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.util;
+
+import static org.apache.ignite.internal.util.CompletableFutures.booleanCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.emptyCollectionCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.emptyListCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.emptyMapCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.emptySetCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.trueCompletedFuture;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import org.junit.jupiter.api.Test;
+
+/** For {@link CompletableFutures} testing. */
+public class CompletableFuturesTest {
+    @Test
+    void testNullCompletedFuture() {
+        CompletableFuture<Integer> future = nullCompletedFuture();
+
+        assertTrue(future.isDone());
+        assertNull(future.join());
+    }
+
+    @Test
+    void testTrueCompletedFuture() {
+        CompletableFuture<Boolean> future = trueCompletedFuture();
+
+        assertTrue(future.isDone());
+        assertTrue(future.join());
+    }
+
+    @Test
+    void testFalseCompletedFuture() {
+        CompletableFuture<Boolean> future = falseCompletedFuture();
+
+        assertTrue(future.isDone());
+        assertFalse(future.join());
+    }
+
+    @Test
+    void testBooleanCompletedFuture() {
+        CompletableFuture<Boolean> future0 = booleanCompletedFuture(true);
+        CompletableFuture<Boolean> future1 = booleanCompletedFuture(false);
+
+        assertTrue(future0.isDone());
+        assertTrue(future1.isDone());
+
+        assertTrue(future0.join());
+        assertFalse(future1.join());
+    }
+
+    @Test
+    void testEmptyCollectionCompletedFuture() {
+        CompletableFuture<Collection<String>> future = emptyCollectionCompletedFuture();
+
+        assertTrue(future.isDone());
+        assertTrue(future.join().isEmpty());
+
+        assertThrows(UnsupportedOperationException.class, () -> future.join().add("1"));
+    }
+
+    @Test
+    void testEmptyListCompletedFuture() {
+        CompletableFuture<List<Integer>> future = emptyListCompletedFuture();
+
+        assertTrue(future.isDone());
+        assertTrue(future.join().isEmpty());
+
+        assertThrows(UnsupportedOperationException.class, () -> future.join().add(1));
+    }
+
+    @Test
+    void testEmptySetCompletedFuture() {
+        CompletableFuture<Set<Long>> future = emptySetCompletedFuture();
+
+        assertTrue(future.isDone());
+        assertTrue(future.join().isEmpty());
+
+        assertThrows(UnsupportedOperationException.class, () -> future.join().add(1L));
+    }
+
+    @Test
+    void testEmptyMapCompletedFuture() {
+        CompletableFuture<Map<Long, Integer>> future = emptyMapCompletedFuture();
+
+        assertTrue(future.isDone());
+        assertTrue(future.join().isEmpty());
+
+        assertThrows(UnsupportedOperationException.class, () -> future.join().put(1L, 2));
+    }
+}
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/util/IgniteUtilsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/util/IgniteUtilsTest.java
index b7199bc81d..88c17299d9 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/util/IgniteUtilsTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/util/IgniteUtilsTest.java
@@ -22,6 +22,8 @@ import static java.util.concurrent.CompletableFuture.failedFuture;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.runAsync;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrow;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.trueCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.awaitForWorkersStop;
 import static org.apache.ignite.internal.util.IgniteUtils.byteBufferToByteArray;
 import static org.apache.ignite.internal.util.IgniteUtils.copyStateTo;
@@ -129,7 +131,7 @@ class IgniteUtilsTest extends BaseIgniteAbstractTest {
 
     @Test
     void testGetUninterruptibly() throws Exception {
-        assertThat(getUninterruptibly(completedFuture(true)), equalTo(true));
+        assertThat(getUninterruptibly(trueCompletedFuture()), equalTo(true));
         assertThat(Thread.currentThread().isInterrupted(), equalTo(false));
 
         ExecutionException exception0 = assertThrows(
@@ -153,7 +155,7 @@ class IgniteUtilsTest extends BaseIgniteAbstractTest {
             try {
                 Thread.currentThread().interrupt();
 
-                getUninterruptibly(completedFuture(null));
+                getUninterruptibly(nullCompletedFuture());
 
                 assertThat(Thread.currentThread().isInterrupted(), equalTo(true));
             } catch (ExecutionException e) {
diff --git a/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/util/DirectExecutor.java b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/util/DirectExecutor.java
index 27214721c3..30b6d86be6 100644
--- a/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/util/DirectExecutor.java
+++ b/modules/core/src/testFixtures/java/org/apache/ignite/internal/testframework/util/DirectExecutor.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.testframework.util;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -78,7 +80,7 @@ public class DirectExecutor implements ExecutorService {
     @Override
     public Future<?> submit(Runnable task) {
         task.run();
-        return CompletableFuture.completedFuture(null);
+        return nullCompletedFuture();
     }
 
     @Override
diff --git a/modules/distribution-zones/src/integrationTest/java/org/apache/ignite/internal/distributionzones/ItDistributionZonesFilterTest.java b/modules/distribution-zones/src/integrationTest/java/org/apache/ignite/internal/distributionzones/ItDistributionZonesFilterTest.java
index 121c6a61f6..7244e2b728 100644
--- a/modules/distribution-zones/src/integrationTest/java/org/apache/ignite/internal/distributionzones/ItDistributionZonesFilterTest.java
+++ b/modules/distribution-zones/src/integrationTest/java/org/apache/ignite/internal/distributionzones/ItDistributionZonesFilterTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.distributionzones;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_FILTER;
 import static org.apache.ignite.internal.catalog.commands.CatalogUtils.IMMEDIATE_TIMER_VALUE;
@@ -26,6 +25,7 @@ import static org.apache.ignite.internal.distributionzones.DistributionZonesUtil
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.waitForCondition;
 import static org.apache.ignite.internal.util.ByteUtils.fromBytes;
 import static org.apache.ignite.internal.util.ByteUtils.toBytes;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
 import static org.apache.ignite.internal.utils.RebalanceUtil.pendingPartAssignmentsKey;
 import static org.apache.ignite.internal.utils.RebalanceUtil.stablePartAssignmentsKey;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -392,7 +392,7 @@ public class ItDistributionZonesFilterTest extends ClusterPerTestIntegrationTest
         node0.catalogManager().listen(CatalogEvent.ZONE_ALTER, (parameters, exception) -> {
             latch.countDown();
 
-            return completedFuture(false);
+            return falseCompletedFuture();
         });
 
         session.execute(null, alterZoneSql(3));
diff --git a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java
index d1c27ed9ee..ec4f607dc8 100644
--- a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java
+++ b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/DistributionZoneManager.java
@@ -20,7 +20,6 @@ package org.apache.ignite.internal.distributionzones;
 import static java.util.Collections.emptySet;
 import static java.util.Collections.unmodifiableSet;
 import static java.util.concurrent.CompletableFuture.allOf;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static java.util.stream.Collectors.toList;
@@ -63,6 +62,8 @@ import static org.apache.ignite.internal.util.ByteUtils.bytesToLong;
 import static org.apache.ignite.internal.util.ByteUtils.fromBytes;
 import static org.apache.ignite.internal.util.ByteUtils.longToBytes;
 import static org.apache.ignite.internal.util.ByteUtils.toBytes;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLock;
 import static org.apache.ignite.internal.util.IgniteUtils.shutdownAndAwaitTermination;
 import static org.apache.ignite.lang.ErrorGroups.Common.NODE_STOPPING_ERR;
@@ -343,7 +344,7 @@ public class DistributionZoneManager implements IgniteComponent {
 
         causalityDataNodesEngine.causalityOnUpdateScaleUp(causalityToken, zoneId, newScaleUp);
 
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     private CompletableFuture<Void> onUpdateScaleDownBusy(AlterZoneEventParameters parameters) {
@@ -385,7 +386,7 @@ public class DistributionZoneManager implements IgniteComponent {
 
         causalityDataNodesEngine.causalityOnUpdateScaleDown(causalityToken, zoneId, newScaleDown);
 
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     private CompletableFuture<Void> onUpdateFilter(AlterZoneEventParameters parameters) {
@@ -402,7 +403,7 @@ public class DistributionZoneManager implements IgniteComponent {
             // It is possible when node was restarted after this listener completed,
             // but applied causalityToken didn't have time to be propagated to the Vault.
             if (bytesToLong(filterUpdateRevision.value()) >= causalityToken) {
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         }
 
@@ -461,7 +462,7 @@ public class DistributionZoneManager implements IgniteComponent {
 
         causalityDataNodesEngine.onCreateOrRestoreZoneState(causalityToken, zone);
 
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     /**
@@ -575,7 +576,7 @@ public class DistributionZoneManager implements IgniteComponent {
                                     revision
                             );
                         }
-                    }).thenCompose((ignored) -> completedFuture(null));
+                    }).thenCompose((ignored) -> nullCompletedFuture());
         } finally {
             busyLock.leaveBusy();
         }
@@ -615,7 +616,7 @@ public class DistributionZoneManager implements IgniteComponent {
                             LOG.debug("Failed to delete zone's dataNodes keys [zoneId = {}, revision = {}]", zoneId, revision);
                         }
                     })
-                    .thenCompose(ignored -> completedFuture(null));
+                    .thenCompose(ignored -> nullCompletedFuture());
         } finally {
             busyLock.leaveBusy();
         }
@@ -872,7 +873,7 @@ public class DistributionZoneManager implements IgniteComponent {
                     } else {
                         LOG.debug("Failed to update recoverable states for distribution zone manager [revision = {}]", revision);
                     }
-                }).thenCompose((ignored) -> completedFuture(null));
+                }).thenCompose((ignored) -> nullCompletedFuture());
     }
 
     /**
@@ -982,7 +983,7 @@ public class DistributionZoneManager implements IgniteComponent {
 
             if (zoneState == null) {
                 // Zone was deleted
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             Set<ByteArray> keysToGetFromMs = Set.of(
@@ -994,7 +995,7 @@ public class DistributionZoneManager implements IgniteComponent {
             return metaStorageManager.getAll(keysToGetFromMs).thenCompose(values -> inBusyLock(busyLock, () -> {
                 if (values.containsValue(null)) {
                     // Zone was deleted
-                    return completedFuture(null);
+                    return nullCompletedFuture();
                 }
 
                 Map<Node, Integer> dataNodesFromMetaStorage = extractDataNodes(values.get(zoneDataNodesKey(zoneId)));
@@ -1012,7 +1013,7 @@ public class DistributionZoneManager implements IgniteComponent {
                             scaleUpTriggerRevision
                     );
 
-                    return completedFuture(null);
+                    return nullCompletedFuture();
                 }
 
                 List<Node> deltaToAdd = zoneState.nodesToBeAddedToDataNodes(scaleUpTriggerRevision, revision);
@@ -1062,7 +1063,7 @@ public class DistributionZoneManager implements IgniteComponent {
                                 return saveDataNodesToMetaStorageOnScaleUp(zoneId, revision);
                             }
 
-                            return completedFuture(null);
+                            return nullCompletedFuture();
                         }));
             })).whenComplete((v, e) -> {
                 if (e != null) {
@@ -1092,7 +1093,7 @@ public class DistributionZoneManager implements IgniteComponent {
 
             if (zoneState == null) {
                 // Zone was deleted
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             Set<ByteArray> keysToGetFromMs = Set.of(
@@ -1104,7 +1105,7 @@ public class DistributionZoneManager implements IgniteComponent {
             return metaStorageManager.getAll(keysToGetFromMs).thenCompose(values -> inBusyLock(busyLock, () -> {
                 if (values.containsValue(null)) {
                     // Zone was deleted
-                    return completedFuture(null);
+                    return nullCompletedFuture();
                 }
 
                 Map<Node, Integer> dataNodesFromMetaStorage = extractDataNodes(values.get(zoneDataNodesKey(zoneId)));
@@ -1122,7 +1123,7 @@ public class DistributionZoneManager implements IgniteComponent {
                             scaleDownTriggerRevision
                     );
 
-                    return completedFuture(null);
+                    return nullCompletedFuture();
                 }
 
                 List<Node> deltaToRemove = zoneState.nodesToBeRemovedFromDataNodes(scaleDownTriggerRevision, revision);
@@ -1168,7 +1169,7 @@ public class DistributionZoneManager implements IgniteComponent {
                                 return saveDataNodesToMetaStorageOnScaleDown(zoneId, revision);
                             }
 
-                            return completedFuture(null);
+                            return nullCompletedFuture();
                         }));
             })).whenComplete((v, e) -> {
                 if (e != null) {
@@ -1461,13 +1462,13 @@ public class DistributionZoneManager implements IgniteComponent {
             CreateZoneEventParameters params = (CreateZoneEventParameters) parameters;
 
             return createOrRestoreZoneStateBusy(params.zoneDescriptor(), params.causalityToken())
-                    .thenCompose((ignored) -> completedFuture(false));
+                    .thenCompose((ignored) -> falseCompletedFuture());
         }));
 
         catalogManager.listen(ZONE_DROP, (parameters, exception) -> inBusyLock(busyLock, () -> {
             assert exception == null : parameters;
 
-            return onDropZoneBusy((DropZoneEventParameters) parameters).thenCompose((ignored) -> completedFuture(false));
+            return onDropZoneBusy((DropZoneEventParameters) parameters).thenCompose((ignored) -> falseCompletedFuture());
         }));
 
         catalogManager.listen(ZONE_ALTER, new ManagerCatalogAlterZoneEventListener());
diff --git a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/causalitydatanodes/CausalityDataNodesEngine.java b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/causalitydatanodes/CausalityDataNodesEngine.java
index e1164c567d..d3286fa75b 100644
--- a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/causalitydatanodes/CausalityDataNodesEngine.java
+++ b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/causalitydatanodes/CausalityDataNodesEngine.java
@@ -30,6 +30,7 @@ import static org.apache.ignite.internal.distributionzones.DistributionZonesUtil
 import static org.apache.ignite.internal.util.ByteUtils.bytesToLong;
 import static org.apache.ignite.internal.util.ByteUtils.fromBytes;
 import static org.apache.ignite.internal.util.ByteUtils.toBytes;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLock;
 
 import java.io.Serializable;
@@ -144,7 +145,7 @@ public class CausalityDataNodesEngine {
                 return zonesVv.get(causalityToken);
             } catch (OutdatedTokenException e) {
                 // This exception means that the DistributionZoneManager has already processed event with the causalityToken.
-                return CompletableFuture.completedFuture(null);
+                return nullCompletedFuture();
             }
         }).thenApply(ignored -> inBusyLock(busyLock, () -> {
             ConcurrentSkipListMap<Long, ZoneConfiguration> versionedCfg = zonesVersionedCfg.get(zoneId);
diff --git a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/rebalance/DistributionZoneRebalanceEngine.java b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/rebalance/DistributionZoneRebalanceEngine.java
index bbff27b34c..398bc40a9d 100644
--- a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/rebalance/DistributionZoneRebalanceEngine.java
+++ b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/rebalance/DistributionZoneRebalanceEngine.java
@@ -18,13 +18,13 @@
 package org.apache.ignite.internal.distributionzones.rebalance;
 
 import static java.util.concurrent.CompletableFuture.allOf;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.stream.Collectors.toList;
 import static org.apache.ignite.internal.catalog.events.CatalogEvent.ZONE_ALTER;
 import static org.apache.ignite.internal.distributionzones.DistributionZonesUtil.extractZoneId;
 import static org.apache.ignite.internal.distributionzones.DistributionZonesUtil.filterDataNodes;
 import static org.apache.ignite.internal.distributionzones.DistributionZonesUtil.parseDataNodes;
 import static org.apache.ignite.internal.distributionzones.DistributionZonesUtil.zoneDataNodesKey;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -133,7 +133,7 @@ public class DistributionZoneRebalanceEngine {
 
                     if (dataNodes == null) {
                         //The zone was removed so data nodes was removed too.
-                        return completedFuture(null);
+                        return nullCompletedFuture();
                     }
 
                     int zoneId = extractZoneId(evt.entryEvent().newEntry().key());
@@ -145,7 +145,7 @@ public class DistributionZoneRebalanceEngine {
 
                     if (zoneDescriptor == null) {
                         // Zone has been removed.
-                        return completedFuture(null);
+                        return nullCompletedFuture();
                     }
 
                     Set<String> filteredDataNodes = filterDataNodes(
@@ -155,7 +155,7 @@ public class DistributionZoneRebalanceEngine {
                     );
 
                     if (filteredDataNodes.isEmpty()) {
-                        return completedFuture(null);
+                        return nullCompletedFuture();
                     }
 
                     List<CatalogTableDescriptor> tableDescriptors = findTablesByZoneId(zoneId, catalogVersion);
@@ -184,7 +184,7 @@ public class DistributionZoneRebalanceEngine {
             return distributionZoneManager.dataNodes(causalityToken, zoneId)
                     .thenCompose(dataNodes -> {
                         if (dataNodes.isEmpty()) {
-                            return completedFuture(null);
+                            return nullCompletedFuture();
                         }
 
                         List<CatalogTableDescriptor> tableDescriptors = findTablesByZoneId(zoneId, parameters.catalogVersion());
diff --git a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/utils/CatalogAlterZoneEventListener.java b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/utils/CatalogAlterZoneEventListener.java
index 88695ecdb5..02decc0d57 100644
--- a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/utils/CatalogAlterZoneEventListener.java
+++ b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/utils/CatalogAlterZoneEventListener.java
@@ -18,8 +18,8 @@
 package org.apache.ignite.internal.distributionzones.utils;
 
 import static java.util.concurrent.CompletableFuture.allOf;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -121,7 +121,7 @@ public class CatalogAlterZoneEventListener implements EventListener<AlterZoneEve
             addFuture(futures, onAutoAdjustScaleDownUpdate(parameters, oldZone.dataNodesAutoAdjustScaleDown()));
         }
 
-        return futures.isEmpty() ? completedFuture(null) : allOf(futures.toArray(CompletableFuture[]::new));
+        return futures.isEmpty() ? nullCompletedFuture() : allOf(futures.toArray(CompletableFuture[]::new));
     }
 
     /**
@@ -132,7 +132,7 @@ public class CatalogAlterZoneEventListener implements EventListener<AlterZoneEve
      * @return Future that signifies the end of the callback execution.
      */
     protected CompletableFuture<Void> onZoneUpdate(AlterZoneEventParameters parameters, CatalogZoneDescriptor oldZone) {
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     /**
@@ -143,7 +143,7 @@ public class CatalogAlterZoneEventListener implements EventListener<AlterZoneEve
      * @return Future that signifies the end of the callback execution.
      */
     protected CompletableFuture<Void> onPartitionsUpdate(AlterZoneEventParameters parameters, int oldPartitions) {
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     /**
@@ -154,7 +154,7 @@ public class CatalogAlterZoneEventListener implements EventListener<AlterZoneEve
      * @return Future that signifies the end of the callback execution.
      */
     protected CompletableFuture<Void> onReplicasUpdate(AlterZoneEventParameters parameters, int oldReplicas) {
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     /**
@@ -165,7 +165,7 @@ public class CatalogAlterZoneEventListener implements EventListener<AlterZoneEve
      * @return Future that signifies the end of the callback execution.
      */
     protected CompletableFuture<Void> onFilterUpdate(AlterZoneEventParameters parameters, String oldFilter) {
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     /**
@@ -177,7 +177,7 @@ public class CatalogAlterZoneEventListener implements EventListener<AlterZoneEve
      * @return Future that signifies the end of the callback execution.
      */
     protected CompletableFuture<Void> onAutoAdjustUpdate(AlterZoneEventParameters parameters, int oldAutoAdjust) {
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     /**
@@ -189,7 +189,7 @@ public class CatalogAlterZoneEventListener implements EventListener<AlterZoneEve
      * @return Future that signifies the end of the callback execution.
      */
     protected CompletableFuture<Void> onAutoAdjustScaleUpUpdate(AlterZoneEventParameters parameters, int oldAutoAdjustScaleUp) {
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     /**
@@ -201,7 +201,7 @@ public class CatalogAlterZoneEventListener implements EventListener<AlterZoneEve
      * @return Future that signifies the end of the callback execution.
      */
     protected CompletableFuture<Void> onAutoAdjustScaleDownUpdate(AlterZoneEventParameters parameters, int oldAutoAdjustScaleDown) {
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     private static void addFuture(List<CompletableFuture<Void>> futures, CompletableFuture<Void> future) {
diff --git a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/causalitydatanodes/DistributionZoneCausalityDataNodesTest.java b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/causalitydatanodes/DistributionZoneCausalityDataNodesTest.java
index 027daee678..b9567097d0 100644
--- a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/causalitydatanodes/DistributionZoneCausalityDataNodesTest.java
+++ b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/causalitydatanodes/DistributionZoneCausalityDataNodesTest.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.internal.distributionzones.causalitydatanodes;
 
 import static java.util.Collections.emptySet;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.stream.Collectors.toSet;
 import static org.apache.ignite.internal.catalog.CatalogService.DEFAULT_ZONE_NAME;
@@ -39,6 +38,8 @@ import static org.apache.ignite.internal.testframework.IgniteTestUtils.assertThr
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.waitForCondition;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
 import static org.apache.ignite.internal.util.ByteUtils.fromBytes;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.startsWith;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -1221,7 +1222,7 @@ public class DistributionZoneCausalityDataNodesTest extends BaseDistributionZone
                     topologyRevisions.remove(nodeNames).complete(revision);
                 }
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             @Override
@@ -1271,7 +1272,7 @@ public class DistributionZoneCausalityDataNodesTest extends BaseDistributionZone
 
                 completeRevisionFuture(zoneDataNodesRevisions.remove(zoneDataNodesKey), revision);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             @Override
@@ -1286,13 +1287,13 @@ public class DistributionZoneCausalityDataNodesTest extends BaseDistributionZone
 
             completeRevisionFuture(createZoneRevisions.remove(zoneName), parameters.causalityToken());
 
-            return completedFuture(false);
+            return falseCompletedFuture();
         });
 
         catalogManager.listen(ZONE_DROP, (parameters, exception) -> {
             completeRevisionFuture(dropZoneRevisions.remove(((DropZoneEventParameters) parameters).zoneId()), parameters.causalityToken());
 
-            return completedFuture(false);
+            return falseCompletedFuture();
         });
 
         catalogManager.listen(ZONE_ALTER, new CatalogAlterZoneEventListener(catalogManager) {
@@ -1300,21 +1301,21 @@ public class DistributionZoneCausalityDataNodesTest extends BaseDistributionZone
             protected CompletableFuture<Void> onAutoAdjustScaleUpUpdate(AlterZoneEventParameters parameters, int oldAutoAdjustScaleUp) {
                 completeRevisionFuture(zoneScaleUpRevisions.remove(parameters.zoneDescriptor().id()), parameters.causalityToken());
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             @Override
             protected CompletableFuture<Void> onAutoAdjustScaleDownUpdate(AlterZoneEventParameters parameters, int oldAutoAdjustScaleDown) {
                 completeRevisionFuture(zoneScaleDownRevisions.remove(parameters.zoneDescriptor().id()), parameters.causalityToken());
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             @Override
             protected CompletableFuture<Void> onFilterUpdate(AlterZoneEventParameters parameters, String oldFilter) {
                 completeRevisionFuture(zoneChangeFilterRevisions.remove(parameters.zoneDescriptor().id()), parameters.causalityToken());
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
     }
diff --git a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/rebalance/DistributionZoneRebalanceEngineTest.java b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/rebalance/DistributionZoneRebalanceEngineTest.java
index cfbed58369..cc180b628a 100644
--- a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/rebalance/DistributionZoneRebalanceEngineTest.java
+++ b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/rebalance/DistributionZoneRebalanceEngineTest.java
@@ -33,6 +33,8 @@ import static org.apache.ignite.internal.table.TableTestUtils.getTableIdStrict;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.waitForCondition;
 import static org.apache.ignite.internal.util.ByteUtils.fromBytes;
 import static org.apache.ignite.internal.util.ByteUtils.toBytes;
+import static org.apache.ignite.internal.util.CompletableFutures.emptyMapCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.sql.ColumnType.STRING;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -219,10 +221,10 @@ public class DistributionZoneRebalanceEngineTest extends IgniteAbstractTest {
         });
 
         // stable partitions for tables are empty
-        when(metaStorageManager.getAll(any())).thenReturn(completedFuture(Map.of()));
+        when(metaStorageManager.getAll(any())).thenReturn(emptyMapCompletedFuture());
 
-        when(vaultManager.get(any(ByteArray.class))).thenReturn(completedFuture(null));
-        when(vaultManager.put(any(ByteArray.class), any(byte[].class))).thenReturn(completedFuture(null));
+        when(vaultManager.get(any(ByteArray.class))).thenReturn(nullCompletedFuture());
+        when(vaultManager.put(any(ByteArray.class), any(byte[].class))).thenReturn(nullCompletedFuture());
     }
 
     @AfterEach
diff --git a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/utils/CatalogAlterZoneEventListenerTest.java b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/utils/CatalogAlterZoneEventListenerTest.java
index d367dc8d66..77cca2e0fb 100644
--- a/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/utils/CatalogAlterZoneEventListenerTest.java
+++ b/modules/distribution-zones/src/test/java/org/apache/ignite/internal/distributionzones/utils/CatalogAlterZoneEventListenerTest.java
@@ -17,9 +17,9 @@
 
 package org.apache.ignite.internal.distributionzones.utils;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.catalog.events.CatalogEvent.ZONE_ALTER;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
 
@@ -44,7 +44,7 @@ public class CatalogAlterZoneEventListenerTest extends BaseCatalogManagerTest {
             protected CompletableFuture<Void> onZoneUpdate(AlterZoneEventParameters parameters, CatalogZoneDescriptor oldZone) {
                 onZoneUpdateFuture.complete(null);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
 
@@ -66,7 +66,7 @@ public class CatalogAlterZoneEventListenerTest extends BaseCatalogManagerTest {
             protected CompletableFuture<Void> onZoneUpdate(AlterZoneEventParameters parameters, CatalogZoneDescriptor oldZone) {
                 onZoneUpdateFuture.complete(null);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             @Override
@@ -75,7 +75,7 @@ public class CatalogAlterZoneEventListenerTest extends BaseCatalogManagerTest {
 
                 onPartitionsUpdateFuture.complete(null);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
 
@@ -99,7 +99,7 @@ public class CatalogAlterZoneEventListenerTest extends BaseCatalogManagerTest {
             protected CompletableFuture<Void> onZoneUpdate(AlterZoneEventParameters parameters, CatalogZoneDescriptor oldZone) {
                 onZoneUpdateFuture.complete(null);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             @Override
@@ -108,7 +108,7 @@ public class CatalogAlterZoneEventListenerTest extends BaseCatalogManagerTest {
 
                 onReplicasUpdateFuture.complete(null);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
 
@@ -131,7 +131,7 @@ public class CatalogAlterZoneEventListenerTest extends BaseCatalogManagerTest {
             protected CompletableFuture<Void> onZoneUpdate(AlterZoneEventParameters parameters, CatalogZoneDescriptor oldZone) {
                 onZoneUpdateFuture.complete(null);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             @Override
@@ -140,7 +140,7 @@ public class CatalogAlterZoneEventListenerTest extends BaseCatalogManagerTest {
 
                 onFilterUpdateFuture.complete(null);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
 
@@ -163,7 +163,7 @@ public class CatalogAlterZoneEventListenerTest extends BaseCatalogManagerTest {
             protected CompletableFuture<Void> onZoneUpdate(AlterZoneEventParameters parameters, CatalogZoneDescriptor oldZone) {
                 onZoneUpdateFuture.complete(null);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             @Override
@@ -172,7 +172,7 @@ public class CatalogAlterZoneEventListenerTest extends BaseCatalogManagerTest {
 
                 onAutoAdjustUpdateFuture.complete(null);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
 
@@ -195,7 +195,7 @@ public class CatalogAlterZoneEventListenerTest extends BaseCatalogManagerTest {
             protected CompletableFuture<Void> onZoneUpdate(AlterZoneEventParameters parameters, CatalogZoneDescriptor oldZone) {
                 onZoneUpdateFuture.complete(null);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             @Override
@@ -204,7 +204,7 @@ public class CatalogAlterZoneEventListenerTest extends BaseCatalogManagerTest {
 
                 onAutoAdjustScaleUpUpdateFuture.complete(null);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
 
@@ -230,7 +230,7 @@ public class CatalogAlterZoneEventListenerTest extends BaseCatalogManagerTest {
             protected CompletableFuture<Void> onZoneUpdate(AlterZoneEventParameters parameters, CatalogZoneDescriptor oldZone) {
                 onZoneUpdateFuture.complete(null);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             @Override
@@ -239,7 +239,7 @@ public class CatalogAlterZoneEventListenerTest extends BaseCatalogManagerTest {
 
                 onAutoAdjustScaleDownUpdateFuture.complete(null);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
 
diff --git a/modules/file-transfer/src/integrationTest/java/org/apache/ignite/internal/network/file/ItFileTransferTest.java b/modules/file-transfer/src/integrationTest/java/org/apache/ignite/internal/network/file/ItFileTransferTest.java
index 4eef7809e4..e7142c7c71 100644
--- a/modules/file-transfer/src/integrationTest/java/org/apache/ignite/internal/network/file/ItFileTransferTest.java
+++ b/modules/file-transfer/src/integrationTest/java/org/apache/ignite/internal/network/file/ItFileTransferTest.java
@@ -25,6 +25,8 @@ import static org.apache.ignite.internal.network.file.PathAssertions.namesAndCon
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrow;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrowWithCauseOrSuppressed;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
+import static org.apache.ignite.internal.util.CompletableFutures.emptyListCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.awaitility.Awaitility.await;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsInAnyOrder;
@@ -291,7 +293,7 @@ public class ItFileTransferTest extends BaseIgniteAbstractTest {
         Node sourceNode = cluster.members.get(0);
         sourceNode.fileTransferService().addFileProvider(
                 Identifier.class,
-                req -> completedFuture(List.of())
+                req -> emptyListCompletedFuture()
         );
 
         // Download files on the target node from the source node.
@@ -365,7 +367,7 @@ public class ItFileTransferTest extends BaseIgniteAbstractTest {
         Node sourceNode = cluster.members.get(0);
         sourceNode.fileTransferService().addFileProvider(
                 Identifier.class,
-                req -> completedFuture(List.of())
+                req -> emptyListCompletedFuture()
         );
 
         // Upload files to the target node from the source node.
@@ -410,7 +412,7 @@ public class ItFileTransferTest extends BaseIgniteAbstractTest {
         CompletableFuture<List<Path>> uploadedFilesFuture = new CompletableFuture<>();
         targetNode.fileTransferService().addFileConsumer(Identifier.class, ((identifier, uploadedFiles) -> {
             uploadedFilesFuture.complete(uploadedFiles);
-            return completedFuture(null);
+            return nullCompletedFuture();
         }));
 
         // Upload files to the target node from the source node.
@@ -447,7 +449,7 @@ public class ItFileTransferTest extends BaseIgniteAbstractTest {
         CompletableFuture<List<Path>> uploadedFilesFuture = new CompletableFuture<>();
         targetNode.fileTransferService().addFileConsumer(Identifier.class, ((identifier, uploadedFiles) -> {
             uploadedFilesFuture.complete(uploadedFiles);
-            return completedFuture(null);
+            return nullCompletedFuture();
         }));
 
         // Upload files to the target node from the source node.
diff --git a/modules/file-transfer/src/main/java/org/apache/ignite/internal/network/file/FileSender.java b/modules/file-transfer/src/main/java/org/apache/ignite/internal/network/file/FileSender.java
index 1dc9e80dcf..c0282b2d49 100644
--- a/modules/file-transfer/src/main/java/org/apache/ignite/internal/network/file/FileSender.java
+++ b/modules/file-transfer/src/main/java/org/apache/ignite/internal/network/file/FileSender.java
@@ -18,11 +18,11 @@
 package org.apache.ignite.internal.network.file;
 
 import static java.util.concurrent.CompletableFuture.allOf;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static java.util.concurrent.CompletableFuture.supplyAsync;
 import static org.apache.ignite.internal.network.file.Channel.FILE_TRANSFER_CHANNEL;
 import static org.apache.ignite.internal.network.file.messages.FileTransferError.toException;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.io.IOException;
 import java.nio.file.Path;
@@ -160,7 +160,7 @@ class FileSender {
                             return processTransferWithNextAsync(nextTransfer);
                         } else {
                             rateLimiter.release();
-                            return completedFuture(null);
+                            return nullCompletedFuture();
                         }
                     }
                 }, executorService);
@@ -195,7 +195,7 @@ class FileSender {
      */
     private CompletableFuture<Void> sendFile(String receiverConsistentId, UUID id, Path path, AtomicBoolean shouldBeCancelled) {
         if (path.toFile().length() == 0) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         } else {
             return supplyAsync(() -> {
                 try {
@@ -242,7 +242,7 @@ class FileSender {
                                 executorService
                         );
             } else {
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         } catch (IOException e) {
             return failedFuture(e);
diff --git a/modules/file-transfer/src/main/java/org/apache/ignite/internal/network/file/FileTransferServiceImpl.java b/modules/file-transfer/src/main/java/org/apache/ignite/internal/network/file/FileTransferServiceImpl.java
index 4cb892d898..e845514cfd 100644
--- a/modules/file-transfer/src/main/java/org/apache/ignite/internal/network/file/FileTransferServiceImpl.java
+++ b/modules/file-transfer/src/main/java/org/apache/ignite/internal/network/file/FileTransferServiceImpl.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.network.file;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static java.util.concurrent.CompletableFuture.runAsync;
 import static java.util.concurrent.CompletableFuture.supplyAsync;
@@ -25,6 +24,7 @@ import static org.apache.ignite.internal.network.file.Channel.FILE_TRANSFER_CHAN
 import static org.apache.ignite.internal.network.file.messages.FileHeader.fromPaths;
 import static org.apache.ignite.internal.network.file.messages.FileTransferError.fromThrowable;
 import static org.apache.ignite.internal.network.file.messages.FileTransferError.toException;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.io.IOException;
 import java.nio.file.Path;
@@ -626,7 +626,7 @@ public class FileTransferServiceImpl implements FileTransferService {
                 }
             }
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         /**
diff --git a/modules/file-transfer/src/test/java/org/apache/ignite/internal/network/file/FileTransferServiceImplTest.java b/modules/file-transfer/src/test/java/org/apache/ignite/internal/network/file/FileTransferServiceImplTest.java
index 5d15984eea..816a819dc9 100644
--- a/modules/file-transfer/src/test/java/org/apache/ignite/internal/network/file/FileTransferServiceImplTest.java
+++ b/modules/file-transfer/src/test/java/org/apache/ignite/internal/network/file/FileTransferServiceImplTest.java
@@ -24,6 +24,7 @@ import static org.apache.ignite.internal.network.file.messages.FileTransferError
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrow;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.awaitility.Awaitility.await;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.emptyArray;
@@ -57,6 +58,7 @@ import org.apache.ignite.internal.network.file.messages.Identifier;
 import org.apache.ignite.internal.testframework.BaseIgniteAbstractTest;
 import org.apache.ignite.internal.testframework.WorkDirectory;
 import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
+import org.apache.ignite.internal.util.CompletableFutures;
 import org.apache.ignite.network.ClusterNodeImpl;
 import org.apache.ignite.network.NetworkAddress;
 import org.apache.ignite.network.NetworkMessageHandler;
@@ -272,14 +274,14 @@ class FileTransferServiceImplTest extends BaseIgniteAbstractTest {
         doAnswer(invocation -> {
             // Update transfer lifecycle state - transfer is registered.
             transferLifecycleState.compareAndSet(0, 1);
-            return (TransferredFilesCollector) () -> completedFuture(List.of());
+            return (TransferredFilesCollector) CompletableFutures::emptyListCompletedFuture;
         }).when(fileReceiver).registerTransfer(anyString(), any(UUID.class), anyList(), any(Path.class));
 
         // Set messaging service to fail to send upload response if transfer is not registered.
         doAnswer(invocation -> {
             // Check lifecycle state - transfer is registered.
             transferLifecycleState.compareAndSet(1, 2);
-            return completedFuture(null);
+            return nullCompletedFuture();
         }).when(messagingService).respond(anyString(), eq(FILE_TRANSFER_CHANNEL), any(FileTransferInitResponse.class), anyLong());
 
         // Create file transfer request.
diff --git a/modules/index/src/integrationTest/java/org/apache/ignite/internal/index/ItBuildIndexOneNodeTest.java b/modules/index/src/integrationTest/java/org/apache/ignite/internal/index/ItBuildIndexOneNodeTest.java
index a265c4a334..fb71987143 100644
--- a/modules/index/src/integrationTest/java/org/apache/ignite/internal/index/ItBuildIndexOneNodeTest.java
+++ b/modules/index/src/integrationTest/java/org/apache/ignite/internal/index/ItBuildIndexOneNodeTest.java
@@ -17,13 +17,14 @@
 
 package org.apache.ignite.internal.index;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
 import static org.apache.ignite.internal.sql.engine.util.QueryChecker.containsIndexScan;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.runAsync;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.trueCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.greaterThan;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -263,10 +264,10 @@ public class ItBuildIndexOneNodeTest extends BaseSqlIntegrationTest {
                 if (indexName.equals(index.name())) {
                     future.complete(null);
 
-                    return completedFuture(true);
+                    return trueCompletedFuture();
                 }
 
-                return completedFuture(false);
+                return falseCompletedFuture();
             } catch (Throwable t) {
                 future.completeExceptionally(t);
 
diff --git a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexAvailabilityController.java b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexAvailabilityController.java
index 5862baf0dd..60d373967a 100644
--- a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexAvailabilityController.java
+++ b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexAvailabilityController.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.internal.index;
 
 import static java.util.concurrent.CompletableFuture.allOf;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static java.util.stream.Collectors.toList;
 import static org.apache.ignite.internal.index.IndexManagementUtils.PARTITION_BUILD_INDEX_KEY_PREFIX;
@@ -37,6 +36,7 @@ import static org.apache.ignite.internal.metastorage.dsl.Conditions.exists;
 import static org.apache.ignite.internal.metastorage.dsl.Operations.noop;
 import static org.apache.ignite.internal.metastorage.dsl.Operations.remove;
 import static org.apache.ignite.internal.util.CollectionUtils.concat;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.ExceptionUtils.unwrapCause;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLock;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLockAsync;
@@ -220,7 +220,7 @@ class IndexAvailabilityController implements ManuallyCloseable {
     private CompletableFuture<?> onIndexCreate(CreateIndexEventParameters parameters) {
         return inBusyLockAsync(busyLock, () -> {
             if (parameters.indexDescriptor().available()) {
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             int indexId = parameters.indexDescriptor().id();
@@ -267,14 +267,14 @@ class IndexAvailabilityController implements ManuallyCloseable {
         return inBusyLockAsync(busyLock, () -> {
             if (!event.single()) {
                 // We don't need to handle keys on index creation or deletion.
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             Entry entry = event.entryEvent().newEntry();
 
             if (entry.value() != null) {
                 // In case an index was created when there was only one partition.
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             String partitionBuildIndexKey = toPartitionBuildIndexMetastoreKeyString(entry.key());
@@ -285,14 +285,14 @@ class IndexAvailabilityController implements ManuallyCloseable {
 
             if (isAnyMetastoreKeyPresentLocally(metaStorageManager, partitionBuildIndexMetastoreKeyPrefix(indexId), metastoreRevision)
                     || isMetastoreKeyAbsentLocally(metaStorageManager, inProgressBuildIndexMetastoreKey(indexId), metastoreRevision)) {
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             // We will not wait for the command to be executed, since we will then find ourselves in a dead lock since we will not be able
             // to free the metastore thread.
             makeIndexAvailableInCatalogWithoutFuture(catalogManager, indexId, LOG);
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
     }
 
@@ -324,7 +324,7 @@ class IndexAvailabilityController implements ManuallyCloseable {
         ByteArray inProgressBuildIndexMetastoreKey = inProgressBuildIndexMetastoreKey(indexId);
 
         if (isMetastoreKeyAbsentLocally(metaStorageManager, inProgressBuildIndexMetastoreKey, recoveryRevision)) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         return removeMetastoreKeyIfPresent(metaStorageManager, inProgressBuildIndexMetastoreKey);
@@ -354,6 +354,6 @@ class IndexAvailabilityController implements ManuallyCloseable {
             makeIndexAvailableInCatalogWithoutFuture(catalogManager, indexId, LOG);
         }
 
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 }
diff --git a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildController.java b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildController.java
index aefc4cd5c5..1bc8568931 100644
--- a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildController.java
+++ b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildController.java
@@ -22,6 +22,7 @@ import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.ignite.internal.index.IndexManagementUtils.isPrimaryReplica;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLock;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLockAsync;
 
@@ -148,7 +149,7 @@ class IndexBuildController implements ManuallyCloseable {
     private CompletableFuture<?> onIndexCreate(CreateIndexEventParameters parameters) {
         return inBusyLockAsync(busyLock, () -> {
             if (parameters.indexDescriptor().available()) {
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             var startBuildIndexFutures = new ArrayList<CompletableFuture<?>>();
@@ -177,7 +178,7 @@ class IndexBuildController implements ManuallyCloseable {
         return inBusyLockAsync(busyLock, () -> {
             indexBuilder.stopBuildingIndexes(parameters.indexId());
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
     }
 
@@ -204,7 +205,7 @@ class IndexBuildController implements ManuallyCloseable {
             } else {
                 stopBuildingIndexesIfPrimaryExpired(primaryReplicaId);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
     }
diff --git a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildTask.java b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildTask.java
index 23ff89cec6..55b3d1a91e 100644
--- a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildTask.java
+++ b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexBuildTask.java
@@ -17,10 +17,10 @@
 
 package org.apache.ignite.internal.index;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static java.util.concurrent.CompletableFuture.supplyAsync;
 import static java.util.stream.Collectors.toList;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.ExceptionUtils.unwrapCause;
 
 import java.util.ArrayList;
@@ -151,7 +151,7 @@ class IndexBuildTask {
 
     private CompletableFuture<Void> handleNextBatch() {
         if (!enterBusy()) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         try {
@@ -167,7 +167,7 @@ class IndexBuildTask {
                                 listener.onBuildCompletion(taskId.getIndexId(), taskId.getTableId(), taskId.getPartitionId());
                             }
 
-                            return completedFuture(null);
+                            return nullCompletedFuture();
                         }
 
                         return handleNextBatch();
diff --git a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexChooser.java b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexChooser.java
index 29ca18dbd3..4686015413 100644
--- a/modules/index/src/main/java/org/apache/ignite/internal/index/IndexChooser.java
+++ b/modules/index/src/main/java/org/apache/ignite/internal/index/IndexChooser.java
@@ -20,8 +20,8 @@ package org.apache.ignite.internal.index;
 import static java.util.Collections.binarySearch;
 import static java.util.Collections.unmodifiableList;
 import static java.util.Comparator.comparingInt;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLock;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLockAsync;
 
@@ -199,12 +199,12 @@ class IndexChooser implements ManuallyCloseable {
             assert droppedIndexDescriptor != null : "indexId=" + parameters.indexId() + ", catalogVersion=" + previousCatalogVersion;
 
             if (!droppedIndexDescriptor.available()) {
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             addDroppedAvailableIndex(droppedIndexDescriptor, parameters.catalogVersion());
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
     }
 
@@ -214,7 +214,7 @@ class IndexChooser implements ManuallyCloseable {
             // right after a table drop has been activated.
             droppedAvailableTableIndexes.entrySet().removeIf(entry -> parameters.tableId() == entry.getKey().tableId);
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
     }
 
diff --git a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexAvailabilityControllerTest.java b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexAvailabilityControllerTest.java
index 045b1e8dab..f3cb45dfdd 100644
--- a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexAvailabilityControllerTest.java
+++ b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexAvailabilityControllerTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.index;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.catalog.CatalogService.DEFAULT_SCHEMA_NAME;
 import static org.apache.ignite.internal.catalog.CatalogService.DEFAULT_ZONE_NAME;
 import static org.apache.ignite.internal.catalog.commands.CatalogUtils.pkIndexName;
@@ -29,6 +28,7 @@ import static org.apache.ignite.internal.index.TestIndexManagementUtils.createTa
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
 import static org.apache.ignite.internal.util.ArrayUtils.BYTE_EMPTY_ARRAY;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.greaterThan;
 import static org.hamcrest.Matchers.nullValue;
@@ -84,7 +84,7 @@ public class IndexAvailabilityControllerTest extends BaseIgniteAbstractTest {
     private final IndexBuilder indexBuilder = new IndexBuilder(
             NODE_NAME,
             1,
-            mock(ReplicaService.class, invocation -> completedFuture(null))
+            mock(ReplicaService.class, invocation -> nullCompletedFuture())
     );
 
     private final IndexAvailabilityController indexAvailabilityController = new IndexAvailabilityController(
diff --git a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexBuilderTest.java b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexBuilderTest.java
index 35894303b3..c8387068b3 100644
--- a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexBuilderTest.java
+++ b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexBuilderTest.java
@@ -17,10 +17,10 @@
 
 package org.apache.ignite.internal.index;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.stream.Collectors.toList;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willTimeoutFast;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.mockito.ArgumentMatchers.any;
@@ -52,7 +52,7 @@ public class IndexBuilderTest extends BaseIgniteAbstractTest {
 
     private static final long ANY_ENLISTMENT_CONSISTENCY_TOKEN = 100500;
 
-    private final ReplicaService replicaService = mock(ReplicaService.class, invocation -> completedFuture(null));
+    private final ReplicaService replicaService = mock(ReplicaService.class, invocation -> nullCompletedFuture());
 
     private final IndexBuilder indexBuilder = new IndexBuilder("test", 1, replicaService);
 
@@ -144,7 +144,7 @@ public class IndexBuilderTest extends BaseIgniteAbstractTest {
         CompletableFuture<Void> future = new CompletableFuture<>();
 
         when(replicaService.invoke(any(ClusterNode.class), any(ReplicaRequest.class)))
-                .thenReturn(completedFuture(null))
+                .thenReturn(nullCompletedFuture())
                 .thenAnswer(invocation -> {
                     future.complete(null);
 
diff --git a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java
index 3a7d7c5b04..043b49bb49 100644
--- a/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java
+++ b/modules/index/src/test/java/org/apache/ignite/internal/index/IndexManagerTest.java
@@ -32,6 +32,8 @@ import static org.apache.ignite.internal.table.TableTestUtils.createHashIndex;
 import static org.apache.ignite.internal.table.TableTestUtils.getTableIdStrict;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.aMapWithSize;
 import static org.hamcrest.Matchers.equalTo;
@@ -137,7 +139,7 @@ public class IndexManagerTest extends BaseIgniteAbstractTest {
 
         mockSchemaManager = mock(SchemaManager.class);
 
-        when(mockSchemaManager.schemaRegistry(anyLong(), anyInt())).thenReturn(completedFuture(null));
+        when(mockSchemaManager.schemaRegistry(anyLong(), anyInt())).thenReturn(nullCompletedFuture());
 
         createAndStartComponents();
 
@@ -191,7 +193,7 @@ public class IndexManagerTest extends BaseIgniteAbstractTest {
                 }
             }
 
-            return completedFuture(false);
+            return falseCompletedFuture();
         });
 
         createHashIndex(
diff --git a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageManagerImplTest.java b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageManagerImplTest.java
index a02dfcd78b..17e9b8daaa 100644
--- a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageManagerImplTest.java
+++ b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageManagerImplTest.java
@@ -27,6 +27,7 @@ import static org.apache.ignite.internal.testframework.matchers.CompletableFutur
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willSucceedFast;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willSucceedIn;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.utils.ClusterServiceTestUtils.clusterService;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.contains;
@@ -243,7 +244,7 @@ public class ItMetaStorageManagerImplTest extends IgniteAbstractTest {
 
         RevisionUpdateListener listener = mock(RevisionUpdateListener.class);
 
-        when(listener.onUpdated(revisionCapture.capture())).thenReturn(completedFuture(null));
+        when(listener.onUpdated(revisionCapture.capture())).thenReturn(nullCompletedFuture());
 
         long revision = metaStorageManager.appliedRevision();
 
diff --git a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageMultipleNodesAbstractTest.java b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageMultipleNodesAbstractTest.java
index b66bffdd01..991a1c596b 100644
--- a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageMultipleNodesAbstractTest.java
+++ b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageMultipleNodesAbstractTest.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.internal.metastorage.impl;
 
 import static java.util.concurrent.CompletableFuture.allOf;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.stream.Collectors.toSet;
 import static org.apache.ignite.internal.metastorage.dsl.Conditions.notExists;
 import static org.apache.ignite.internal.metastorage.dsl.Conditions.revision;
@@ -27,6 +26,7 @@ import static org.apache.ignite.internal.metastorage.dsl.Operations.put;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.waitForCondition;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.greaterThan;
 import static org.hamcrest.Matchers.is;
@@ -305,7 +305,7 @@ public abstract class ItMetaStorageMultipleNodesAbstractTest extends IgniteAbstr
                     awaitFuture.complete(event.entryEvent());
                 }
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             @Override
diff --git a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageSafeTimePropagationAbstractTest.java b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageSafeTimePropagationAbstractTest.java
index 1baafe9b59..cdbcb04e11 100644
--- a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageSafeTimePropagationAbstractTest.java
+++ b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageSafeTimePropagationAbstractTest.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.metastorage.impl;
 
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.lessThan;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -54,7 +55,7 @@ public abstract class ItMetaStorageSafeTimePropagationAbstractTest extends Abstr
 
             @Override
             public CompletableFuture<Void> onRevisionApplied(WatchEvent e) {
-                return CompletableFuture.completedFuture(null);
+                return nullCompletedFuture();
             }
         });
     }
diff --git a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageWatchTest.java b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageWatchTest.java
index e8e501ebc3..d9b8fe1db8 100644
--- a/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageWatchTest.java
+++ b/modules/metastorage/src/integrationTest/java/org/apache/ignite/internal/metastorage/impl/ItMetaStorageWatchTest.java
@@ -17,12 +17,12 @@
 
 package org.apache.ignite.internal.metastorage.impl;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toMap;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.waitForCondition;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.utils.ClusterServiceTestUtils.findLocalAddresses;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsInAnyOrder;
@@ -257,7 +257,7 @@ public class ItMetaStorageWatchTest extends IgniteAbstractTest {
 
                 latch.countDown();
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             @Override
@@ -277,7 +277,7 @@ public class ItMetaStorageWatchTest extends IgniteAbstractTest {
 
                 latch.countDown();
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             @Override
@@ -301,7 +301,7 @@ public class ItMetaStorageWatchTest extends IgniteAbstractTest {
 
                     latch.countDown();
 
-                    return completedFuture(null);
+                    return nullCompletedFuture();
                 }
 
                 @Override
@@ -359,7 +359,7 @@ public class ItMetaStorageWatchTest extends IgniteAbstractTest {
 
                     exactLatch.countDown();
 
-                    return completedFuture(null);
+                    return nullCompletedFuture();
                 }
 
                 @Override
@@ -384,7 +384,7 @@ public class ItMetaStorageWatchTest extends IgniteAbstractTest {
 
                     prefixLatch.countDown();
 
-                    return completedFuture(null);
+                    return nullCompletedFuture();
                 }
 
                 @Override
@@ -436,7 +436,7 @@ public class ItMetaStorageWatchTest extends IgniteAbstractTest {
                 public CompletableFuture<Void> onUpdate(WatchEvent event) {
                     seenRevisionsAndTimestamps.add(new RevisionAndTimestamp(event.revision(), event.timestamp()));
 
-                    return completedFuture(null);
+                    return nullCompletedFuture();
                 }
 
                 @Override
diff --git a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageLeaderElectionListener.java b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageLeaderElectionListener.java
index 518cf51338..d0c7d3acb9 100644
--- a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageLeaderElectionListener.java
+++ b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageLeaderElectionListener.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.metastorage.impl;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.stream.Collectors.toSet;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.ExceptionUtils.unwrapCause;
 
 import java.util.List;
@@ -202,7 +202,7 @@ public class MetaStorageLeaderElectionListener implements LeaderElectionListener
 
     private CompletableFuture<Void> addLearner(RaftGroupService raftService, ClusterNode learner) {
         return updateConfigUnderLock(() -> isPeer(raftService, learner)
-                ? completedFuture(null)
+                ? nullCompletedFuture()
                 : raftService.addLearners(List.of(new Peer(learner.name()))));
     }
 
@@ -214,13 +214,13 @@ public class MetaStorageLeaderElectionListener implements LeaderElectionListener
         return updateConfigUnderLock(() -> logicalTopologyService.validatedNodesOnLeader()
                 .thenCompose(validatedNodes -> updateConfigUnderLock(() -> {
                     if (isPeer(raftService, learner)) {
-                        return completedFuture(null);
+                        return nullCompletedFuture();
                     }
 
                     // Due to possible races, we can have multiple versions of the same node in the validated set. We only remove
                     // a learner if there are no such versions left.
                     if (validatedNodes.stream().anyMatch(n -> n.name().equals(learner.name()))) {
-                        return completedFuture(null);
+                        return nullCompletedFuture();
                     }
 
                     return raftService.removeLearners(List.of(new Peer(learner.name())));
@@ -248,7 +248,7 @@ public class MetaStorageLeaderElectionListener implements LeaderElectionListener
         if (!busyLock.enterBusy()) {
             LOG.info("Skipping Meta Storage configuration update because the node is stopping");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         try {
diff --git a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageManagerImpl.java b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageManagerImpl.java
index 4474bb45e6..0cde9d2beb 100644
--- a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageManagerImpl.java
+++ b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/impl/MetaStorageManagerImpl.java
@@ -17,9 +17,9 @@
 
 package org.apache.ignite.internal.metastorage.impl;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.util.ByteUtils.bytesToLong;
 import static org.apache.ignite.internal.util.ByteUtils.longToBytes;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.cancelOrConsume;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLock;
 import static org.apache.ignite.lang.ErrorGroups.MetaStorage.RESTORING_STORAGE_ERR;
@@ -859,7 +859,7 @@ public class MetaStorageManagerImpl implements MetaStorageManager {
         if (!busyLock.enterBusy()) {
             LOG.info("Skipping applying MetaStorage revision because the node is stopping");
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         try {
diff --git a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/WatchProcessor.java b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/WatchProcessor.java
index 95f0568b83..918b00cc85 100644
--- a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/WatchProcessor.java
+++ b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/WatchProcessor.java
@@ -18,9 +18,10 @@
 package org.apache.ignite.internal.metastorage.server;
 
 import static java.util.concurrent.CompletableFuture.allOf;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static java.util.concurrent.CompletableFuture.supplyAsync;
+import static org.apache.ignite.internal.util.CompletableFutures.emptyListCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -69,7 +70,7 @@ public class WatchProcessor implements ManuallyCloseable {
      * <p>Since Watches are notified concurrently, this future is used to guarantee that no Watches get notified of a new revision,
      * until all Watches have finished processing the previous revision.
      */
-    private volatile CompletableFuture<Void> notificationFuture = completedFuture(null);
+    private volatile CompletableFuture<Void> notificationFuture = nullCompletedFuture();
 
     private final EntryReader entryReader;
 
@@ -169,7 +170,7 @@ public class WatchProcessor implements ManuallyCloseable {
 
     private static CompletableFuture<Void> notifyWatches(List<WatchAndEvents> watchAndEventsList, long revision, HybridTimestamp time) {
         if (watchAndEventsList.isEmpty()) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         CompletableFuture<?>[] notifyWatchFutures = new CompletableFuture[watchAndEventsList.size()];
@@ -209,7 +210,7 @@ public class WatchProcessor implements ManuallyCloseable {
 
     private CompletableFuture<List<WatchAndEvents>> collectWatchesAndEvents(List<Entry> updatedEntries, long revision) {
         if (watches.isEmpty()) {
-            return completedFuture(List.of());
+            return emptyListCompletedFuture();
         }
 
         return supplyAsync(() -> {
@@ -316,6 +317,6 @@ public class WatchProcessor implements ManuallyCloseable {
             futures.add(listener.onUpdated(newRevision));
         }
 
-        return futures.isEmpty() ? completedFuture(null) : allOf(futures.toArray(CompletableFuture[]::new));
+        return futures.isEmpty() ? nullCompletedFuture() : allOf(futures.toArray(CompletableFuture[]::new));
     }
 }
diff --git a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/BasicOperationsKeyValueStorageTest.java b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/BasicOperationsKeyValueStorageTest.java
index 6372ebb13a..def2336907 100644
--- a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/BasicOperationsKeyValueStorageTest.java
+++ b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/BasicOperationsKeyValueStorageTest.java
@@ -18,13 +18,13 @@
 package org.apache.ignite.internal.metastorage.server;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.function.Function.identity;
 import static org.apache.ignite.internal.metastorage.dsl.Operations.ops;
 import static org.apache.ignite.internal.metastorage.dsl.Operations.put;
 import static org.apache.ignite.internal.metastorage.dsl.Operations.remove;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -2082,7 +2082,7 @@ public abstract class BasicOperationsKeyValueStorageTest extends AbstractKeyValu
 
             @Override
             public CompletableFuture<Void> onRevisionApplied(WatchEvent event) {
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
 
@@ -2093,7 +2093,7 @@ public abstract class BasicOperationsKeyValueStorageTest extends AbstractKeyValu
             public CompletableFuture<Void> onUpdate(WatchEvent event) {
                 fut.complete(event.entryEvent().newEntry().value());
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             @Override
@@ -2407,11 +2407,11 @@ public abstract class BasicOperationsKeyValueStorageTest extends AbstractKeyValu
         WatchListener mockListener2 = mock(WatchListener.class);
         WatchListener mockListener3 = mock(WatchListener.class);
 
-        when(mockListener1.onUpdate(any())).thenReturn(completedFuture(null));
+        when(mockListener1.onUpdate(any())).thenReturn(nullCompletedFuture());
 
-        when(mockListener2.onUpdate(any())).thenReturn(completedFuture(null));
+        when(mockListener2.onUpdate(any())).thenReturn(nullCompletedFuture());
 
-        when(mockListener3.onUpdate(any())).thenReturn(completedFuture(null));
+        when(mockListener3.onUpdate(any())).thenReturn(nullCompletedFuture());
 
         var exception = new IllegalStateException();
 
@@ -2423,7 +2423,7 @@ public abstract class BasicOperationsKeyValueStorageTest extends AbstractKeyValu
 
         OnRevisionAppliedCallback mockCallback = mock(OnRevisionAppliedCallback.class);
 
-        when(mockCallback.onRevisionApplied(any())).thenReturn(completedFuture(null));
+        when(mockCallback.onRevisionApplied(any())).thenReturn(nullCompletedFuture());
 
         storage.startWatches(1, mockCallback);
 
@@ -2606,12 +2606,12 @@ public abstract class BasicOperationsKeyValueStorageTest extends AbstractKeyValu
                         resultFuture.complete(null);
                     }
 
-                    return completedFuture(null);
+                    return nullCompletedFuture();
                 } catch (Exception e) {
                     resultFuture.completeExceptionally(e);
                 }
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             @Override
@@ -2628,7 +2628,7 @@ public abstract class BasicOperationsKeyValueStorageTest extends AbstractKeyValu
 
             @Override
             public CompletableFuture<Void> onRevisionApplied(WatchEvent event) {
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
 
diff --git a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/WatchProcessorTest.java b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/WatchProcessorTest.java
index 3541be44af..498bff7880 100644
--- a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/WatchProcessorTest.java
+++ b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/WatchProcessorTest.java
@@ -18,9 +18,9 @@
 package org.apache.ignite.internal.metastorage.server;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrow;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsInAnyOrder;
 import static org.hamcrest.Matchers.is;
@@ -58,7 +58,7 @@ public class WatchProcessorTest extends BaseIgniteAbstractTest {
 
     @BeforeEach
     void setUp() {
-        when(revisionCallback.onRevisionApplied(any())).thenReturn(completedFuture(null));
+        when(revisionCallback.onRevisionApplied(any())).thenReturn(nullCompletedFuture());
 
         watchProcessor.setRevisionCallback(revisionCallback);
     }
@@ -184,7 +184,7 @@ public class WatchProcessorTest extends BaseIgniteAbstractTest {
         when(listener2.onUpdate(any()))
                 // Block the first call, the second call should work as usual.
                 .thenReturn(blockingFuture)
-                .thenReturn(completedFuture(null));
+                .thenReturn(nullCompletedFuture());
 
         watchProcessor.addWatch(new Watch(0, listener1, key -> Arrays.equals(key, "foo".getBytes(UTF_8))));
         watchProcessor.addWatch(new Watch(0, listener2, key -> Arrays.equals(key, "bar".getBytes(UTF_8))));
@@ -235,7 +235,7 @@ public class WatchProcessorTest extends BaseIgniteAbstractTest {
     private static WatchListener mockListener() {
         var listener = mock(WatchListener.class);
 
-        when(listener.onUpdate(any())).thenReturn(completedFuture(null));
+        when(listener.onUpdate(any())).thenReturn(nullCompletedFuture());
 
         return listener;
     }
diff --git a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/time/ClusterTimeTest.java b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/time/ClusterTimeTest.java
index 2ff6a5b564..547f9b6fe0 100644
--- a/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/time/ClusterTimeTest.java
+++ b/modules/metastorage/src/test/java/org/apache/ignite/internal/metastorage/server/time/ClusterTimeTest.java
@@ -17,9 +17,9 @@
 
 package org.apache.ignite.internal.metastorage.server.time;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrow;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertTimeout;
@@ -85,7 +85,7 @@ public class ClusterTimeTest extends BaseIgniteAbstractTest {
     void testIdleSafeTimeScheduler(@InjectConfiguration("mock.idleSyncTimeInterval=1") MetaStorageConfiguration config) {
         SyncTimeAction action = mock(SyncTimeAction.class);
 
-        when(action.syncTime(any())).thenReturn(completedFuture(null));
+        when(action.syncTime(any())).thenReturn(nullCompletedFuture());
 
         clusterTime.startSafeTimeScheduler(action, config);
 
@@ -96,7 +96,7 @@ public class ClusterTimeTest extends BaseIgniteAbstractTest {
     void testIdleSafeTimeSchedulerStop(@InjectConfiguration("mock.idleSyncTimeInterval=1") MetaStorageConfiguration config) {
         SyncTimeAction action = mock(SyncTimeAction.class);
 
-        when(action.syncTime(any())).thenReturn(completedFuture(null));
+        when(action.syncTime(any())).thenReturn(nullCompletedFuture());
 
         clusterTime.startSafeTimeScheduler(action, config);
 
@@ -118,7 +118,7 @@ public class ClusterTimeTest extends BaseIgniteAbstractTest {
 
         SyncTimeAction action = mock(SyncTimeAction.class);
 
-        when(action.syncTime(any())).thenReturn(completedFuture(null));
+        when(action.syncTime(any())).thenReturn(nullCompletedFuture());
 
         clusterTime.startSafeTimeScheduler(action, config);
 
diff --git a/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/MetricManager.java b/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/MetricManager.java
index 579d1ede9c..8df0eb3b93 100644
--- a/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/MetricManager.java
+++ b/modules/metrics/src/main/java/org/apache/ignite/internal/metrics/MetricManager.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.metrics;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
@@ -271,7 +273,7 @@ public class MetricManager implements IgniteComponent {
         public CompletableFuture<?> onCreate(ConfigurationNotificationEvent<ExporterView> ctx) {
             checkAndStartExporter(ctx.newValue().exporterName(), ctx.newValue());
 
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         }
 
         @Override
@@ -282,7 +284,7 @@ public class MetricManager implements IgniteComponent {
                 removed.stop();
             }
 
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         }
 
         @Override
@@ -293,7 +295,7 @@ public class MetricManager implements IgniteComponent {
                 exporter.reconfigure(ctx.newValue());
             }
 
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         }
     }
 }
diff --git a/modules/network/src/main/java/org/apache/ignite/internal/network/netty/NettyClient.java b/modules/network/src/main/java/org/apache/ignite/internal/network/netty/NettyClient.java
index 2748b3f4ea..27f113026a 100644
--- a/modules/network/src/main/java/org/apache/ignite/internal/network/netty/NettyClient.java
+++ b/modules/network/src/main/java/org/apache/ignite/internal/network/netty/NettyClient.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.network.netty;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+
 import io.netty.bootstrap.Bootstrap;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelInitializer;
@@ -36,6 +38,7 @@ import org.apache.ignite.internal.network.handshake.HandshakeManager;
 import org.apache.ignite.internal.network.serialization.PerSessionSerializationService;
 import org.apache.ignite.internal.network.serialization.SerializationService;
 import org.apache.ignite.internal.network.ssl.SslContextProvider;
+import org.apache.ignite.internal.util.CompletableFutures;
 import org.jetbrains.annotations.Nullable;
 
 /**
@@ -176,19 +179,19 @@ public class NettyClient {
     public CompletableFuture<Void> stop() {
         synchronized (startStopLock) {
             if (stopped) {
-                return CompletableFuture.completedFuture(null);
+                return nullCompletedFuture();
             }
 
             stopped = true;
 
             if (senderFuture == null) {
-                return CompletableFuture.completedFuture(null);
+                return nullCompletedFuture();
             }
 
             return channelFuture
                     .handle((sender, throwable) ->
                             channel == null
-                                    ? CompletableFuture.<Void>completedFuture(null) : NettyUtils.toCompletableFuture(channel.close()))
+                                    ? CompletableFutures.<Void>nullCompletedFuture() : NettyUtils.toCompletableFuture(channel.close()))
                     .thenCompose(Function.identity());
         }
     }
diff --git a/modules/network/src/main/java/org/apache/ignite/internal/network/netty/NettyServer.java b/modules/network/src/main/java/org/apache/ignite/internal/network/netty/NettyServer.java
index b912ffe9be..bb86d1de0e 100644
--- a/modules/network/src/main/java/org/apache/ignite/internal/network/netty/NettyServer.java
+++ b/modules/network/src/main/java/org/apache/ignite/internal/network/netty/NettyServer.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.network.netty;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+
 import io.netty.bootstrap.ServerBootstrap;
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelFuture;
@@ -36,6 +38,7 @@ import org.apache.ignite.internal.network.handshake.HandshakeManager;
 import org.apache.ignite.internal.network.serialization.PerSessionSerializationService;
 import org.apache.ignite.internal.network.serialization.SerializationService;
 import org.apache.ignite.internal.network.ssl.SslContextProvider;
+import org.apache.ignite.internal.util.CompletableFutures;
 import org.apache.ignite.network.NettyBootstrapFactory;
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.annotations.TestOnly;
@@ -162,7 +165,7 @@ public class NettyServer {
 
                                 return CompletableFuture.<Void>failedFuture(stopErr);
                             } else {
-                                return CompletableFuture.<Void>completedFuture(null);
+                                return CompletableFutures.<Void>nullCompletedFuture();
                             }
                         }
                     })
@@ -189,13 +192,13 @@ public class NettyServer {
     public CompletableFuture<Void> stop() {
         synchronized (startStopLock) {
             if (stopped) {
-                return CompletableFuture.completedFuture(null);
+                return nullCompletedFuture();
             }
 
             stopped = true;
 
             if (serverStartFuture == null) {
-                return CompletableFuture.completedFuture(null);
+                return nullCompletedFuture();
             }
 
             var serverCloseFuture0 = serverCloseFuture;
@@ -205,7 +208,7 @@ public class NettyServer {
                     channel.close();
                 }
 
-                return serverCloseFuture0 == null ? CompletableFuture.<Void>completedFuture(null) : serverCloseFuture0;
+                return serverCloseFuture0 == null ? CompletableFutures.<Void>nullCompletedFuture() : serverCloseFuture0;
             }).thenCompose(Function.identity());
         }
     }
diff --git a/modules/network/src/main/java/org/apache/ignite/network/DefaultMessagingService.java b/modules/network/src/main/java/org/apache/ignite/network/DefaultMessagingService.java
index b5f52fa336..0208cd1b0a 100644
--- a/modules/network/src/main/java/org/apache/ignite/network/DefaultMessagingService.java
+++ b/modules/network/src/main/java/org/apache/ignite/network/DefaultMessagingService.java
@@ -19,6 +19,7 @@ package org.apache.ignite.network;
 
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static org.apache.ignite.internal.network.serialization.PerSessionSerializationService.createClassDescriptorsMessages;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.network.NettyBootstrapFactory.isInNetworkThread;
 
 import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
@@ -202,7 +203,7 @@ public class DefaultMessagingService extends AbstractMessagingService {
 
         // TODO: IGNITE-18493 - remove/move this
         if (shouldDropMessage(recipient, msg)) {
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         }
 
         InetSocketAddress recipientAddress = new InetSocketAddress(recipient.address().host(), recipient.address().port());
@@ -214,7 +215,7 @@ public class DefaultMessagingService extends AbstractMessagingService {
                 sendToSelf(msg, null);
             }
 
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         }
 
         NetworkMessage message = correlationId != null ? responseFromMessage(msg, correlationId) : msg;
diff --git a/modules/network/src/test/java/org/apache/ignite/internal/network/recovery/VaultStateIdsTest.java b/modules/network/src/test/java/org/apache/ignite/internal/network/recovery/VaultStateIdsTest.java
index 5102f16f41..e0ed786b8a 100644
--- a/modules/network/src/test/java/org/apache/ignite/internal/network/recovery/VaultStateIdsTest.java
+++ b/modules/network/src/test/java/org/apache/ignite/internal/network/recovery/VaultStateIdsTest.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.network.recovery;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.util.concurrent.CompletableFuture.completedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.mockito.Mockito.any;
@@ -79,10 +80,10 @@ class VaultStateIdsTest extends BaseIgniteAbstractTest {
 
     @Test
     void savesNewStaleIdsToVault() {
-        doReturn(completedFuture(null)).when(vaultManager).get(staleIdsKey);
-        doReturn(completedFuture(null))
+        doReturn(nullCompletedFuture()).when(vaultManager).get(staleIdsKey);
+        doReturn(nullCompletedFuture())
                 .when(vaultManager).put(staleIdsKey, "id2".getBytes(UTF_8));
-        doReturn(completedFuture(null))
+        doReturn(nullCompletedFuture())
                 .when(vaultManager).put(staleIdsKey, "id2\nid1".getBytes(UTF_8));
 
         staleIds.markAsStale("id2");
@@ -93,7 +94,7 @@ class VaultStateIdsTest extends BaseIgniteAbstractTest {
     void respectsMaxIdsLimit() {
         staleIds = new VaultStateIds(vaultManager, 2);
 
-        doReturn(completedFuture(null)).when(vaultManager).get(staleIdsKey);
+        doReturn(nullCompletedFuture()).when(vaultManager).get(staleIdsKey);
 
         AtomicReference<String> lastSavedIds = new AtomicReference<>();
 
@@ -102,7 +103,7 @@ class VaultStateIdsTest extends BaseIgniteAbstractTest {
 
             lastSavedIds.set(new String(value, UTF_8));
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         }).when(vaultManager).put(eq(staleIdsKey), any());
 
         staleIds.markAsStale("id3");
@@ -116,7 +117,7 @@ class VaultStateIdsTest extends BaseIgniteAbstractTest {
     void loadsBeforeDoingFirstSave() {
         lenient().doReturn(completedFuture(new VaultEntry(staleIdsKey, "id1".getBytes(UTF_8))))
                 .when(vaultManager).get(staleIdsKey);
-        doReturn(completedFuture(null)).when(vaultManager).put(eq(staleIdsKey), any());
+        doReturn(nullCompletedFuture()).when(vaultManager).put(eq(staleIdsKey), any());
 
         staleIds.markAsStale("id2");
 
diff --git a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/Checkpointer.java b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/Checkpointer.java
index ddc5964660..091e8fdf12 100644
--- a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/Checkpointer.java
+++ b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/Checkpointer.java
@@ -19,12 +19,12 @@ package org.apache.ignite.internal.pagememory.persistence.checkpoint;
 
 import static java.lang.Math.max;
 import static java.lang.System.nanoTime;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.MINUTES;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 import static org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointReadWriteLock.CHECKPOINT_RUNNER_THREAD_PREFIX;
 import static org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointState.LOCK_TAKEN;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.FastTimestamps.coarseCurrentTimeMillis;
 import static org.apache.ignite.internal.util.IgniteUtils.safeAbs;
 import static org.apache.ignite.internal.util.IgniteUtils.shutdownAndAwaitTermination;
@@ -819,11 +819,11 @@ public class Checkpointer extends IgniteWorker {
         // If the checkpoint starts after this line, then the data region will already know that we want to destroy the partition, and when
         // reading the page for writing to the delta file, we will receive an "outdated" page that we will not write to disk.
         if (currentCheckpointProgress == null || !currentCheckpointProgress.inProgress()) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         CompletableFuture<Void> processedPartitionFuture = currentCheckpointProgress.getProcessedPartitionFuture(groupPartitionId);
 
-        return processedPartitionFuture == null ? completedFuture(null) : processedPartitionFuture;
+        return processedPartitionFuture == null ? nullCompletedFuture() : processedPartitionFuture;
     }
 }
diff --git a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/compaction/Compactor.java b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/compaction/Compactor.java
index 91cc705400..c73062101a 100644
--- a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/compaction/Compactor.java
+++ b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/compaction/Compactor.java
@@ -17,9 +17,9 @@
 
 package org.apache.ignite.internal.pagememory.persistence.compaction;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.stream.Collectors.toCollection;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
@@ -418,7 +418,7 @@ public class Compactor extends IgniteWorker {
     public CompletableFuture<Void> prepareToDestroyPartition(GroupPartitionId groupPartitionId) {
         CompletableFuture<Void> partitionProcessingFuture = partitionCompactionInProgressMap.getProcessedPartitionFuture(groupPartitionId);
 
-        return partitionProcessingFuture == null ? completedFuture(null) : partitionProcessingFuture;
+        return partitionProcessingFuture == null ? nullCompletedFuture() : partitionProcessingFuture;
     }
 
     private static ByteBuffer getThreadLocalBuffer(int pageSize) {
diff --git a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointPagesTest.java b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointPagesTest.java
index 3e6966c476..0a41d30b81 100644
--- a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointPagesTest.java
+++ b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointPagesTest.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.pagememory.persistence.checkpoint;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.instanceOf;
@@ -43,7 +43,7 @@ public class CheckpointPagesTest {
     void testContains() {
         CheckpointPages checkpointPages = new CheckpointPages(
                 Set.of(new FullPageId(0, 0), new FullPageId(1, 0)),
-                completedFuture(null)
+                nullCompletedFuture()
         );
 
         assertTrue(checkpointPages.contains(new FullPageId(0, 0)));
@@ -57,7 +57,7 @@ public class CheckpointPagesTest {
     void testSize() {
         CheckpointPages checkpointPages = new CheckpointPages(
                 Set.of(new FullPageId(0, 0), new FullPageId(1, 0)),
-                completedFuture(null)
+                nullCompletedFuture()
         );
 
         assertEquals(2, checkpointPages.size());
@@ -67,7 +67,7 @@ public class CheckpointPagesTest {
     void testMarkAsSaved() {
         CheckpointPages checkpointPages = new CheckpointPages(
                 new HashSet<>(Set.of(new FullPageId(0, 0), new FullPageId(1, 0), new FullPageId(2, 0))),
-                completedFuture(null)
+                nullCompletedFuture()
         );
 
         assertTrue(checkpointPages.markAsSaved(new FullPageId(0, 0)));
@@ -87,7 +87,7 @@ public class CheckpointPagesTest {
     void testAllowToSave() throws Exception {
         Set<FullPageId> pages = Set.of(new FullPageId(0, 0), new FullPageId(1, 0), new FullPageId(2, 0));
 
-        CheckpointPages checkpointPages = new CheckpointPages(pages, completedFuture(null));
+        CheckpointPages checkpointPages = new CheckpointPages(pages, nullCompletedFuture());
 
         assertTrue(checkpointPages.allowToSave(new FullPageId(0, 0)));
         assertTrue(checkpointPages.allowToSave(new FullPageId(1, 0)));
diff --git a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointWorkflowTest.java b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointWorkflowTest.java
index e6e1f6b5d6..7f670a4efa 100644
--- a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointWorkflowTest.java
+++ b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointWorkflowTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.pagememory.persistence.checkpoint;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static java.util.stream.Collectors.toList;
 import static org.apache.ignite.internal.pagememory.PageIdAllocator.FLAG_DATA;
@@ -37,6 +36,7 @@ import static org.apache.ignite.internal.pagememory.persistence.checkpoint.Check
 import static org.apache.ignite.internal.pagememory.util.PageIdUtils.pageId;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.runAsync;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.FastTimestamps.coarseCurrentTimeMillis;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.empty;
@@ -202,7 +202,7 @@ public class CheckpointWorkflowTest extends BaseIgniteAbstractTest {
 
         doNothing().when(progressImpl).currentCheckpointPagesCount(pagesCountArgumentCaptor.capture());
 
-        when(progressImpl.futureFor(PAGES_SORTED)).thenReturn(completedFuture(null));
+        when(progressImpl.futureFor(PAGES_SORTED)).thenReturn(nullCompletedFuture());
 
         UUID checkpointId = UUID.randomUUID();
 
diff --git a/modules/placement-driver-api/src/testFixtures/java/org/apache/ignite/internal/placementdriver/TestPlacementDriver.java b/modules/placement-driver-api/src/testFixtures/java/org/apache/ignite/internal/placementdriver/TestPlacementDriver.java
index 21be91c984..9fd5940041 100644
--- a/modules/placement-driver-api/src/testFixtures/java/org/apache/ignite/internal/placementdriver/TestPlacementDriver.java
+++ b/modules/placement-driver-api/src/testFixtures/java/org/apache/ignite/internal/placementdriver/TestPlacementDriver.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.placementdriver;
 
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
@@ -83,7 +84,7 @@ public class TestPlacementDriver extends AbstractEventProducer<PrimaryReplicaEve
 
     @Override
     public CompletableFuture<Void> previousPrimaryExpired(ReplicationGroupId grpId) {
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     @Override
diff --git a/modules/placement-driver/src/integrationTest/java/org/apache/ignite/internal/placementdriver/ActiveActorTest.java b/modules/placement-driver/src/integrationTest/java/org/apache/ignite/internal/placementdriver/ActiveActorTest.java
index 210dce87a1..e52c698c68 100644
--- a/modules/placement-driver/src/integrationTest/java/org/apache/ignite/internal/placementdriver/ActiveActorTest.java
+++ b/modules/placement-driver/src/integrationTest/java/org/apache/ignite/internal/placementdriver/ActiveActorTest.java
@@ -22,6 +22,7 @@ import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toSet;
 import static org.apache.ignite.internal.placementdriver.ActiveActorTest.TestReplicationGroup.GROUP_ID;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.waitForCondition;
+import static org.apache.ignite.internal.util.CompletableFutures.trueCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.closeAll;
 import static org.apache.ignite.utils.ClusterServiceTestUtils.clusterService;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -434,7 +435,7 @@ public class ActiveActorTest extends IgniteAbstractTest {
             int clientPort
     ) {
         when(msm.recoveryFinishedFuture()).thenReturn(completedFuture(0L));
-        when(msm.invoke(any(), any(Operation.class), any(Operation.class))).thenReturn(completedFuture(true));
+        when(msm.invoke(any(), any(Operation.class), any(Operation.class))).thenReturn(trueCompletedFuture());
         when(msm.getLocally(any(), anyLong())).then(invocation -> emptyMetastoreEntry());
 
         List<NetworkAddress> addresses = getNetworkAddresses(nodes);
diff --git a/modules/placement-driver/src/integrationTest/java/org/apache/ignite/internal/placementdriver/ItPrimaryReplicaChoiceTest.java b/modules/placement-driver/src/integrationTest/java/org/apache/ignite/internal/placementdriver/ItPrimaryReplicaChoiceTest.java
index b2919d082f..bcf7a588e6 100644
--- a/modules/placement-driver/src/integrationTest/java/org/apache/ignite/internal/placementdriver/ItPrimaryReplicaChoiceTest.java
+++ b/modules/placement-driver/src/integrationTest/java/org/apache/ignite/internal/placementdriver/ItPrimaryReplicaChoiceTest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.placementdriver;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.ignite.internal.SessionUtils.executeUpdate;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -91,7 +92,7 @@ public class ItPrimaryReplicaChoiceTest extends ClusterPerTestIntegrationTest {
         ignite.placementDriver().listen(PrimaryReplicaEvent.PRIMARY_REPLICA_EXPIRED, (evt, e) -> {
             primaryChanged.set(true);
 
-            return CompletableFuture.completedFuture(false);
+            return falseCompletedFuture();
         });
 
         NodeUtils.transferPrimary(tbl, null, this::node);
diff --git a/modules/placement-driver/src/integrationTest/java/org/apache/ignite/internal/placementdriver/PlacementDriverManagerTest.java b/modules/placement-driver/src/integrationTest/java/org/apache/ignite/internal/placementdriver/PlacementDriverManagerTest.java
index 6e4ed69be9..96eab0e3b1 100644
--- a/modules/placement-driver/src/integrationTest/java/org/apache/ignite/internal/placementdriver/PlacementDriverManagerTest.java
+++ b/modules/placement-driver/src/integrationTest/java/org/apache/ignite/internal/placementdriver/PlacementDriverManagerTest.java
@@ -25,6 +25,7 @@ import static org.apache.ignite.internal.placementdriver.PlacementDriverManager.
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.testNodeName;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.waitForCondition;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
 import static org.apache.ignite.internal.utils.RebalanceUtil.STABLE_ASSIGNMENTS_PREFIX;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -347,7 +348,7 @@ public class PlacementDriverManagerTest extends BasePlacementDriverTest {
 
             leaseExpired.set(true);
 
-            return CompletableFuture.completedFuture(false);
+            return falseCompletedFuture();
         });
 
         Lease lease1 = checkLeaseCreated(grpPart0, true);
diff --git a/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java b/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java
index a844bf42d4..bef4771218 100644
--- a/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java
+++ b/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/AssignmentsTracker.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.internal.placementdriver;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.StringUtils.incrementLastChar;
 import static org.apache.ignite.internal.utils.RebalanceUtil.STABLE_ASSIGNMENTS_PREFIX;
 
@@ -159,7 +159,7 @@ public class AssignmentsTracker {
                 triggerToRenewLeases();
             }
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         @Override
diff --git a/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/PlacementDriverManager.java b/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/PlacementDriverManager.java
index 1b2a82f707..842c74f57c 100644
--- a/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/PlacementDriverManager.java
+++ b/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/PlacementDriverManager.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.placementdriver;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLock;
 
 import java.util.Set;
@@ -141,7 +141,7 @@ public class PlacementDriverManager implements IgniteComponent {
                         String thisNodeName = clusterService.topologyService().localMember().name();
 
                         if (!placementDriverNodes.contains(thisNodeName)) {
-                            return completedFuture(null);
+                            return nullCompletedFuture();
                         }
 
                         try {
diff --git a/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/leases/LeaseTracker.java b/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/leases/LeaseTracker.java
index 0d1916c984..42d8e1c120 100644
--- a/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/leases/LeaseTracker.java
+++ b/modules/placement-driver/src/main/java/org/apache/ignite/internal/placementdriver/leases/LeaseTracker.java
@@ -29,6 +29,7 @@ import static org.apache.ignite.internal.placementdriver.event.PrimaryReplicaEve
 import static org.apache.ignite.internal.placementdriver.event.PrimaryReplicaEvent.PRIMARY_REPLICA_EXPIRED;
 import static org.apache.ignite.internal.placementdriver.leases.Lease.emptyLease;
 import static org.apache.ignite.internal.util.ArrayUtils.BYTE_EMPTY_ARRAY;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLock;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLockAsync;
 
@@ -131,7 +132,7 @@ public class LeaseTracker extends AbstractEventProducer<PrimaryReplicaEvent, Pri
 
     @Override
     public CompletableFuture<Void> previousPrimaryExpired(ReplicationGroupId grpId) {
-        return expirationFutureByGroup.getOrDefault(grpId, completedFuture(null));
+        return expirationFutureByGroup.getOrDefault(grpId, nullCompletedFuture());
     }
 
     /**
diff --git a/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseTrackerTest.java b/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseTrackerTest.java
index ca303ef5f4..e173cf5444 100644
--- a/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseTrackerTest.java
+++ b/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseTrackerTest.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.placementdriver;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.placementdriver.PlacementDriverManager.PLACEMENTDRIVER_LEASES_KEY;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
@@ -73,7 +73,7 @@ public class LeaseTrackerTest extends BaseIgniteAbstractTest {
         AtomicReference<PrimaryReplicaEventParameters> parametersRef = new AtomicReference<>();
         leaseTracker.listen(PrimaryReplicaEvent.PRIMARY_REPLICA_EXPIRED, (p, e) -> {
             parametersRef.set(p);
-            return completedFuture(false);
+            return falseCompletedFuture();
         });
 
         TablePartitionId partId0 = new TablePartitionId(0, 0);
diff --git a/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseUpdaterTest.java b/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseUpdaterTest.java
index 571ffee74d..300149ec0f 100644
--- a/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseUpdaterTest.java
+++ b/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/LeaseUpdaterTest.java
@@ -21,6 +21,7 @@ import static java.util.Collections.emptyMap;
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.stream.Collectors.toSet;
 import static org.apache.ignite.internal.util.ArrayUtils.BYTE_EMPTY_ARRAY;
+import static org.apache.ignite.internal.util.CompletableFutures.trueCompletedFuture;
 import static org.apache.ignite.internal.utils.RebalanceUtil.stablePartAssignmentsKey;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -132,7 +133,7 @@ public class LeaseUpdaterTest extends BaseIgniteAbstractTest {
                         leaseConsumer.accept(lease);
                     }
 
-                    return completedFuture(true);
+                    return trueCompletedFuture();
                 });
 
         leaseUpdater = new LeaseUpdater(
diff --git a/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/PlacementDriverTest.java b/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/PlacementDriverTest.java
index 855ad282be..b1dd5b98df 100644
--- a/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/PlacementDriverTest.java
+++ b/modules/placement-driver/src/test/java/org/apache/ignite/internal/placementdriver/PlacementDriverTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.placementdriver;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.ignite.internal.hlc.HybridTimestamp.CLOCK_SKEW;
 import static org.apache.ignite.internal.metastorage.dsl.Operations.noop;
@@ -30,6 +29,8 @@ import static org.apache.ignite.internal.testframework.matchers.CompletableFutur
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willSucceedFast;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.greaterThanOrEqualTo;
@@ -132,7 +133,7 @@ public class PlacementDriverTest extends BaseIgniteAbstractTest {
         metastore.registerRevisionUpdateListener(rev -> {
             revisionTracker.update(rev, null);
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         vault.start();
@@ -527,7 +528,7 @@ public class PlacementDriverTest extends BaseIgniteAbstractTest {
                 }
             }
 
-            return completedFuture(false);
+            return falseCompletedFuture();
         });
 
         return eventParametersFuture;
diff --git a/modules/raft/src/main/java/org/apache/ignite/raft/jraft/rpc/impl/AbstractClientService.java b/modules/raft/src/main/java/org/apache/ignite/raft/jraft/rpc/impl/AbstractClientService.java
index a2afe58770..0f09ee6629 100644
--- a/modules/raft/src/main/java/org/apache/ignite/raft/jraft/rpc/impl/AbstractClientService.java
+++ b/modules/raft/src/main/java/org/apache/ignite/raft/jraft/rpc/impl/AbstractClientService.java
@@ -16,7 +16,7 @@
  */
 package org.apache.ignite.raft.jraft.rpc.impl;
 
-import java.net.ConnectException;
+import static org.apache.ignite.internal.util.CompletableFutures.trueCompletedFuture;import java.net.ConnectException;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
@@ -133,7 +133,7 @@ public abstract class AbstractClientService implements ClientService, TopologyEv
 
         // Remote node is alive and pinged, safe to continue.
         if (readyConsistentIds.contains(peerId.getConsistentId())) {
-            return CompletableFuture.completedFuture(true);
+            return trueCompletedFuture();
         }
 
         final RpcRequests.PingRequest req = rpcOptions.getRaftMessagesFactory()
diff --git a/modules/raft/src/testFixtures/java/org/apache/ignite/internal/raft/service/ItAbstractListenerSnapshotTest.java b/modules/raft/src/testFixtures/java/org/apache/ignite/internal/raft/service/ItAbstractListenerSnapshotTest.java
index bfdf5fb537..272d44173b 100644
--- a/modules/raft/src/testFixtures/java/org/apache/ignite/internal/raft/service/ItAbstractListenerSnapshotTest.java
+++ b/modules/raft/src/testFixtures/java/org/apache/ignite/internal/raft/service/ItAbstractListenerSnapshotTest.java
@@ -23,6 +23,7 @@ import static org.apache.ignite.internal.raft.server.RaftGroupOptions.defaults;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.testNodeName;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.waitForCondition;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
@@ -217,7 +218,7 @@ public abstract class ItAbstractListenerSnapshotTest<T extends RaftGroupListener
                     if (service.leader() == null) {
                         return service.refreshLeader();
                     } else {
-                        return CompletableFuture.completedFuture(null);
+                        return nullCompletedFuture();
                     }
                 });
 
diff --git a/modules/replicator/src/integrationTest/java/org/apache/ignite/internal/replicator/ItPlacementDriverReplicaSideTest.java b/modules/replicator/src/integrationTest/java/org/apache/ignite/internal/replicator/ItPlacementDriverReplicaSideTest.java
index 1197b80612..004b57ba42 100644
--- a/modules/replicator/src/integrationTest/java/org/apache/ignite/internal/replicator/ItPlacementDriverReplicaSideTest.java
+++ b/modules/replicator/src/integrationTest/java/org/apache/ignite/internal/replicator/ItPlacementDriverReplicaSideTest.java
@@ -23,6 +23,7 @@ import static org.apache.ignite.internal.raft.PeersAndLearners.fromConsistentIds
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.testNodeName;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.waitForCondition;
 import static org.apache.ignite.internal.util.CollectionUtils.first;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -449,7 +450,7 @@ public class ItPlacementDriverReplicaSideTest extends IgniteAbstractTest {
 
                     replicaManager.startReplica(
                             groupId,
-                            completedFuture(null),
+                            nullCompletedFuture(),
                             (request, senderId) -> {
                                 log.info("Handle request [type={}]", request.getClass().getSimpleName());
 
diff --git a/modules/replicator/src/main/java/org/apache/ignite/internal/raft/client/TopologyAwareRaftGroupService.java b/modules/replicator/src/main/java/org/apache/ignite/internal/raft/client/TopologyAwareRaftGroupService.java
index 993a4da6ab..8225dbbcf7 100644
--- a/modules/replicator/src/main/java/org/apache/ignite/internal/raft/client/TopologyAwareRaftGroupService.java
+++ b/modules/replicator/src/main/java/org/apache/ignite/internal/raft/client/TopologyAwareRaftGroupService.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.raft.client;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -145,7 +147,7 @@ public class TopologyAwareRaftGroupService implements RaftGroupService {
                                                 }, executor);
                                     }
 
-                                    return CompletableFuture.completedFuture(null);
+                                    return nullCompletedFuture();
                                 }, executor);
                     }
                 }
@@ -297,7 +299,7 @@ public class TopologyAwareRaftGroupService implements RaftGroupService {
                         .subscribe(true)
                         .build());
             } else {
-                futs[i] = CompletableFuture.completedFuture(null);
+                futs[i] = nullCompletedFuture();
             }
         }
 
diff --git a/modules/replicator/src/test/java/org/apache/ignite/internal/replicator/PlacementDriverReplicaSideTest.java b/modules/replicator/src/test/java/org/apache/ignite/internal/replicator/PlacementDriverReplicaSideTest.java
index 810b701a53..4368d215fd 100644
--- a/modules/replicator/src/test/java/org/apache/ignite/internal/replicator/PlacementDriverReplicaSideTest.java
+++ b/modules/replicator/src/test/java/org/apache/ignite/internal/replicator/PlacementDriverReplicaSideTest.java
@@ -21,6 +21,7 @@ import static java.lang.System.currentTimeMillis;
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willSucceedIn;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -91,14 +92,14 @@ public class PlacementDriverReplicaSideTest extends BaseIgniteAbstractTest {
             LeaderElectionListener callback = invocationOnMock.getArgument(0);
             callbackHolder.set(callback);
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         when(raftClient.transferLeadership(any())).thenAnswer(invocationOnMock -> {
             Peer peer = invocationOnMock.getArgument(0);
             currentLeader = peer;
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         when(raftClient.readIndex()).thenAnswer(invocationOnMock -> {
@@ -112,7 +113,7 @@ public class PlacementDriverReplicaSideTest extends BaseIgniteAbstractTest {
 
         return new Replica(
                 GRP_ID,
-                completedFuture(null),
+                nullCompletedFuture(),
                 mock(ReplicaListener.class),
                 storageIndexTracker,
                 raftClient,
diff --git a/modules/replicator/src/test/java/org/apache/ignite/internal/replicator/ReplicaManagerTest.java b/modules/replicator/src/test/java/org/apache/ignite/internal/replicator/ReplicaManagerTest.java
index d149b7a55b..518d3b21db 100644
--- a/modules/replicator/src/test/java/org/apache/ignite/internal/replicator/ReplicaManagerTest.java
+++ b/modules/replicator/src/test/java/org/apache/ignite/internal/replicator/ReplicaManagerTest.java
@@ -18,12 +18,14 @@
 package org.apache.ignite.internal.replicator;
 
 import static java.util.concurrent.CompletableFuture.allOf;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.replicator.LocalReplicaEvent.AFTER_REPLICA_STARTED;
 import static org.apache.ignite.internal.replicator.LocalReplicaEvent.BEFORE_REPLICA_STOPPED;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.testNodeName;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.emptySetCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
@@ -79,7 +81,7 @@ public class ReplicaManagerTest extends BaseIgniteAbstractTest {
 
         when(topologyService.localMember()).thenReturn(new ClusterNodeImpl(nodeName, nodeName, new NetworkAddress("foo", 0)));
 
-        when(cmgManager.metaStorageNodes()).thenReturn(completedFuture(Set.of()));
+        when(cmgManager.metaStorageNodes()).thenReturn(emptySetCompletedFuture());
 
         var clock = new HybridClockImpl();
 
@@ -115,10 +117,10 @@ public class ReplicaManagerTest extends BaseIgniteAbstractTest {
             @Mock ReplicaListener replicaListener,
             @Mock TopologyAwareRaftGroupService raftGroupService
     ) throws NodeStoppingException {
-        when(raftGroupService.unsubscribeLeader()).thenReturn(completedFuture(null));
+        when(raftGroupService.unsubscribeLeader()).thenReturn(nullCompletedFuture());
 
-        when(createReplicaListener.notify(any(), any())).thenReturn(completedFuture(false));
-        when(removeReplicaListener.notify(any(), any())).thenReturn(completedFuture(false));
+        when(createReplicaListener.notify(any(), any())).thenReturn(falseCompletedFuture());
+        when(removeReplicaListener.notify(any(), any())).thenReturn(falseCompletedFuture());
 
         replicaManager.listen(AFTER_REPLICA_STARTED, createReplicaListener);
         replicaManager.listen(BEFORE_REPLICA_STOPPED, removeReplicaListener);
@@ -127,7 +129,7 @@ public class ReplicaManagerTest extends BaseIgniteAbstractTest {
 
         CompletableFuture<Replica> startReplicaFuture = replicaManager.startReplica(
                 groupId,
-                completedFuture(null),
+                nullCompletedFuture(),
                 replicaListener,
                 raftGroupService,
                 new PendingComparableValuesTracker<>(0L)
diff --git a/modules/rocksdb-common/src/main/java/org/apache/ignite/internal/rocksdb/flush/RocksDbFlushListener.java b/modules/rocksdb-common/src/main/java/org/apache/ignite/internal/rocksdb/flush/RocksDbFlushListener.java
index d709581827..ff38f3f1f9 100644
--- a/modules/rocksdb-common/src/main/java/org/apache/ignite/internal/rocksdb/flush/RocksDbFlushListener.java
+++ b/modules/rocksdb-common/src/main/java/org/apache/ignite/internal/rocksdb/flush/RocksDbFlushListener.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.rocksdb.flush;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.rocksdb.AbstractEventListener.EnabledEventCallback.ON_FLUSH_BEGIN;
 import static org.rocksdb.AbstractEventListener.EnabledEventCallback.ON_FLUSH_COMPLETED;
 
@@ -42,7 +43,7 @@ class RocksDbFlushListener extends AbstractEventListener {
     /**
      * Future that guarantees that last flush was fully processed and the new flush can safely begin.
      */
-    private volatile CompletableFuture<?> lastFlushProcessed = CompletableFuture.completedFuture(null);
+    private volatile CompletableFuture<?> lastFlushProcessed = nullCompletedFuture();
 
     /**
      * Constructor.
diff --git a/modules/rocksdb-common/src/main/java/org/apache/ignite/internal/rocksdb/flush/RocksDbFlusher.java b/modules/rocksdb-common/src/main/java/org/apache/ignite/internal/rocksdb/flush/RocksDbFlusher.java
index c139fde2f4..043fe36550 100644
--- a/modules/rocksdb-common/src/main/java/org/apache/ignite/internal/rocksdb/flush/RocksDbFlusher.java
+++ b/modules/rocksdb-common/src/main/java/org/apache/ignite/internal/rocksdb/flush/RocksDbFlusher.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.rocksdb.flush;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.SortedMap;
@@ -184,7 +186,7 @@ public class RocksDbFlusher {
 
         synchronized (latestPersistedSequenceNumberMux) {
             if (dbSequenceNumber <= latestPersistedSequenceNumber) {
-                return CompletableFuture.completedFuture(null);
+                return nullCompletedFuture();
             }
 
             future = flushFuturesBySequenceNumber.computeIfAbsent(dbSequenceNumber, s -> new CompletableFuture<>());
diff --git a/modules/runner/src/defaultsGenerator/java/org/apache/ignite/internal/configuration/generator/DefaultsGenerator.java b/modules/runner/src/defaultsGenerator/java/org/apache/ignite/internal/configuration/generator/DefaultsGenerator.java
index 0438336fa1..41de553fd8 100644
--- a/modules/runner/src/defaultsGenerator/java/org/apache/ignite/internal/configuration/generator/DefaultsGenerator.java
+++ b/modules/runner/src/defaultsGenerator/java/org/apache/ignite/internal/configuration/generator/DefaultsGenerator.java
@@ -17,10 +17,11 @@
 
 package org.apache.ignite.internal.configuration.generator;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.List;
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 import org.apache.ignite.configuration.ConfigurationModule;
 import org.apache.ignite.configuration.RootKey;
@@ -91,8 +92,7 @@ public class DefaultsGenerator {
         ConfigurationValidator configurationValidator =
                 ConfigurationValidatorImpl.withDefaultValidators(localConfigurationGenerator, modules.local().validators());
 
-        ConfigurationUpdateListener empty = (oldRoot, newRoot, storageRevision, notificationNumber) ->
-                CompletableFuture.completedFuture(null);
+        ConfigurationUpdateListener empty = (oldRoot, newRoot, storageRevision, notificationNumber) -> nullCompletedFuture();
 
         return new ConfigurationChanger(empty, modules.local().rootKeys(), storage, configurationValidator) {
             @Override
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/ItDistributedConfigurationPropertiesTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/ItDistributedConfigurationPropertiesTest.java
index 305c8b2213..67528ef82e 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/ItDistributedConfigurationPropertiesTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/ItDistributedConfigurationPropertiesTest.java
@@ -22,6 +22,7 @@ import static java.util.stream.Collectors.toUnmodifiableList;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.waitForCondition;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.nullValue;
@@ -206,7 +207,7 @@ public class ItDistributedConfigurationPropertiesTest extends BaseIgniteAbstract
                         if (receivesUpdates) {
                             return listener.onEntriesChanged(changedEntries);
                         } else {
-                            return CompletableFuture.completedFuture(null);
+                            return nullCompletedFuture();
                         }
                     });
                 }
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItDistributedConfigurationStorageTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItDistributedConfigurationStorageTest.java
index 6f8b8358ce..b4ba1fae03 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItDistributedConfigurationStorageTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/configuration/storage/ItDistributedConfigurationStorageTest.java
@@ -17,11 +17,11 @@
 
 package org.apache.ignite.internal.configuration.storage;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.testNodeName;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.waitForCondition;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -184,7 +184,7 @@ public class ItDistributedConfigurationStorageTest extends BaseIgniteAbstractTes
                     .forEach(IgniteComponent::start);
 
             // this is needed to avoid assertion errors
-            cfgStorage.registerConfigurationListener(changedEntries -> completedFuture(null));
+            cfgStorage.registerConfigurationListener(changedEntries -> nullCompletedFuture());
         }
 
         /**
diff --git a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
index f4e5110f22..11a81d45c8 100644
--- a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
+++ b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/runner/app/ItIgniteNodeRestartTest.java
@@ -17,11 +17,12 @@
 
 package org.apache.ignite.internal.runner.app;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.testNodeName;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willSucceedFast;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.trueCompletedFuture;
 import static org.apache.ignite.utils.ClusterServiceTestUtils.defaultSerializationRegistry;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -1273,10 +1274,10 @@ public class ItIgniteNodeRestartTest extends BaseIgniteRestartTest {
                 // That's our index.
                 latch.countDown();
 
-                return completedFuture(true);
+                return trueCompletedFuture();
             }
 
-            return completedFuture(false);
+            return falseCompletedFuture();
         }));
 
         assertTrue(latch.await(10, TimeUnit.SECONDS));
diff --git a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
index ca1f634f42..9bd157e530 100644
--- a/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
+++ b/modules/runner/src/main/java/org/apache/ignite/internal/app/IgniteImpl.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.app;
 
 import static java.util.concurrent.CompletableFuture.completedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import com.typesafe.config.Config;
 import com.typesafe.config.ConfigFactory;
@@ -1053,7 +1054,7 @@ public class IgniteImpl implements Ignite {
         return cfgStorage.localRevision()
                 .thenComposeAsync(appliedRevision -> {
                     if (appliedRevision != 0) {
-                        return completedFuture(null);
+                        return nullCompletedFuture();
                     } else {
                         return cmgMgr.initialClusterConfigurationFuture()
                                 .thenAcceptAsync(initialConfigHocon -> {
diff --git a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorage.java b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorage.java
index 8b0a2a8b89..b5c6bba418 100644
--- a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorage.java
+++ b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorage.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.configuration.storage;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.apache.ignite.internal.metastorage.dsl.Conditions.notExists;
 import static org.apache.ignite.internal.metastorage.dsl.Conditions.revision;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
 
 import java.io.Serializable;
 import java.util.Arrays;
@@ -236,7 +237,7 @@ public class DistributedConfigurationStorage implements ConfigurationStorage {
             // This means that curChangeId is less than version and other node has already updated configuration and
             // write should be retried. Actual version will be set when watch and corresponding configuration listener
             // updates configuration.
-            return CompletableFuture.completedFuture(false);
+            return falseCompletedFuture();
         }
 
         Set<Operation> operations = new HashSet<>();
diff --git a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalConfigurationStorage.java b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalConfigurationStorage.java
index bc478aab4a..52c636cd9f 100644
--- a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalConfigurationStorage.java
+++ b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalConfigurationStorage.java
@@ -20,6 +20,8 @@ package org.apache.ignite.internal.configuration.storage;
 import static java.util.concurrent.CompletableFuture.supplyAsync;
 import static org.apache.ignite.internal.configuration.util.ConfigurationSerializationUtil.fromBytes;
 import static org.apache.ignite.internal.configuration.util.ConfigurationSerializationUtil.toBytes;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.StringUtils.incrementLastChar;
 
 import java.io.Serializable;
@@ -77,7 +79,7 @@ public class LocalConfigurationStorage implements ConfigurationStorage {
      *
      * <p>Multi-threaded access is guarded by {@code writeSerializationLock}.
      */
-    private CompletableFuture<Void> writeSerializationFuture = CompletableFuture.completedFuture(null);
+    private CompletableFuture<Void> writeSerializationFuture = nullCompletedFuture();
 
     /** Lock for updating the reference to the {@code writeSerializationFuture}. */
     private final Object writeSerializationLock = new Object();
@@ -161,7 +163,7 @@ public class LocalConfigurationStorage implements ConfigurationStorage {
                     .thenCompose(v -> lastRevision())
                     .thenComposeAsync(version -> {
                         if (version != sentVersion) {
-                            return CompletableFuture.completedFuture(false);
+                            return falseCompletedFuture();
                         }
 
                         ConfigurationStorageListener lsnr = lsnrRef.get();
diff --git a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalFileConfigurationStorage.java b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalFileConfigurationStorage.java
index a3b1ac4b54..98d3ab6aaf 100644
--- a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalFileConfigurationStorage.java
+++ b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalFileConfigurationStorage.java
@@ -21,6 +21,8 @@ import static java.util.stream.Collectors.toMap;
 import static org.apache.ignite.internal.configuration.util.ConfigurationFlattener.createFlattenedUpdatesMap;
 import static org.apache.ignite.internal.configuration.util.ConfigurationUtil.fillFromPrefixMap;
 import static org.apache.ignite.internal.configuration.util.ConfigurationUtil.toPrefixMap;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.trueCompletedFuture;
 
 import com.typesafe.config.Config;
 import com.typesafe.config.ConfigException;
@@ -173,14 +175,14 @@ public class LocalFileConfigurationStorage implements ConfigurationStorage {
         lock.writeLock().lock();
         try {
             if (ver != lastRevision) {
-                return CompletableFuture.completedFuture(false);
+                return falseCompletedFuture();
             }
 
             mergeAndSave(newValues);
 
             sendNotificationAsync(new Data(newValues, lastRevision));
 
-            return CompletableFuture.completedFuture(true);
+            return trueCompletedFuture();
         } finally {
             lock.writeLock().unlock();
         }
diff --git a/modules/runner/src/test/java/org/apache/ignite/internal/configuration/storage/ConfigurationStorageTest.java b/modules/runner/src/test/java/org/apache/ignite/internal/configuration/storage/ConfigurationStorageTest.java
index 90dcd28131..2700529869 100644
--- a/modules/runner/src/test/java/org/apache/ignite/internal/configuration/storage/ConfigurationStorageTest.java
+++ b/modules/runner/src/test/java/org/apache/ignite/internal/configuration/storage/ConfigurationStorageTest.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.configuration.storage;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.anEmptyMap;
 import static org.hamcrest.Matchers.equalTo;
@@ -47,7 +47,7 @@ public abstract class ConfigurationStorageTest {
     void setUp() {
         storage = getStorage();
 
-        storage.registerConfigurationListener(changedEntries -> completedFuture(null));
+        storage.registerConfigurationListener(changedEntries -> nullCompletedFuture());
     }
 
     /**
diff --git a/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaManager.java b/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaManager.java
index 260dc9fa1e..555a80d36a 100644
--- a/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaManager.java
+++ b/modules/schema/src/main/java/org/apache/ignite/internal/schema/SchemaManager.java
@@ -24,6 +24,8 @@ import static java.util.stream.Collectors.toSet;
 import static org.apache.ignite.internal.metastorage.dsl.Conditions.notExists;
 import static org.apache.ignite.internal.metastorage.dsl.Operations.put;
 import static org.apache.ignite.internal.util.ByteUtils.intToBytes;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLock;
 import static org.apache.ignite.lang.ErrorGroups.Common.NODE_STOPPING_ERR;
 
@@ -150,7 +152,7 @@ public class SchemaManager implements IgniteComponent {
             int newSchemaVersion = tableDescriptor.tableVersion();
 
             if (searchSchemaByVersion(tableId, newSchemaVersion) != null) {
-                return completedFuture(false);
+                return falseCompletedFuture();
             }
 
             SchemaDescriptor newSchema = SchemaUtils.prepareSchemaDescriptor(tableDescriptor);
@@ -364,7 +366,7 @@ public class SchemaManager implements IgniteComponent {
                 .thenCompose(latestVersion -> {
                     if (latestVersion == null) {
                         // Nothing to remove.
-                        return completedFuture(null);
+                        return nullCompletedFuture();
                     }
 
                     Set<ByteArray> keysToRemove = IntStream.rangeClosed(CatalogTableDescriptor.INITIAL_TABLE_VERSION, latestVersion)
diff --git a/modules/security/src/main/java/org/apache/ignite/internal/security/authentication/AuthenticationManagerImpl.java b/modules/security/src/main/java/org/apache/ignite/internal/security/authentication/AuthenticationManagerImpl.java
index 3d371cd2a4..168ad6004a 100644
--- a/modules/security/src/main/java/org/apache/ignite/internal/security/authentication/AuthenticationManagerImpl.java
+++ b/modules/security/src/main/java/org/apache/ignite/internal/security/authentication/AuthenticationManagerImpl.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.security.authentication;
 
 import static org.apache.ignite.internal.security.authentication.event.EventType.AUTHENTICATION_DISABLED;
 import static org.apache.ignite.internal.security.authentication.event.EventType.AUTHENTICATION_ENABLED;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -96,7 +97,7 @@ public class AuthenticationManagerImpl implements AuthenticationManager {
             emitEvents(ctx);
         }
 
-        return CompletableFuture.completedFuture(null);
+        return nullCompletedFuture();
     }
 
     private boolean refreshProviders(@Nullable SecurityView view) {
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/api/SessionImpl.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/api/SessionImpl.java
index a9c6bc8ada..e3015f3a4f 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/api/SessionImpl.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/api/SessionImpl.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.sql.api;
 
 import static org.apache.ignite.internal.lang.SqlExceptionMapperUtil.mapToPublicSqlException;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.ExceptionUtils.sneakyThrow;
 import static org.apache.ignite.lang.ErrorGroups.Common.INTERNAL_ERR;
 import static org.apache.ignite.lang.ErrorGroups.Sql.SESSION_CLOSED_ERR;
@@ -49,7 +50,6 @@ import org.apache.ignite.internal.sql.engine.SqlQueryType;
 import org.apache.ignite.internal.sql.engine.property.Property;
 import org.apache.ignite.internal.sql.engine.property.SqlProperties;
 import org.apache.ignite.internal.sql.engine.property.SqlPropertiesHelper;
-import org.apache.ignite.internal.sql.engine.util.Commons;
 import org.apache.ignite.internal.tx.InternalTransaction;
 import org.apache.ignite.internal.util.ArrayUtils;
 import org.apache.ignite.internal.util.AsyncCursor;
@@ -299,7 +299,7 @@ public class SessionImpl implements AbstractSession {
                     .build();
 
             var counters = new LongArrayList(batch.size());
-            CompletableFuture<?> tail = CompletableFuture.completedFuture(null);
+            CompletableFuture<?> tail = nullCompletedFuture();
             ArrayList<CompletableFuture<?>> batchFuts = new ArrayList<>(batch.size());
 
             for (int i = 0; i < batch.size(); ++i) {
@@ -335,7 +335,7 @@ public class SessionImpl implements AbstractSession {
 
                                                     counters.add((long) page.items().get(0).get(0));
 
-                                                    return CompletableFuture.completedFuture(null);
+                                                    return nullCompletedFuture();
                                                 }).thenCompose(Function.identity());
                                     } finally {
                                         busyLock.leaveBusy();
@@ -462,7 +462,7 @@ public class SessionImpl implements AbstractSession {
         try {
             closeInternal();
 
-            return Commons.completedFuture();
+            return nullCompletedFuture();
         } catch (Exception e) {
             return CompletableFuture.failedFuture(mapToPublicSqlException(e));
         }
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/AsyncSqlCursorImpl.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/AsyncSqlCursorImpl.java
index 689ecbbd31..d3ef7b5ba0 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/AsyncSqlCursorImpl.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/AsyncSqlCursorImpl.java
@@ -17,13 +17,14 @@
 
 package org.apache.ignite.internal.sql.engine;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+
 import java.util.NoSuchElementException;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionException;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Function;
 import org.apache.ignite.internal.lang.SqlExceptionMapperUtil;
-import org.apache.ignite.internal.sql.engine.util.Commons;
 import org.apache.ignite.internal.util.AsyncCursor;
 import org.apache.ignite.internal.util.ExceptionUtils;
 import org.apache.ignite.sql.ResultSetMetadata;
@@ -109,7 +110,7 @@ public class AsyncSqlCursorImpl<T> implements AsyncSqlCursor<T> {
         return dataCursor.requestNextAsync(rows)
                 .thenApply(batch -> {
                     CompletableFuture<Void> fut = batch.hasMore()
-                            ? Commons.completedFuture()
+                            ? nullCompletedFuture()
                             : closeAsync();
 
                     return fut.thenApply(none -> batch);
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/QueryTransactionWrapper.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/QueryTransactionWrapper.java
index 4b8a5097e8..56d5dc91ef 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/QueryTransactionWrapper.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/QueryTransactionWrapper.java
@@ -17,8 +17,9 @@
 
 package org.apache.ignite.internal.sql.engine;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+
 import java.util.concurrent.CompletableFuture;
-import org.apache.ignite.internal.sql.engine.util.Commons;
 import org.apache.ignite.internal.tx.InternalTransaction;
 
 /**
@@ -49,7 +50,7 @@ public class QueryTransactionWrapper {
             return transaction.commitAsync();
         }
 
-        return Commons.completedFuture();
+        return nullCompletedFuture();
     }
 
     /**
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java
index 46c3a5b084..92bbf72921 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java
@@ -23,6 +23,7 @@ import static org.apache.ignite.internal.lang.SqlExceptionMapperUtil.mapToPublic
 import static org.apache.ignite.internal.sql.engine.util.Commons.FRAMEWORK_CONFIG;
 import static org.apache.ignite.internal.table.distributed.storage.InternalTableImpl.AWAIT_PRIMARY_REPLICA_TIMEOUT;
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.ExceptionUtils.withCause;
 import static org.apache.ignite.lang.ErrorGroups.Common.NODE_STOPPING_ERR;
 import static org.apache.ignite.lang.ErrorGroups.Replicator.REPLICA_UNAVAILABLE_ERR;
@@ -703,7 +704,7 @@ public class SqlQueryProcessor implements QueryProcessor {
         CompletableFuture<AsyncSqlCursor<List<Object>>> processNext() {
             if (statements == null) {
                 // TODO https://issues.apache.org/jira/browse/IGNITE-20463 Each tx control statement must return an empty cursor.
-                return CompletableFuture.completedFuture(null);
+                return nullCompletedFuture();
             }
 
             ScriptStatementParameters parameters = statements.poll();
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImpl.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImpl.java
index b9c952ad7d..2103cb0660 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImpl.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImpl.java
@@ -21,6 +21,7 @@ import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
 import static org.apache.ignite.internal.sql.engine.externalize.RelJsonReader.fromJson;
 import static org.apache.ignite.internal.sql.engine.util.Commons.FRAMEWORK_CONFIG;
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.lang.ErrorGroups.Common.INTERNAL_ERR;
 
 import com.github.benmanes.caffeine.cache.Caffeine;
@@ -286,7 +287,7 @@ public class ExecutionServiceImpl<RowT> implements ExecutionService, TopologyEve
         var mgr = queryManagerMap.get(qryId);
 
         if (mgr == null) {
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         }
 
         return mgr.close(true);
@@ -996,7 +997,7 @@ public class ExecutionServiceImpl<RowT> implements ExecutionService, TopologyEve
                 return node.closeAsync();
             }
 
-            return Commons.completedFuture();
+            return nullCompletedFuture();
         }
     }
 
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
index 1d97f8e20a..e5e6d4fdd1 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ddl/DdlCommandHandler.java
@@ -17,9 +17,9 @@
 
 package org.apache.ignite.internal.sql.engine.exec.ddl;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
 import static org.apache.ignite.lang.ErrorGroups.Sql.STMT_VALIDATION_ERR;
 
 import java.util.concurrent.CompletableFuture;
@@ -127,7 +127,7 @@ public class DdlCommandHandler {
     /** Handles add column command. */
     private CompletableFuture<Boolean> handleAlterAddColumn(AlterTableAddCommand cmd) {
         if (nullOrEmpty(cmd.columns())) {
-            return completedFuture(Boolean.FALSE);
+            return falseCompletedFuture();
         }
 
         return catalogManager.execute(DdlToCatalogCommandConverter.convert(cmd))
@@ -137,7 +137,7 @@ public class DdlCommandHandler {
     /** Handles drop column command. */
     private CompletableFuture<Boolean> handleAlterDropColumn(AlterTableDropCommand cmd) {
         if (nullOrEmpty(cmd.columns())) {
-            return completedFuture(Boolean.FALSE);
+            return falseCompletedFuture();
         }
 
         return catalogManager.execute(DdlToCatalogCommandConverter.convert(cmd))
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/message/MessageServiceImpl.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/message/MessageServiceImpl.java
index 5b24ff2adf..47edb21858 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/message/MessageServiceImpl.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/message/MessageServiceImpl.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.sql.engine.message;
 
 import static org.apache.ignite.internal.sql.engine.message.SqlQueryMessageGroup.GROUP_TYPE;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -72,14 +73,14 @@ public class MessageServiceImpl implements MessageService {
     @Override
     public CompletableFuture<Void> send(String nodeName, NetworkMessage msg) {
         if (!busyLock.enterBusy()) {
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         }
 
         try {
             if (localNodeName.equals(nodeName)) {
                 onMessage(nodeName, msg);
 
-                return CompletableFuture.completedFuture(null);
+                return nullCompletedFuture();
             } else {
                 return messagingSrvc.send(nodeName, ChannelType.DEFAULT, msg);
             }
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java
index b6889d32ed..cccdd82159 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.sql.engine.schema;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+
 import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
 import it.unimi.dsi.fastutil.objects.Object2IntMap;
@@ -52,7 +54,6 @@ import org.apache.ignite.internal.schema.DefaultValueGenerator;
 import org.apache.ignite.internal.sql.engine.schema.IgniteIndex.Type;
 import org.apache.ignite.internal.sql.engine.trait.IgniteDistribution;
 import org.apache.ignite.internal.sql.engine.trait.IgniteDistributions;
-import org.apache.ignite.internal.sql.engine.util.Commons;
 import org.apache.ignite.internal.sql.engine.util.cache.Cache;
 import org.apache.ignite.internal.sql.engine.util.cache.CacheFactory;
 import org.apache.ignite.lang.ErrorGroups.Common;
@@ -98,7 +99,7 @@ public class SqlSchemaManagerImpl implements SqlSchemaManager {
     public CompletableFuture<Void> schemaReadyFuture(int version) {
         // SqlSchemaManager creates SQL schema lazily on-demand, thus waiting for Catalog version is enough.
         if (catalogManager.latestCatalogVersion() >= version) {
-            return Commons.completedFuture();
+            return nullCompletedFuture();
         }
 
         return catalogManager.catalogReadyFuture(version);
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
index 950968be67..85bab1af85 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/Commons.java
@@ -46,7 +46,6 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 import java.util.UUID;
-import java.util.concurrent.CompletableFuture;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import org.apache.calcite.DataContexts;
@@ -117,8 +116,6 @@ import org.jetbrains.annotations.Nullable;
  * Utility methods.
  */
 public final class Commons {
-    private static final CompletableFuture<Void> COMPLETED_FUTURE = CompletableFuture.completedFuture(null);
-
     public static final String IMPLICIT_PK_COL_NAME = "__p_key";
 
     public static final int IN_BUFFER_SIZE = 512;
@@ -179,10 +176,6 @@ public final class Commons {
     private Commons() {
     }
 
-    public static CompletableFuture<Void> completedFuture() {
-        return COMPLETED_FUTURE;
-    }
-
     private static SqlTypeCoercionRule standardCompatibleCoercionRules() {
         return SqlTypeCoercionRule.instance(IgniteCustomAssigmentsRules.instance().getTypeMapping());
     }
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/api/SessionImplTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/api/SessionImplTest.java
index c6f255fb96..2fd2f9108f 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/api/SessionImplTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/api/SessionImplTest.java
@@ -17,8 +17,10 @@
 
 package org.apache.ignite.internal.sql.api;
 
+import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.sql.engine.util.SqlTestUtils.assertThrowsSqlException;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.lang.ErrorGroups.Common.INTERNAL_ERR;
 import static org.apache.ignite.lang.ErrorGroups.Sql.SESSION_CLOSED_ERR;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -117,10 +119,10 @@ class SessionImplTest extends BaseIgniteAbstractTest {
         AsyncSqlCursor<List<Object>> result = mock(AsyncSqlCursor.class);
 
         when(result.requestNextAsync(anyInt()))
-                .thenReturn(CompletableFuture.completedFuture(new BatchedResult<>(List.of(List.of(0L)), false)));
+                .thenReturn(completedFuture(new BatchedResult<>(List.of(List.of(0L)), false)));
 
         when(queryProcessor.querySingleAsync(any(), any(), any(), any(), any(Object[].class)))
-                .thenReturn(CompletableFuture.completedFuture(result));
+                .thenReturn(completedFuture(result));
 
         SessionImpl session = newSession(3);
 
@@ -157,12 +159,12 @@ class SessionImplTest extends BaseIgniteAbstractTest {
         AsyncSqlCursor<List<Object>> result = mock(AsyncSqlCursor.class);
 
         when(result.requestNextAsync(anyInt()))
-                .thenReturn(CompletableFuture.completedFuture(new BatchedResult<>(List.of(List.of(0L)), false)));
+                .thenReturn(completedFuture(new BatchedResult<>(List.of(List.of(0L)), false)));
         when(result.queryType())
                 .thenReturn(SqlQueryType.QUERY);
 
         when(queryProcessor.querySingleAsync(any(), any(), any(), any(), any(Object[].class)))
-                .thenReturn(CompletableFuture.completedFuture(result));
+                .thenReturn(completedFuture(result));
 
         SessionImpl session = newSession(3);
 
@@ -208,12 +210,12 @@ class SessionImplTest extends BaseIgniteAbstractTest {
         AsyncSqlCursor<List<Object>> result = mock(AsyncSqlCursor.class);
 
         when(result.requestNextAsync(anyInt()))
-                .thenReturn(CompletableFuture.completedFuture(new BatchedResult<>(List.of(List.of(0L)), true)));
+                .thenReturn(completedFuture(new BatchedResult<>(List.of(List.of(0L)), true)));
         when(result.closeAsync())
-                .thenReturn(CompletableFuture.completedFuture(null));
+                .thenReturn(nullCompletedFuture());
 
         when(queryProcessor.querySingleAsync(any(), any(), any(), any(), any(Object[].class)))
-                .thenReturn(CompletableFuture.completedFuture(result));
+                .thenReturn(completedFuture(result));
 
         SessionImpl session = newSession(3);
 
@@ -264,9 +266,9 @@ class SessionImplTest extends BaseIgniteAbstractTest {
         AsyncSqlCursor<List<Object>> dummyResult = mock(AsyncSqlCursor.class);
 
         when(dummyResult.requestNextAsync(anyInt()))
-                .thenReturn(CompletableFuture.completedFuture(new BatchedResult<>(List.of(List.of(0L)), false)));
+                .thenReturn(completedFuture(new BatchedResult<>(List.of(List.of(0L)), false)));
         when(dummyResult.closeAsync())
-                .thenReturn(CompletableFuture.completedFuture(null));
+                .thenReturn(nullCompletedFuture());
 
         CompletableFuture<AsyncSqlCursor<List<Object>>> cursorFuture = new CompletableFuture<>();
         CountDownLatch executeQueryLatch = new CountDownLatch(3);
@@ -275,7 +277,7 @@ class SessionImplTest extends BaseIgniteAbstractTest {
                     executeQueryLatch.countDown();
 
                     if (executeQueryLatch.getCount() > 0) {
-                        return CompletableFuture.completedFuture(dummyResult);
+                        return completedFuture(dummyResult);
                     }
 
                     return cursorFuture;
@@ -315,14 +317,14 @@ class SessionImplTest extends BaseIgniteAbstractTest {
         AtomicBoolean hasMore = new AtomicBoolean(true);
 
         when(result.requestNextAsync(anyInt()))
-                .thenAnswer(ignored -> CompletableFuture.completedFuture(new BatchedResult<>(List.of(List.of(0L)), hasMore.get())));
+                .thenAnswer(ignored -> completedFuture(new BatchedResult<>(List.of(List.of(0L)), hasMore.get())));
         when(result.queryType())
                 .thenReturn(SqlQueryType.QUERY);
         when(result.closeAsync())
-                .thenReturn(CompletableFuture.completedFuture(null));
+                .thenReturn(nullCompletedFuture());
 
         when(queryProcessor.querySingleAsync(any(), any(), any(), any(), any(Object[].class)))
-                .thenReturn(CompletableFuture.completedFuture(result));
+                .thenReturn(completedFuture(result));
 
         SessionImpl session = newSession(3);
 
@@ -349,14 +351,14 @@ class SessionImplTest extends BaseIgniteAbstractTest {
         AsyncSqlCursor<List<Object>> cursor2 = mock(AsyncSqlCursor.class, "cursor2");
 
         when(cursor1.hasNextResult()).thenReturn(true);
-        when(cursor1.nextResult()).thenReturn(CompletableFuture.completedFuture(cursor2));
-        when(cursor1.closeAsync()).thenReturn(CompletableFuture.completedFuture(null));
+        when(cursor1.nextResult()).thenReturn(completedFuture(cursor2));
+        when(cursor1.closeAsync()).thenReturn(nullCompletedFuture());
 
         when(cursor2.hasNextResult()).thenReturn(false);
-        when(cursor2.closeAsync()).thenReturn(CompletableFuture.completedFuture(null));
+        when(cursor2.closeAsync()).thenReturn(nullCompletedFuture());
 
         when(queryProcessor.queryScriptAsync(any(), any(), any(), any(), any(Object[].class)))
-                .thenReturn(CompletableFuture.completedFuture(cursor1));
+                .thenReturn(completedFuture(cursor1));
 
         SessionImpl session = newSession(3);
 
@@ -372,10 +374,10 @@ class SessionImplTest extends BaseIgniteAbstractTest {
 
         when(cursor1.hasNextResult()).thenReturn(true);
         when(cursor1.nextResult()).thenReturn(CompletableFuture.failedFuture(new RuntimeException("Broken")));
-        when(cursor1.closeAsync()).thenReturn(CompletableFuture.completedFuture(null));
+        when(cursor1.closeAsync()).thenReturn(nullCompletedFuture());
 
         when(queryProcessor.queryScriptAsync(any(), any(), any(), any(), any(Object[].class)))
-                .thenReturn(CompletableFuture.completedFuture(cursor1));
+                .thenReturn(completedFuture(cursor1));
 
         SessionImpl session = newSession(3);
 
@@ -394,14 +396,14 @@ class SessionImplTest extends BaseIgniteAbstractTest {
         AsyncSqlCursor<List<Object>> cursor2 = mock(AsyncSqlCursor.class, "cursor2");
 
         when(cursor1.hasNextResult()).thenReturn(true);
-        when(cursor1.nextResult()).thenReturn(CompletableFuture.completedFuture(cursor2));
+        when(cursor1.nextResult()).thenReturn(completedFuture(cursor2));
         when(cursor1.closeAsync()).thenReturn(CompletableFuture.failedFuture(new IllegalStateException("cursor1")));
 
         when(cursor2.hasNextResult()).thenReturn(false);
         when(cursor2.closeAsync()).thenReturn(CompletableFuture.failedFuture(new IllegalStateException("cursor2")));
 
         when(queryProcessor.queryScriptAsync(any(), any(), any(), any(), any(Object[].class)))
-                .thenReturn(CompletableFuture.completedFuture(cursor1));
+                .thenReturn(completedFuture(cursor1));
 
         SessionImpl session = newSession(3);
 
@@ -420,12 +422,12 @@ class SessionImplTest extends BaseIgniteAbstractTest {
 
         when(cursor1.hasNextResult()).thenReturn(true);
         when(cursor1.nextResult()).thenAnswer(ignored -> cursor2Fut);
-        when(cursor1.closeAsync()).thenReturn(CompletableFuture.completedFuture(null));
+        when(cursor1.closeAsync()).thenReturn(nullCompletedFuture());
 
-        when(cursor2.closeAsync()).thenReturn(CompletableFuture.completedFuture(null));
+        when(cursor2.closeAsync()).thenReturn(nullCompletedFuture());
 
         when(queryProcessor.queryScriptAsync(any(), any(), any(), any(), any(Object[].class)))
-                .thenReturn(CompletableFuture.completedFuture(cursor1));
+                .thenReturn(completedFuture(cursor1));
 
         SessionImpl session = newSession(3);
 
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
index 5cec90e7f4..4e1b6107ac 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ExecutionServiceImplTest.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.sql.engine.exec;
 
+import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.catalog.CatalogService.DEFAULT_SCHEMA_NAME;
 import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
 import static org.apache.ignite.internal.sql.engine.util.Commons.FRAMEWORK_CONFIG;
@@ -24,6 +25,7 @@ import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.waitForCondition;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrow;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willSucceedIn;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.lang.ErrorGroups.Common.NODE_LEFT_ERR;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsString;
@@ -316,7 +318,7 @@ public class ExecutionServiceImplTest extends BaseIgniteAbstractTest {
                 original.onMessage(nodeName, msg);
             }
 
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         });
 
         InternalTransaction tx = new NoOpTransaction(nodeNames.get(0));
@@ -499,11 +501,11 @@ public class ExecutionServiceImplTest extends BaseIgniteAbstractTest {
                     original.onMessage(senderNodeName, msg);
                 });
 
-                return CompletableFuture.completedFuture(null);
+                return nullCompletedFuture();
             } else {
                 original.onMessage(senderNodeName, msg);
 
-                return CompletableFuture.completedFuture(null);
+                return nullCompletedFuture();
             }
         }));
 
@@ -558,7 +560,7 @@ public class ExecutionServiceImplTest extends BaseIgniteAbstractTest {
                     original.onMessage(senderNodeName, msg);
                 });
 
-                return CompletableFuture.completedFuture(null);
+                return nullCompletedFuture();
             } else {
                 // On other nodes, simulate that the node has already gone.
                 return CompletableFuture.failedFuture(new NodeLeftException(node.nodeName));
@@ -685,7 +687,7 @@ public class ExecutionServiceImplTest extends BaseIgniteAbstractTest {
                 original.onMessage(nodeName, msg);
             }
 
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         });
 
         QueryPlan plan = prepare("SELECT * FROM test_tbl", ctx);
@@ -727,7 +729,7 @@ public class ExecutionServiceImplTest extends BaseIgniteAbstractTest {
 
         when(topologyService.localMember()).thenReturn(clusterNode);
 
-        when(schemaManagerMock.schemaReadyFuture(isA(int.class))).thenReturn(CompletableFuture.completedFuture(null));
+        when(schemaManagerMock.schemaReadyFuture(isA(int.class))).thenReturn(nullCompletedFuture());
 
         NoOpExecutableTableRegistry executableTableRegistry = new NoOpExecutableTableRegistry();
 
@@ -746,7 +748,7 @@ public class ExecutionServiceImplTest extends BaseIgniteAbstractTest {
                     return CompletableFuture.failedFuture(mappingException);
                 }
 
-                return CompletableFuture.completedFuture(factory.allOf(nodeNames));
+                return completedFuture(factory.allOf(nodeNames));
             }
 
             @Override
@@ -989,7 +991,7 @@ public class ExecutionServiceImplTest extends BaseIgniteAbstractTest {
 
                 original.onMessage(senderNodeName, message);
 
-                return CompletableFuture.completedFuture(null);
+                return nullCompletedFuture();
             }
         }
 
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DistributionZoneDdlCommandHandlerTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DistributionZoneDdlCommandHandlerTest.java
index 5533890f54..c52dc47390 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DistributionZoneDdlCommandHandlerTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ddl/DistributionZoneDdlCommandHandlerTest.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.sql.engine.exec.ddl;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
@@ -50,7 +50,7 @@ public class DistributionZoneDdlCommandHandlerTest extends IgniteAbstractTest {
 
     @BeforeEach
     void before() {
-        catalogManager = mock(CatalogManager.class, invocation -> completedFuture(null));
+        catalogManager = mock(CatalogManager.class, invocation -> nullCompletedFuture());
 
         commandHandler = new DdlCommandHandler(catalogManager);
     }
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ExchangeExecutionTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ExchangeExecutionTest.java
index c2100b174b..ee2fa36b38 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ExchangeExecutionTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ExchangeExecutionTest.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.sql.engine.exec.rel;
 
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.waitForCondition;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.everyItem;
@@ -655,7 +656,7 @@ public class ExchangeExecutionTest extends AbstractExecutionTest<Object[]> {
         @Override
         public CompletableFuture<Void> closeAsync() {
             // do nothing
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         }
 
         CompletableFuture<?> rewind() {
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ModifyNodeExecutionTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ModifyNodeExecutionTest.java
index 14fc811758..846615e61f 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ModifyNodeExecutionTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ModifyNodeExecutionTest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.sql.engine.exec.rel;
 import static org.apache.ignite.internal.sql.engine.exec.rel.AbstractNode.MODIFY_BATCH_SIZE;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrow;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.notNullValue;
@@ -84,7 +85,7 @@ public class ModifyNodeExecutionTest extends AbstractExecutionTest<RowWrapper> {
 
         if (sourceSize > 0) {
             when(updatableTable.insertAll(any(), any()))
-                    .thenReturn(CompletableFuture.completedFuture(null));
+                    .thenReturn(nullCompletedFuture());
         }
 
         context.execute(() -> modifyNode.request(1), modifyNode::onError);
@@ -117,7 +118,7 @@ public class ModifyNodeExecutionTest extends AbstractExecutionTest<RowWrapper> {
 
         if (sourceSize > 0) {
             when(updatableTable.upsertAll(any(), any()))
-                    .thenReturn(CompletableFuture.completedFuture(null));
+                    .thenReturn(nullCompletedFuture());
         }
 
         context.execute(() -> modifyNode.request(1), modifyNode::onError);
@@ -150,7 +151,7 @@ public class ModifyNodeExecutionTest extends AbstractExecutionTest<RowWrapper> {
 
         if (sourceSize > 0) {
             when(updatableTable.deleteAll(any(), any()))
-                    .thenReturn(CompletableFuture.completedFuture(null));
+                    .thenReturn(nullCompletedFuture());
         }
 
         context.execute(() -> modifyNode.request(1), modifyNode::onError);
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/ClusterServiceFactory.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/ClusterServiceFactory.java
index 9e04a26b0c..8759218f2d 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/ClusterServiceFactory.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/ClusterServiceFactory.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.sql.engine.framework;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
@@ -187,7 +189,7 @@ public class ClusterServiceFactory {
                 handler.onReceived(msg, localNodeName, null);
             }
 
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         }
 
         @Override
@@ -196,7 +198,7 @@ public class ClusterServiceFactory {
                 handler.onReceived(msg, localNodeName, null);
             }
 
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         }
 
         /** {@inheritDoc} */
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/PredefinedSchemaManager.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/PredefinedSchemaManager.java
index 2be85c6860..2486358fa5 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/PredefinedSchemaManager.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/PredefinedSchemaManager.java
@@ -17,9 +17,9 @@
 
 package org.apache.ignite.internal.sql.engine.framework;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.function.Function.identity;
 import static org.apache.ignite.internal.util.CollectionUtils.toIntMapCollector;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
@@ -82,7 +82,7 @@ public class PredefinedSchemaManager implements SqlSchemaManager {
     /** {@inheritDoc} */
     @Override
     public CompletableFuture<Void> schemaReadyFuture(int version) {
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     @Override
diff --git a/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/util/MvPartitionStorages.java b/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/util/MvPartitionStorages.java
index 13dbef5529..ec2d241e44 100644
--- a/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/util/MvPartitionStorages.java
+++ b/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/util/MvPartitionStorages.java
@@ -17,9 +17,9 @@
 
 package org.apache.ignite.internal.storage.util;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.function.Function.identity;
 import static java.util.stream.Collectors.toList;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -115,7 +115,7 @@ public class MvPartitionStorages<T extends MvPartitionStorage> {
 
         CompletableFuture<Void> destroyStorageFuture = storageOperation instanceof DestroyStorageOperation
                 ? ((DestroyStorageOperation) storageOperation).getDestroyFuture()
-                : completedFuture(null);
+                : nullCompletedFuture();
 
         return destroyStorageFuture.thenApply(unused -> {
             T newStorage = createStorageFunction.apply(partitionId);
@@ -153,7 +153,7 @@ public class MvPartitionStorages<T extends MvPartitionStorage> {
             return new DestroyStorageOperation();
         });
 
-        return completedFuture(null)
+        return nullCompletedFuture()
                 .thenCompose(unused -> destroyStorageFunction.apply(storageByPartitionId.getAndSet(partitionId, null)))
                 .whenComplete((unused, throwable) -> {
                     operationByPartitionId.compute(partitionId, (partId, operation) -> {
@@ -191,7 +191,7 @@ public class MvPartitionStorages<T extends MvPartitionStorage> {
             return new CleanupStorageOperation();
         });
 
-        return completedFuture(null)
+        return nullCompletedFuture()
                 .thenCompose(unused -> clearStorageFunction.apply(get(partitionId)))
                 .whenComplete((unused, throwable) ->
                         operationByPartitionId.compute(partitionId, (partId, operation) -> {
@@ -229,7 +229,7 @@ public class MvPartitionStorages<T extends MvPartitionStorage> {
                     return new StartRebalanceStorageOperation();
                 });
 
-        return completedFuture(null)
+        return nullCompletedFuture()
                 .thenCompose(unused -> {
                     CompletableFuture<Void> startRebalanceFuture = startRebalanceStorageFunction.apply(get(partitionId));
 
@@ -279,14 +279,14 @@ public class MvPartitionStorages<T extends MvPartitionStorage> {
         });
 
         CompletableFuture<?> startRebalanceFuture = storageOperation instanceof StartRebalanceStorageOperation
-                ? ((StartRebalanceStorageOperation) storageOperation).getStartRebalanceFuture() : completedFuture(null);
+                ? ((StartRebalanceStorageOperation) storageOperation).getStartRebalanceFuture() : nullCompletedFuture();
 
         return startRebalanceFuture
                 .thenCompose(unused -> {
                     CompletableFuture<Void> rebalanceFuture = rebalanceFutureByPartitionId.remove(partitionId);
 
                     if (rebalanceFuture == null) {
-                        return completedFuture(null);
+                        return nullCompletedFuture();
                     }
 
                     return rebalanceFuture
@@ -327,7 +327,7 @@ public class MvPartitionStorages<T extends MvPartitionStorage> {
             return new FinishRebalanceStorageOperation();
         });
 
-        return completedFuture(null)
+        return nullCompletedFuture()
                 .thenCompose(unused -> {
                     CompletableFuture<Void> rebalanceFuture = rebalanceFutureByPartitionId.remove(partitionId);
 
diff --git a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/util/MvPartitionStoragesTest.java b/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/util/MvPartitionStoragesTest.java
index 799aa58fb4..5d600492cc 100644
--- a/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/util/MvPartitionStoragesTest.java
+++ b/modules/storage-api/src/test/java/org/apache/ignite/internal/storage/util/MvPartitionStoragesTest.java
@@ -17,13 +17,13 @@
 
 package org.apache.ignite.internal.storage.util;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrowsWithCause;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.runAsync;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrowFast;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willTimeoutFast;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.containsInAnyOrder;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -414,7 +414,7 @@ public class MvPartitionStoragesTest extends BaseIgniteAbstractTest {
         assertThat(mvPartitionStorages.abortRebalance(0, mvStorage -> {
             invokeAbortFunction.set(true);
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         }), willCompleteSuccessfully());
 
         assertFalse(invokeAbortFunction.get());
@@ -431,7 +431,7 @@ public class MvPartitionStoragesTest extends BaseIgniteAbstractTest {
         assertThat(mvPartitionStorages.abortRebalance(0, mvStorage -> {
             invokeAbortFunction.set(true);
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         }), willCompleteSuccessfully());
 
         assertTrue(invokeAbortFunction.get());
@@ -699,23 +699,23 @@ public class MvPartitionStoragesTest extends BaseIgniteAbstractTest {
     }
 
     private CompletableFuture<Void> destroyMvStorage(int partitionId) {
-        return mvPartitionStorages.destroy(partitionId, mvStorage -> completedFuture(null));
+        return mvPartitionStorages.destroy(partitionId, mvStorage -> nullCompletedFuture());
     }
 
     private CompletableFuture<Void> clearMvStorage(int partitionId) {
-        return mvPartitionStorages.clear(partitionId, mvStorage -> completedFuture(null));
+        return mvPartitionStorages.clear(partitionId, mvStorage -> nullCompletedFuture());
     }
 
     private CompletableFuture<Void> startRebalanceMvStorage(int partitionId) {
-        return mvPartitionStorages.startRebalance(partitionId, mvStorage -> completedFuture(null));
+        return mvPartitionStorages.startRebalance(partitionId, mvStorage -> nullCompletedFuture());
     }
 
     private CompletableFuture<Void> abortRebalanceMvStorage(int partitionId) {
-        return mvPartitionStorages.abortRebalance(partitionId, mvStorage -> completedFuture(null));
+        return mvPartitionStorages.abortRebalance(partitionId, mvStorage -> nullCompletedFuture());
     }
 
     private CompletableFuture<Void> finishRebalanceMvStorage(int partitionId) {
-        return mvPartitionStorages.finishRebalance(partitionId, mvStorage -> completedFuture(null));
+        return mvPartitionStorages.finishRebalance(partitionId, mvStorage -> nullCompletedFuture());
     }
 
     private int getPartitionIdOutOfConfig() {
diff --git a/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/impl/TestMvPartitionStorage.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/impl/TestMvPartitionStorage.java
index a0ae1201e1..3c1dcc56ea 100644
--- a/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/impl/TestMvPartitionStorage.java
+++ b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/impl/TestMvPartitionStorage.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.storage.impl;
 
 import static java.util.Comparator.comparing;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.Arrays;
 import java.util.Iterator;
@@ -157,7 +158,7 @@ public class TestMvPartitionStorage implements MvPartitionStorage {
     public CompletableFuture<Void> flush() {
         checkStorageClosed();
 
-        return CompletableFuture.completedFuture(null);
+        return nullCompletedFuture();
     }
 
     @Override
diff --git a/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/impl/TestMvTableStorage.java b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/impl/TestMvTableStorage.java
index 40041253cb..8f76e8b0db 100644
--- a/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/impl/TestMvTableStorage.java
+++ b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/impl/TestMvTableStorage.java
@@ -18,8 +18,8 @@
 package org.apache.ignite.internal.storage.impl;
 
 import static java.util.concurrent.CompletableFuture.allOf;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.storage.util.StorageUtils.createMissingMvPartitionErrorMessage;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.mockito.Mockito.spy;
 
 import java.util.Map;
@@ -142,7 +142,7 @@ public class TestMvTableStorage implements MvTableStorage {
             }
         }
 
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     @Override
@@ -187,7 +187,7 @@ public class TestMvTableStorage implements MvTableStorage {
             hashIndex.storageByPartitionId.values().forEach(HashIndexStorage::destroy);
         }
 
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     @Override
@@ -225,7 +225,7 @@ public class TestMvTableStorage implements MvTableStorage {
 
             testSortedIndexStorageStream(partitionId).forEach(TestSortedIndexStorage::startRebalance);
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
     }
 
@@ -238,7 +238,7 @@ public class TestMvTableStorage implements MvTableStorage {
 
             testSortedIndexStorageStream(partitionId).forEach(TestSortedIndexStorage::abortRebalance);
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
     }
 
@@ -256,7 +256,7 @@ public class TestMvTableStorage implements MvTableStorage {
 
             testSortedIndexStorageStream(partitionId).forEach(TestSortedIndexStorage::finishRebalance);
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
     }
 
@@ -268,7 +268,7 @@ public class TestMvTableStorage implements MvTableStorage {
             testHashIndexStorageStream(partitionId).forEach(TestHashIndexStorage::clear);
             testSortedIndexStorageStream(partitionId).forEach(TestSortedIndexStorage::clear);
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
     }
 
diff --git a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryTableStorage.java b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryTableStorage.java
index 2eb1d2777a..3101b10621 100644
--- a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryTableStorage.java
+++ b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryTableStorage.java
@@ -18,9 +18,9 @@
 package org.apache.ignite.internal.storage.pagememory;
 
 import static java.util.concurrent.CompletableFuture.allOf;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.storage.MvPartitionStorage.REBALANCE_IN_PROGRESS;
 import static org.apache.ignite.internal.storage.util.StorageUtils.createMissingMvPartitionErrorMessage;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLock;
 
 import java.util.List;
@@ -123,7 +123,7 @@ public abstract class AbstractPageMemoryTableStorage implements MvTableStorage {
     @Override
     public CompletableFuture<Void> destroy() {
         if (!stopGuard.compareAndSet(false, true)) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         busyLock.block();
@@ -269,7 +269,7 @@ public abstract class AbstractPageMemoryTableStorage implements MvTableStorage {
 
             mvPartitionStorage.completeRebalance();
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         }));
     }
 
diff --git a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java
index 47500fe0d0..f575326776 100644
--- a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java
+++ b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.storage.pagememory;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.storage.pagememory.configuration.schema.BasePageMemoryStorageEngineConfigurationSchema.DEFAULT_DATA_REGION_NAME;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.closeAll;
 
 import java.nio.file.Path;
@@ -160,7 +160,7 @@ public class PersistentPageMemoryStorageEngine implements StorageEngine {
             public CompletableFuture<?> onCreate(ConfigurationNotificationEvent<PersistentPageMemoryDataRegionView> ctx) {
                 addDataRegion(ctx.newName(PersistentPageMemoryDataRegionView.class));
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
     }
diff --git a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryStorageEngine.java b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryStorageEngine.java
index 0cd413e343..96914135d6 100644
--- a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryStorageEngine.java
+++ b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryStorageEngine.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.storage.pagememory;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.storage.pagememory.configuration.schema.BasePageMemoryStorageEngineConfigurationSchema.DEFAULT_DATA_REGION_NAME;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.closeAll;
 
 import java.util.Map;
@@ -99,7 +99,7 @@ public class VolatilePageMemoryStorageEngine implements StorageEngine {
             public CompletableFuture<?> onCreate(ConfigurationNotificationEvent<VolatilePageMemoryDataRegionView> ctx) {
                 addDataRegion(ctx.newName(VolatilePageMemoryDataRegionView.class));
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
 
diff --git a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryTableStorage.java b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryTableStorage.java
index fa8c179608..ce6680bbd0 100644
--- a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryTableStorage.java
+++ b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryTableStorage.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.storage.pagememory;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.pagememory.PageIdAllocator.FLAG_AUX;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicLong;
@@ -175,7 +175,7 @@ public class VolatilePageMemoryTableStorage extends AbstractPageMemoryTableStora
                 createGarbageCollectionTree(partitionId)
         );
 
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     @Override
@@ -188,6 +188,6 @@ public class VolatilePageMemoryTableStorage extends AbstractPageMemoryTableStora
         // we don't care when it finishes.
         volatilePartitionStorage.destroyStructures();
 
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 }
diff --git a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorage.java b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorage.java
index ed78f01a74..cdbd2922ae 100644
--- a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorage.java
+++ b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorage.java
@@ -17,10 +17,10 @@
 
 package org.apache.ignite.internal.storage.pagememory.mv;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.storage.util.StorageUtils.throwExceptionIfStorageNotInCleanupOrRebalancedState;
 import static org.apache.ignite.internal.storage.util.StorageUtils.throwExceptionIfStorageNotInProgressOfRebalance;
 import static org.apache.ignite.internal.storage.util.StorageUtils.throwExceptionIfStorageNotInRunnableOrRebalanceState;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.Arrays;
 import java.util.List;
@@ -124,7 +124,7 @@ public class VolatilePageMemoryMvPartitionStorage extends AbstractPageMemoryMvPa
         return busy(() -> {
             throwExceptionIfStorageNotInRunnableOrRebalanceState(state.get(), this::createStorageInfo);
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
     }
 
diff --git a/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbStorageEngine.java b/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbStorageEngine.java
index 7aa9127437..30187976f0 100644
--- a/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbStorageEngine.java
+++ b/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbStorageEngine.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.storage.rocksdb;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.storage.rocksdb.configuration.schema.RocksDbStorageEngineConfigurationSchema.DEFAULT_DATA_REGION_NAME;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.nio.file.Path;
 import java.util.Map;
@@ -133,7 +133,7 @@ public class RocksDbStorageEngine implements StorageEngine {
             public CompletableFuture<?> onCreate(ConfigurationNotificationEvent<RocksDbDataRegionView> ctx) {
                 registerDataRegion(ctx.newName(RocksDbDataRegionView.class));
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
     }
diff --git a/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbTableStorage.java b/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbTableStorage.java
index 5260f9d9c0..4c1a768183 100644
--- a/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbTableStorage.java
+++ b/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbTableStorage.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.internal.storage.rocksdb;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static java.util.stream.Collectors.toList;
 import static org.apache.ignite.internal.storage.rocksdb.RocksDbMetaStorage.PARTITION_CONF_PREFIX;
@@ -27,6 +26,7 @@ import static org.apache.ignite.internal.storage.rocksdb.RocksDbMetaStorage.crea
 import static org.apache.ignite.internal.storage.rocksdb.instance.SharedRocksDbInstance.DFLT_WRITE_OPTS;
 import static org.apache.ignite.internal.storage.util.StorageUtils.createMissingMvPartitionErrorMessage;
 import static org.apache.ignite.internal.util.ArrayUtils.BYTE_EMPTY_ARRAY;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLock;
 
 import java.util.ArrayList;
@@ -215,7 +215,7 @@ public class RocksDbTableStorage implements MvTableStorage {
         try {
             stop(true);
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         } catch (Throwable t) {
             return failedFuture(new StorageException("Failed to destroy RocksDB table storage: " + getTableId(), t));
         }
@@ -355,7 +355,7 @@ public class RocksDbTableStorage implements MvTableStorage {
             }
 
             if (hashIdx == null) {
-                return completedFuture(null);
+                return nullCompletedFuture();
             } else {
                 return awaitFlush(false);
             }
@@ -389,7 +389,7 @@ public class RocksDbTableStorage implements MvTableStorage {
 
                 rocksDb.db.write(DFLT_WRITE_OPTS, writeBatch);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             } catch (RocksDBException e) {
                 throw new StorageRebalanceException(
                         "Error when trying to start rebalancing storage: [{}]",
@@ -411,7 +411,7 @@ public class RocksDbTableStorage implements MvTableStorage {
 
                 rocksDb.db.write(DFLT_WRITE_OPTS, writeBatch);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             } catch (RocksDBException e) {
                 throw new StorageRebalanceException("Error when trying to abort rebalancing storage: [{}]",
                         e,
@@ -437,7 +437,7 @@ public class RocksDbTableStorage implements MvTableStorage {
 
                 rocksDb.db.write(DFLT_WRITE_OPTS, writeBatch);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             } catch (RocksDBException e) {
                 throw new StorageRebalanceException("Error when trying to finish rebalancing storage: [{}]",
                         e,
@@ -466,7 +466,7 @@ public class RocksDbTableStorage implements MvTableStorage {
 
                 rocksDb.db.write(DFLT_WRITE_OPTS, writeBatch);
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             } catch (RocksDBException e) {
                 throw new StorageException("Error when trying to cleanup storage: [{}]", e, mvPartitionStorage.createStorageInfo());
             } finally {
diff --git a/modules/system-view/src/test/java/org/apache/ignite/internal/systemview/SystemViewManagerTest.java b/modules/system-view/src/test/java/org/apache/ignite/internal/systemview/SystemViewManagerTest.java
index a738de0e66..85ab2db2ae 100644
--- a/modules/system-view/src/test/java/org/apache/ignite/internal/systemview/SystemViewManagerTest.java
+++ b/modules/system-view/src/test/java/org/apache/ignite/internal/systemview/SystemViewManagerTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.systemview;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static org.apache.ignite.internal.systemview.SystemViewManagerImpl.NODE_ATTRIBUTES_KEY;
 import static org.apache.ignite.internal.systemview.SystemViewManagerImpl.NODE_ATTRIBUTES_LIST_SEPARATOR;
@@ -26,6 +25,7 @@ import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrowFast;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willBe;
 import static org.apache.ignite.internal.util.CollectionUtils.first;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.SubscriptionUtils.fromIterable;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.aMapWithSize;
@@ -118,7 +118,7 @@ public class SystemViewManagerTest extends BaseIgniteAbstractTest {
 
     @Test
     public void startAfterStartFails() {
-        Mockito.when(catalog.execute(anyList())).thenReturn(completedFuture(null));
+        Mockito.when(catalog.execute(anyList())).thenReturn(nullCompletedFuture());
 
         viewMgr.register(() -> List.of(dummyView("test")));
 
@@ -145,7 +145,7 @@ public class SystemViewManagerTest extends BaseIgniteAbstractTest {
     public void registerAllColumnTypes(NativeTypeSpec typeSpec) {
         NativeType type = SchemaTestUtils.specToType(typeSpec);
 
-        Mockito.when(catalog.execute(anyList())).thenReturn(completedFuture(null));
+        Mockito.when(catalog.execute(anyList())).thenReturn(nullCompletedFuture());
 
         viewMgr.register(() -> List.of(dummyView("test", type)));
         viewMgr.start();
@@ -171,7 +171,7 @@ public class SystemViewManagerTest extends BaseIgniteAbstractTest {
 
     @Test
     public void nodeAttributesUpdatedAfterStart() {
-        Mockito.when(catalog.execute(anyList())).thenReturn(completedFuture(null));
+        Mockito.when(catalog.execute(anyList())).thenReturn(nullCompletedFuture());
 
         String name1 = "view1";
         String name2 = "view2";
@@ -248,7 +248,7 @@ public class SystemViewManagerTest extends BaseIgniteAbstractTest {
 
     @Test
     void viewScanTest() {
-        Mockito.when(catalog.execute(anyList())).thenReturn(completedFuture(null));
+        Mockito.when(catalog.execute(anyList())).thenReturn(nullCompletedFuture());
 
         String nodeView = "NODE_VIEW";
         String clusterView = "CLUSTER_VIEW";
diff --git a/modules/table/src/integrationTest/java/org/apache/ignite/distributed/ReplicaUnavailableTest.java b/modules/table/src/integrationTest/java/org/apache/ignite/distributed/ReplicaUnavailableTest.java
index fb426b44f1..7097010e69 100644
--- a/modules/table/src/integrationTest/java/org/apache/ignite/distributed/ReplicaUnavailableTest.java
+++ b/modules/table/src/integrationTest/java/org/apache/ignite/distributed/ReplicaUnavailableTest.java
@@ -23,6 +23,8 @@ import static org.apache.ignite.distributed.ItTxTestCluster.NODE_PORT_BASE;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrow;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willSucceedFast;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willSucceedIn;
+import static org.apache.ignite.internal.util.CompletableFutures.emptySetCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.ExceptionUtils.unwrapCause;
 import static org.apache.ignite.lang.ErrorGroups.Replicator.REPLICA_TIMEOUT_ERR;
 import static org.apache.ignite.raft.jraft.test.TestUtils.getLocalAddress;
@@ -117,7 +119,7 @@ public class ReplicaUnavailableTest extends IgniteAbstractTest {
         var cmgManager = mock(ClusterManagementGroupManager.class);
 
         // This test is run without Meta storage.
-        when(cmgManager.metaStorageNodes()).thenReturn(completedFuture(Set.of()));
+        when(cmgManager.metaStorageNodes()).thenReturn(emptySetCompletedFuture());
 
         replicaManager = new ReplicaManager(
                 NODE_NAME,
@@ -155,7 +157,7 @@ public class ReplicaUnavailableTest extends IgniteAbstractTest {
 
                         replicaManager.startReplica(
                                 tablePartitionId,
-                                completedFuture(null),
+                                nullCompletedFuture(),
                                 (request0, senderId) -> completedFuture(new ReplicaResult(replicaMessageFactory.replicaResponse()
                                         .result(5)
                                         .build(), null)),
diff --git a/modules/table/src/integrationTest/java/org/apache/ignite/internal/table/ItColocationTest.java b/modules/table/src/integrationTest/java/org/apache/ignite/internal/table/ItColocationTest.java
index 06a8447183..315ebdc105 100644
--- a/modules/table/src/integrationTest/java/org/apache/ignite/internal/table/ItColocationTest.java
+++ b/modules/table/src/integrationTest/java/org/apache/ignite/internal/table/ItColocationTest.java
@@ -21,6 +21,8 @@ import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.stream.Collectors.toMap;
 import static org.apache.ignite.internal.replicator.ReplicaManager.DEFAULT_IDLE_SAFE_TIME_PROPAGATION_PERIOD_MILLISECONDS;
 import static org.apache.ignite.internal.schema.SchemaTestUtils.specToType;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.trueCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.instanceOf;
 import static org.hamcrest.Matchers.is;
@@ -105,7 +107,6 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
-import org.mockito.Mockito;
 
 /**
  * Tests for data colocation.
@@ -142,11 +143,11 @@ public class ItColocationTest extends BaseIgniteAbstractTest {
     static void beforeAllTests() {
         ClusterNode clusterNode = DummyInternalTableImpl.LOCAL_NODE;
 
-        ClusterService clusterService = Mockito.mock(ClusterService.class, RETURNS_DEEP_STUBS);
+        ClusterService clusterService = mock(ClusterService.class, RETURNS_DEEP_STUBS);
         when(clusterService.messagingService()).thenReturn(mock(MessagingService.class));
         when(clusterService.topologyService().localMember()).thenReturn(clusterNode);
 
-        ReplicaService replicaService = Mockito.mock(ReplicaService.class, RETURNS_DEEP_STUBS);
+        ReplicaService replicaService = mock(ReplicaService.class, RETURNS_DEEP_STUBS);
 
         txManager = new TxManagerImpl(
                 clusterService,
@@ -165,7 +166,7 @@ public class ItColocationTest extends BaseIgniteAbstractTest {
                     Map<TablePartitionId, Long> enlistedGroups,
                     UUID txId
             ) {
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         };
         txManager.start();
@@ -176,7 +177,7 @@ public class ItColocationTest extends BaseIgniteAbstractTest {
         int tblId = 1;
 
         for (int i = 0; i < PARTS; ++i) {
-            RaftGroupService r = Mockito.mock(RaftGroupService.class);
+            RaftGroupService r = mock(RaftGroupService.class);
 
             final int part = i;
             doAnswer(invocation -> {
@@ -193,7 +194,7 @@ public class ItColocationTest extends BaseIgniteAbstractTest {
                             .map(uuid -> new NullBinaryRow())
                             .collect(Collectors.toList()));
                 } else {
-                    return completedFuture(true);
+                    return trueCompletedFuture();
                 }
             }).when(r).run(any());
 
@@ -258,7 +259,7 @@ public class ItColocationTest extends BaseIgniteAbstractTest {
                 PARTS,
                 name -> clusterNode,
                 txManager,
-                Mockito.mock(MvTableStorage.class),
+                mock(MvTableStorage.class),
                 new TestTxStateTableStorage(),
                 replicaService,
                 new HybridClockImpl(),
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/AbstractClientStreamerPartitionAwarenessProvider.java b/modules/table/src/main/java/org/apache/ignite/internal/table/AbstractClientStreamerPartitionAwarenessProvider.java
index 186a5382eb..3a988139cf 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/AbstractClientStreamerPartitionAwarenessProvider.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/AbstractClientStreamerPartitionAwarenessProvider.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.table;
 
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+
 import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.internal.schema.SchemaDescriptor;
 import org.apache.ignite.internal.schema.SchemaRegistry;
@@ -29,8 +31,6 @@ import org.apache.ignite.internal.util.IgniteUtils;
  * @param <T> Item type.
  */
 abstract class AbstractClientStreamerPartitionAwarenessProvider<T> implements StreamerPartitionAwarenessProvider<T, Integer> {
-    private static final CompletableFuture<Void> COMPLETED_FUTURE = CompletableFuture.completedFuture(null);
-
     private final SchemaRegistry schemaReg;
 
     private final int partitions;
@@ -51,6 +51,6 @@ abstract class AbstractClientStreamerPartitionAwarenessProvider<T> implements St
 
     @Override
     public CompletableFuture<Void> refreshAsync() {
-        return COMPLETED_FUTURE;
+        return nullCompletedFuture();
     }
 }
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/LowWatermark.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/LowWatermark.java
index 124a7c0d7a..38003303f9 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/LowWatermark.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/LowWatermark.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.internal.table.distributed;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLock;
 
 import java.util.concurrent.Executors;
@@ -115,7 +115,7 @@ public class LowWatermark implements ManuallyCloseable {
                         if (vaultEntry == null) {
                             scheduleUpdateLowWatermarkBusy();
 
-                            return completedFuture(null);
+                            return nullCompletedFuture();
                         }
 
                         HybridTimestamp lowWatermark = ByteUtils.fromBytes(vaultEntry.value());
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/PartitionMover.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/PartitionMover.java
index bb1e6d6219..2f65db6a7d 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/PartitionMover.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/PartitionMover.java
@@ -29,6 +29,7 @@ import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.internal.raft.PeersAndLearners;
 import org.apache.ignite.internal.raft.service.RaftGroupService;
+import org.apache.ignite.internal.util.CompletableFutures;
 import org.apache.ignite.internal.util.IgniteSpinBusyLock;
 
 /**
@@ -84,7 +85,7 @@ public class PartitionMover {
                                 return movePartition(peersAndLearners, term);
                             }
 
-                            return CompletableFuture.<Void>completedFuture(null);
+                            return CompletableFutures.<Void>nullCompletedFuture();
                         } finally {
                             busyLock.leaveBusy();
                         }
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/PartitionReplicatorNodeRecovery.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/PartitionReplicatorNodeRecovery.java
index 6f78b1a51f..a04956ff0a 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/PartitionReplicatorNodeRecovery.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/PartitionReplicatorNodeRecovery.java
@@ -21,6 +21,8 @@ import static java.util.concurrent.CompletableFuture.allOf;
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.function.Function.identity;
 import static java.util.stream.Collectors.toSet;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.trueCompletedFuture;
 
 import java.util.Arrays;
 import java.util.Collection;
@@ -148,7 +150,7 @@ class PartitionReplicatorNodeRecovery {
             return performGroupRecovery(tablePartitionId, newConfiguration, localMemberAssignment);
         }
 
-        return completedFuture(true);
+        return trueCompletedFuture();
     }
 
     private static boolean mightNeedGroupRecovery(InternalTable internalTable) {
@@ -222,7 +224,7 @@ class PartitionReplicatorNodeRecovery {
         }
 
         if (peerNodesByConsistentIds.size() >= peers.size()) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         CompletableFuture<Void> allPeersAreSeenInTopology = new CompletableFuture<>();
@@ -254,7 +256,7 @@ class PartitionReplicatorNodeRecovery {
         }
 
         if (peerNodesByConsistentIds.size() >= peers.size()) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         // TODO: remove the handler after https://issues.apache.org/jira/browse/IGNITE-14519 is implemented.
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
index 1f9cb970b6..14d2a59500 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java
@@ -30,6 +30,9 @@ import static org.apache.ignite.internal.causality.IncrementalVersionedValue.dep
 import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.partitionAssignments;
 import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.tableAssignments;
 import static org.apache.ignite.internal.metastorage.dsl.Operations.put;
+import static org.apache.ignite.internal.util.CompletableFutures.emptyListCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLock;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLockAsync;
 import static org.apache.ignite.internal.util.IgniteUtils.shutdownAndAwaitTermination;
@@ -162,6 +165,7 @@ import org.apache.ignite.internal.tx.storage.state.TxStateStorage;
 import org.apache.ignite.internal.tx.storage.state.TxStateTableStorage;
 import org.apache.ignite.internal.tx.storage.state.rocksdb.TxStateRocksDbTableStorage;
 import org.apache.ignite.internal.util.ByteUtils;
+import org.apache.ignite.internal.util.CompletableFutures;
 import org.apache.ignite.internal.util.Cursor;
 import org.apache.ignite.internal.util.IgniteSpinBusyLock;
 import org.apache.ignite.internal.util.IgniteUtils;
@@ -601,7 +605,7 @@ public class TableManager implements IgniteTablesInternal, IgniteComponent {
 
             dropTableLocally(causalityToken, tableDescriptor, zoneDescriptor);
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
     }
 
@@ -741,7 +745,7 @@ public class TableManager implements IgniteTablesInternal, IgniteComponent {
                         }
                     }), ioExecutor);
                 } else {
-                    startGroupFut = completedFuture(false);
+                    startGroupFut = falseCompletedFuture();
                 }
 
                 startGroupFut
@@ -1332,7 +1336,7 @@ public class TableManager implements IgniteTablesInternal, IgniteComponent {
                     Collection<CatalogTableDescriptor> tableDescriptors = catalogService.tables(catalogVersion);
 
                     if (tableDescriptors.isEmpty()) {
-                        return completedFuture(List.of());
+                        return emptyListCompletedFuture();
                     }
 
                     CompletableFuture<TableImpl>[] tableImplFutures = tableDescriptors.stream()
@@ -1431,7 +1435,7 @@ public class TableManager implements IgniteTablesInternal, IgniteComponent {
 
                         // Check if the table has been deleted.
                         if (catalogService.table(tableId, catalogVersion) == null) {
-                            return completedFuture(null);
+                            return nullCompletedFuture();
                         }
 
                         return tableAsyncInternalBusy(tableId);
@@ -1483,7 +1487,7 @@ public class TableManager implements IgniteTablesInternal, IgniteComponent {
 
                         // Check if the table has been deleted.
                         if (tableDescriptor == null) {
-                            return completedFuture(null);
+                            return nullCompletedFuture();
                         }
 
                         return tableAsyncInternalBusy(tableDescriptor.id());
@@ -1595,7 +1599,7 @@ public class TableManager implements IgniteTablesInternal, IgniteComponent {
 
     private CompletableFuture<Void> handleChangePendingAssignmentEvent(Entry pendingAssignmentsEntry, long revision) {
         if (pendingAssignmentsEntry.value() == null) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         int partId = extractPartitionNumber(pendingAssignmentsEntry.key());
@@ -1622,7 +1626,7 @@ public class TableManager implements IgniteTablesInternal, IgniteComponent {
                                 LOG.info("Skipping Pending Assignments update, because table {} does not exist", tblId);
                             }
 
-                            return CompletableFuture.<Void>completedFuture(null);
+                            return CompletableFutures.<Void>nullCompletedFuture();
                         }
 
                         return handleChangePendingAssignmentEvent(
@@ -1749,7 +1753,7 @@ public class TableManager implements IgniteTablesInternal, IgniteComponent {
                         }
                     }), ioExecutor);
         } else {
-            localServicesStartFuture = completedFuture(null);
+            localServicesStartFuture = nullCompletedFuture();
         }
 
         return localServicesStartFuture
@@ -1759,7 +1763,7 @@ public class TableManager implements IgniteTablesInternal, IgniteComponent {
                     return partGrpSvc.refreshAndGetLeaderWithTerm()
                             .thenCompose(leaderWithTerm -> {
                                 if (!isLocalPeer(leaderWithTerm.leader())) {
-                                    return completedFuture(null);
+                                    return nullCompletedFuture();
                                 }
 
                                 // run update of raft configuration if this node is a leader
@@ -1773,7 +1777,7 @@ public class TableManager implements IgniteTablesInternal, IgniteComponent {
                                             // Note that we start raft node before for the sake of the consistency in a starting and
                                             // stopping raft nodes.
                                             if (revision < latestPendingAssignmentsEntry.revision()) {
-                                                return completedFuture(null);
+                                                return nullCompletedFuture();
                                             }
 
                                             PeersAndLearners newConfiguration = configurationFromAssignments(pendingAssignments);
@@ -1978,14 +1982,14 @@ public class TableManager implements IgniteTablesInternal, IgniteComponent {
     protected CompletableFuture<Void> handleChangeStableAssignmentEvent(WatchEvent evt) {
         if (evt.entryEvents().stream().allMatch(e -> e.oldEntry().value() == null)) {
             // It's the initial write to table stable assignments on table create event.
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         if (!evt.single()) {
             // If there is not a single entry, then all entries must be tombstones (this happens after table drop).
             assert evt.entryEvents().stream().allMatch(entryEvent -> entryEvent.newEntry().tombstone()) : evt;
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         // here we can receive only update from the rebalance logic
@@ -1995,7 +1999,7 @@ public class TableManager implements IgniteTablesInternal, IgniteComponent {
         Entry stableAssignmentsWatchEvent = evt.entryEvent().newEntry();
 
         if (stableAssignmentsWatchEvent.value() == null) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         int partitionId = extractPartitionNumber(stableAssignmentsWatchEvent.key());
@@ -2063,7 +2067,7 @@ public class TableManager implements IgniteTablesInternal, IgniteComponent {
             stopReplicaFuture = replicaMgr.stopReplica(tablePartitionId);
         } catch (NodeStoppingException e) {
             // No-op.
-            stopReplicaFuture = completedFuture(false);
+            stopReplicaFuture = falseCompletedFuture();
         }
 
         return stopReplicaFuture
@@ -2081,7 +2085,7 @@ public class TableManager implements IgniteTablesInternal, IgniteComponent {
     private CompletableFuture<Void> destroyPartitionStorages(TablePartitionId tablePartitionId, TableImpl table) {
         // TODO: IGNITE-18703 Destroy raft log and meta
         if (table == null) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         InternalTable internalTable = table.internalTable();
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/gc/MvGc.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/gc/MvGc.java
index 6df997f768..6ad4b2905a 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/gc/MvGc.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/gc/MvGc.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.table.distributed.gc;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.thread.NamedThreadFactory.threadPrefix;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.shutdownAndAwaitTermination;
 
 import java.util.concurrent.CompletableFuture;
@@ -135,12 +135,12 @@ public class MvGc implements ManuallyCloseable {
             GcStorageHandler removed = storageHandlerByPartitionId.remove(tablePartitionId);
 
             if (removed == null) {
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             CompletableFuture<Void> gcInProgressFuture = removed.gcInProgressFuture.get();
 
-            return gcInProgressFuture == null ? completedFuture(null) : gcInProgressFuture;
+            return gcInProgressFuture == null ? nullCompletedFuture() : gcInProgressFuture;
         });
     }
 
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/snapshot/incoming/IncomingSnapshotCopier.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/snapshot/incoming/IncomingSnapshotCopier.java
index be713c7918..f5a7eed985 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/snapshot/incoming/IncomingSnapshotCopier.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/snapshot/incoming/IncomingSnapshotCopier.java
@@ -18,11 +18,11 @@
 package org.apache.ignite.internal.table.distributed.raft.snapshot.incoming;
 
 import static java.util.concurrent.CompletableFuture.anyOf;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static java.util.stream.Collectors.toList;
 import static org.apache.ignite.internal.hlc.HybridTimestamp.hybridTimestamp;
 import static org.apache.ignite.internal.table.distributed.schema.CatalogVersionSufficiency.isMetadataAvailableFor;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.List;
 import java.util.Objects;
@@ -148,7 +148,7 @@ public class IncomingSnapshotCopier extends SnapshotCopier {
             } else {
                 logMetadataInsufficiencyAndSetError();
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
 
@@ -156,7 +156,7 @@ public class IncomingSnapshotCopier extends SnapshotCopier {
             if (metadataSufficient) {
                 return rebalanceFuture.handle((unused, throwable) -> completeRebalance(throwable)).thenCompose(Function.identity());
             } else {
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
         });
     }
@@ -253,7 +253,7 @@ public class IncomingSnapshotCopier extends SnapshotCopier {
      */
     private CompletableFuture<?> loadSnapshotMeta(ClusterNode snapshotSender) {
         if (!busyLock.enterBusy()) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         try {
@@ -298,7 +298,7 @@ public class IncomingSnapshotCopier extends SnapshotCopier {
      */
     private CompletableFuture<?> loadSnapshotMvData(ClusterNode snapshotSender, Executor executor) {
         if (!busyLock.enterBusy()) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         try {
@@ -316,7 +316,7 @@ public class IncomingSnapshotCopier extends SnapshotCopier {
                     // Let's write all versions for the row ID.
                     for (int i = 0; i < entry.rowVersions().size(); i++) {
                         if (!busyLock.enterBusy()) {
-                            return completedFuture(null);
+                            return nullCompletedFuture();
                         }
 
                         try {
@@ -334,7 +334,7 @@ public class IncomingSnapshotCopier extends SnapshotCopier {
                             snapshotMvDataResponse.rows().size()
                     );
 
-                    return completedFuture(null);
+                    return nullCompletedFuture();
                 } else {
                     LOG.info(
                             "Copier has loaded a portion of multi-versioned data [{}, rows={}]",
@@ -356,7 +356,7 @@ public class IncomingSnapshotCopier extends SnapshotCopier {
      */
     private CompletableFuture<Void> loadSnapshotTxData(ClusterNode snapshotSender, Executor executor) {
         if (!busyLock.enterBusy()) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         try {
@@ -374,7 +374,7 @@ public class IncomingSnapshotCopier extends SnapshotCopier {
 
                 for (int i = 0; i < snapshotTxDataResponse.txMeta().size(); i++) {
                     if (!busyLock.enterBusy()) {
-                        return completedFuture(null);
+                        return nullCompletedFuture();
                     }
 
                     try {
@@ -394,7 +394,7 @@ public class IncomingSnapshotCopier extends SnapshotCopier {
                             snapshotTxDataResponse.txMeta().size()
                     );
 
-                    return completedFuture(null);
+                    return nullCompletedFuture();
                 } else {
                     LOG.info(
                             "Copier has loaded a portion of transaction meta [{}, metas={}]",
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replicator/PartitionReplicaListener.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replicator/PartitionReplicaListener.java
index 484b4ef97b..bf3541af87 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replicator/PartitionReplicaListener.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/replicator/PartitionReplicaListener.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.table.distributed.replicator;
 
-import static java.util.Collections.emptyList;
 import static java.util.Objects.requireNonNull;
 import static java.util.concurrent.CompletableFuture.allOf;
 import static java.util.concurrent.CompletableFuture.completedFuture;
@@ -33,6 +32,10 @@ import static org.apache.ignite.internal.tx.TxState.COMMITED;
 import static org.apache.ignite.internal.tx.TxState.PENDING;
 import static org.apache.ignite.internal.tx.TxState.isFinalState;
 import static org.apache.ignite.internal.util.CollectionUtils.nullOrEmpty;
+import static org.apache.ignite.internal.util.CompletableFutures.emptyCollectionCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.emptyListCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.ExceptionUtils.withCause;
 import static org.apache.ignite.internal.util.IgniteUtils.findAny;
 import static org.apache.ignite.internal.util.IgniteUtils.findFirst;
@@ -162,6 +165,7 @@ import org.apache.ignite.internal.tx.message.TxFinishReplicaRequest;
 import org.apache.ignite.internal.tx.message.TxRecoveryMessage;
 import org.apache.ignite.internal.tx.message.TxStateCommitPartitionRequest;
 import org.apache.ignite.internal.tx.storage.state.TxStateStorage;
+import org.apache.ignite.internal.util.CompletableFutures;
 import org.apache.ignite.internal.util.Cursor;
 import org.apache.ignite.internal.util.CursorUtils;
 import org.apache.ignite.internal.util.ExceptionUtils;
@@ -184,8 +188,6 @@ public class PartitionReplicaListener implements ReplicaListener {
 
     private static final int ATTEMPTS_TO_CLEANUP_REPLICA = 5;
 
-    private static final CompletableFuture<?> COMPLETED_EMPTY = completedFuture(null);
-
     /** Factory to create RAFT command messages. */
     private static final TableMessagesFactory MSG_FACTORY = new TableMessagesFactory();
 
@@ -345,7 +347,7 @@ public class PartitionReplicaListener implements ReplicaListener {
 
     private CompletableFuture<Boolean> onPrimaryElected(PrimaryReplicaEventParameters evt, @Nullable Throwable exception) {
         if (!localNode.name().equals(evt.leaseholder()) || !replicationGroupId.equals(evt.groupId())) {
-            return completedFuture(false);
+            return falseCompletedFuture();
         }
 
         List<CompletableFuture<?>> cleanupFutures = new ArrayList<>();
@@ -355,7 +357,7 @@ public class PartitionReplicaListener implements ReplicaListener {
         try {
             txs = txStateStorage.scan();
         } catch (IgniteInternalException e) {
-            return completedFuture(false);
+            return falseCompletedFuture();
         }
 
         for (IgniteBiTuple<UUID, TxMeta> tx : txs) {
@@ -382,7 +384,7 @@ public class PartitionReplicaListener implements ReplicaListener {
         // The future returned by this event handler can't wait for all cleanups because it's not necessary and it can block
         // meta storage notification thread for a while, preventing it from delivering further updates (including leases) and therefore
         // causing deadlock on primary replica waiting.
-        return completedFuture(false);
+        return falseCompletedFuture();
     }
 
     private CompletableFuture<?> durableCleanup(UUID txId, TxMeta txMeta) {
@@ -400,7 +402,7 @@ public class PartitionReplicaListener implements ReplicaListener {
                                 e, txId, replicationGroupId);
 
                         if (hasCause(e, null, NodeStoppingException.class)) {
-                            return completedFuture(null);
+                            return nullCompletedFuture();
                         } else {
                             return txManager.executeCleanupAsync(() -> durableCleanup(txId, txMeta));
                         }
@@ -422,7 +424,7 @@ public class PartitionReplicaListener implements ReplicaListener {
 
     private CompletableFuture<Boolean> onPrimaryExpired(PrimaryReplicaEventParameters evt, @Nullable Throwable exception) {
         if (!localNode.name().equals(evt.leaseholder()) || !replicationGroupId.equals(evt.groupId())) {
-            return completedFuture(false);
+            return falseCompletedFuture();
         }
 
         LOG.info("Primary replica expired [grp={}]", replicationGroupId);
@@ -516,13 +518,13 @@ public class PartitionReplicaListener implements ReplicaListener {
         boolean transactionAlreadyFinished = txMeta != null && isFinalState(txMeta.txState());
 
         if (transactionAlreadyFinished) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         LOG.info("Orphan transaction has to be aborted [tx={}].", txId);
 
         // TODO: IGNITE-20735 Implement initiate recovery handling logic.
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     /**
@@ -559,7 +561,7 @@ public class PartitionReplicaListener implements ReplicaListener {
         }
 
         if (opStartTs == null) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         return schemaSyncService.waitForMetadataCompleteness(opStartTs)
@@ -576,7 +578,7 @@ public class PartitionReplicaListener implements ReplicaListener {
      */
     private CompletableFuture<Void> validateSchemaMatch(ReplicaRequest request, @Nullable HybridTimestamp opTsIfDirectRo) {
         if (!(request instanceof SchemaVersionAwareReplicaRequest)) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         HybridTimestamp tsToWaitForSchema = getTxStartTimestamp(request);
@@ -585,7 +587,7 @@ public class PartitionReplicaListener implements ReplicaListener {
         }
 
         if (tsToWaitForSchema == null) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         HybridTimestamp finalTsToWaitForSchema = tsToWaitForSchema;
@@ -615,7 +617,7 @@ public class PartitionReplicaListener implements ReplicaListener {
             tsToWaitForSchema = opTsIfDirectRo;
         }
 
-        return tsToWaitForSchema == null ? completedFuture(null) : schemaSyncService.waitForMetadataCompleteness(tsToWaitForSchema);
+        return tsToWaitForSchema == null ? nullCompletedFuture() : schemaSyncService.waitForMetadataCompleteness(tsToWaitForSchema);
     }
 
     /**
@@ -701,7 +703,7 @@ public class PartitionReplicaListener implements ReplicaListener {
         } else if (request instanceof ReadWriteScanCloseReplicaRequest) {
             processScanCloseAction((ReadWriteScanCloseReplicaRequest) request);
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         } else if (request instanceof TxFinishReplicaRequest) {
             return processTxFinishAction((TxFinishReplicaRequest) request, senderId);
         } else if (request instanceof TxCleanupReplicaRequest) {
@@ -771,7 +773,7 @@ public class PartitionReplicaListener implements ReplicaListener {
 
         IgniteUuid cursorId = new IgniteUuid(txId, request.scanId());
 
-        CompletableFuture<Void> safeReadFuture = isPrimaryInTimestamp(isPrimary, readTimestamp) ? completedFuture(null)
+        CompletableFuture<Void> safeReadFuture = isPrimaryInTimestamp(isPrimary, readTimestamp) ? nullCompletedFuture()
                 : safeTime.waitFor(readTimestamp);
 
         if (request.indexToUse() != null) {
@@ -864,7 +866,7 @@ public class PartitionReplicaListener implements ReplicaListener {
     private CompletableFuture<List<BinaryRow>> retrieveExactEntriesUntilCursorEmpty(UUID txId, IgniteUuid cursorId, int count) {
         return retrieveExactEntriesUntilCursorEmpty(txId, null, cursorId, count).thenCompose(rows -> {
             if (nullOrEmpty(rows)) {
-                return completedFuture(emptyList());
+                return emptyListCompletedFuture();
             }
 
             CompletableFuture<?>[] futs = new CompletableFuture[rows.size()];
@@ -904,7 +906,7 @@ public class PartitionReplicaListener implements ReplicaListener {
                     format("Unknown single request [actionType={}]", request.requestType()));
         }
 
-        CompletableFuture<Void> safeReadFuture = isPrimaryInTimestamp(isPrimary, readTimestamp) ? completedFuture(null)
+        CompletableFuture<Void> safeReadFuture = isPrimaryInTimestamp(isPrimary, readTimestamp) ? nullCompletedFuture()
                 : safeTime.waitFor(request.readTimestamp());
 
         return safeReadFuture.thenCompose(unused -> resolveRowByPkForReadOnly(primaryKey, readTimestamp));
@@ -940,7 +942,7 @@ public class PartitionReplicaListener implements ReplicaListener {
                     format("Unknown single request [actionType={}]", request.requestType()));
         }
 
-        CompletableFuture<Void> safeReadFuture = isPrimaryInTimestamp(isPrimary, readTimestamp) ? completedFuture(null)
+        CompletableFuture<Void> safeReadFuture = isPrimaryInTimestamp(isPrimary, readTimestamp) ? nullCompletedFuture()
                 : safeTime.waitFor(request.readTimestamp());
 
         return safeReadFuture.thenCompose(unused -> {
@@ -975,7 +977,7 @@ public class PartitionReplicaListener implements ReplicaListener {
         requireNonNull(isPrimary);
 
         if (!isPrimary) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         CompletableFuture<Object> resultFuture = new CompletableFuture<>();
@@ -1261,7 +1263,7 @@ public class PartitionReplicaListener implements ReplicaListener {
             List<BinaryRow> result
     ) {
         if (result.size() >= batchSize || !cursor.hasNext()) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         IndexRow indexRow = cursor.next();
@@ -1301,13 +1303,13 @@ public class PartitionReplicaListener implements ReplicaListener {
             Predicate<IndexRow> isUpperBoundAchieved
     ) {
         if (result.size() == batchSize) { // Batch is full, exit loop.
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         return indexLocker.locksForScan(txId, indexCursor)
                 .thenCompose(currentRow -> { // Index row S lock
                     if (isUpperBoundAchieved.test(currentRow)) {
-                        return completedFuture(null); // End of range reached. Exit loop.
+                        return nullCompletedFuture(); // End of range reached. Exit loop.
                     }
 
                     RowId rowId = currentRow.rowId();
@@ -1357,7 +1359,7 @@ public class PartitionReplicaListener implements ReplicaListener {
             List<BinaryRow> result
     ) {
         if (result.size() >= batchSize || !indexCursor.hasNext()) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         RowId rowId = indexCursor.next();
@@ -1415,7 +1417,7 @@ public class PartitionReplicaListener implements ReplicaListener {
     private CompletableFuture<@Nullable TimedBinaryRow> resolvePlainReadResult(RowId rowId, UUID txId) {
         return resolvePlainReadResult(rowId, txId, null).thenCompose(row -> {
             if (row == null || row.binaryRow() == null) {
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             return schemaCompatValidator.validateBackwards(row.binaryRow().schemaVersion(), tableId(), txId)
@@ -1506,7 +1508,7 @@ public class PartitionReplicaListener implements ReplicaListener {
             // Even if the outcome is different (the transaction was aborted, but we want to commit it),
             // we return 'success' to be in alignment with common transaction handling.
             if (txMeta.locksReleased()) {
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             // The transaction is finished, but the locks are not released.
@@ -1554,7 +1556,7 @@ public class PartitionReplicaListener implements ReplicaListener {
     }
 
     private CompletableFuture<Void> cleanup(UUID txId, TxMeta txMeta) {
-        return cleanup(completedFuture(null), txMeta.enlistedPartitions(), txMeta.txState() == COMMITED, txMeta.commitTimestamp(), txId, 1);
+        return cleanup(nullCompletedFuture(), txMeta.enlistedPartitions(), txMeta.txState() == COMMITED, txMeta.commitTimestamp(), txId, 1);
     }
 
     // TODO https://issues.apache.org/jira/browse/IGNITE-20681 remove attempts count.
@@ -1599,7 +1601,7 @@ public class PartitionReplicaListener implements ReplicaListener {
                         return CompletableFuture.<Void>failedFuture(ex);
                     }
 
-                    return CompletableFuture.<Void>completedFuture(null);
+                    return CompletableFutures.<Void>nullCompletedFuture();
                 })
                 .thenCompose(Function.identity());
     }
@@ -1793,7 +1795,7 @@ public class PartitionReplicaListener implements ReplicaListener {
                 .exceptionally(e -> {
                     LOG.warn("Failed to complete transaction cleanup command [txId=" + transactionId + ']', e);
 
-                    return completedFuture(null);
+                    return nullCompletedFuture();
                 })
                 .thenApply(res -> null);
     }
@@ -1990,7 +1992,7 @@ public class PartitionReplicaListener implements ReplicaListener {
 
             // Nothing found in the storage, return null.
             if (writeIntents.isEmpty() && regularEntries.isEmpty()) {
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             if (writeIntents.isEmpty()) {
@@ -2134,7 +2136,7 @@ public class PartitionReplicaListener implements ReplicaListener {
 
                     deleteExactLockFuts[i] = resolveRowByPk(extractPk(searchRow), txId, (rowId, row, lastCommitTime) -> {
                         if (rowId == null) {
-                            return completedFuture(null);
+                            return nullCompletedFuture();
                         }
 
                         if (lastCommitTime != null) {
@@ -2352,7 +2354,7 @@ public class PartitionReplicaListener implements ReplicaListener {
                 for (int i = 0; i < primaryKeys.size(); i++) {
                     rowFuts[i] = resolveRowByPk(primaryKeys.get(i), txId, (rowId, row, lastCommitTime) -> {
                         if (rowId == null) {
-                            return completedFuture(null);
+                            return nullCompletedFuture();
                         }
 
                         return takeLocksForGet(rowId, txId)
@@ -2384,7 +2386,7 @@ public class PartitionReplicaListener implements ReplicaListener {
                 for (int i = 0; i < primaryKeys.size(); i++) {
                     rowIdLockFuts[i] = resolveRowByPk(primaryKeys.get(i), txId, (rowId, row, lastCommitTime) -> {
                         if (rowId == null) {
-                            return completedFuture(null);
+                            return nullCompletedFuture();
                         }
 
                         if (lastCommitTime != null) {
@@ -2823,7 +2825,7 @@ public class PartitionReplicaListener implements ReplicaListener {
                     return takeLocksForDeleteExact(searchRow, rowId, row, txId)
                             .thenCompose(validatedRowId -> {
                                 if (validatedRowId == null) {
-                                    return completedFuture(new ReplicaResult(false, request.full() ? null : completedFuture(null)));
+                                    return completedFuture(new ReplicaResult(false, request.full() ? null : nullCompletedFuture()));
                                 }
 
                                 return validateWriteAgainstSchemaAfterTakingLocks(request.transactionId())
@@ -3017,7 +3019,7 @@ public class PartitionReplicaListener implements ReplicaListener {
             case RW_GET: {
                 return resolveRowByPk(primaryKey, txId, (rowId, row, lastCommitTime) -> {
                     if (rowId == null) {
-                        return completedFuture(null);
+                        return nullCompletedFuture();
                     }
 
                     return takeLocksForGet(rowId, txId)
@@ -3052,7 +3054,7 @@ public class PartitionReplicaListener implements ReplicaListener {
             case RW_GET_AND_DELETE: {
                 return resolveRowByPk(primaryKey, txId, (rowId, row, lastCommitTime) -> {
                     if (rowId == null) {
-                        return completedFuture(null);
+                        return nullCompletedFuture();
                     }
 
                     return takeLocksForDelete(row, rowId, txId)
@@ -3089,7 +3091,7 @@ public class PartitionReplicaListener implements ReplicaListener {
      * @param <T> Type of the {@code result}.
      */
     private <T> CompletableFuture<T> awaitCleanup(@Nullable RowId rowId, T result) {
-        return (rowId == null ? COMPLETED_EMPTY : rowCleanupMap.getOrDefault(rowId, COMPLETED_EMPTY))
+        return (rowId == null ? nullCompletedFuture() : rowCleanupMap.getOrDefault(rowId, nullCompletedFuture()))
                 .thenApply(ignored -> result);
     }
 
@@ -3182,7 +3184,7 @@ public class PartitionReplicaListener implements ReplicaListener {
         Collection<IndexLocker> indexes = indexesLockers.get().values();
 
         if (nullOrEmpty(indexes)) {
-            return completedFuture(emptyList());
+            return emptyCollectionCompletedFuture();
         }
 
         CompletableFuture<Lock>[] locks = new CompletableFuture[indexes.size()];
@@ -3211,7 +3213,7 @@ public class PartitionReplicaListener implements ReplicaListener {
         Collection<IndexLocker> indexes = indexesLockers.get().values();
 
         if (nullOrEmpty(indexes)) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         CompletableFuture<?>[] locks = new CompletableFuture[indexes.size()];
@@ -3240,7 +3242,7 @@ public class PartitionReplicaListener implements ReplicaListener {
                                 .thenApply(exclusiveRowLock -> rowId);
                     }
 
-                    return completedFuture(null);
+                    return nullCompletedFuture();
                 });
     }
 
@@ -3347,7 +3349,7 @@ public class PartitionReplicaListener implements ReplicaListener {
                                 .thenApply(shortTermLocks -> new IgniteBiTuple<>(rowId, shortTermLocks));
                     }
 
-                    return completedFuture(null);
+                    return nullCompletedFuture();
                 });
     }
 
@@ -3389,13 +3391,13 @@ public class PartitionReplicaListener implements ReplicaListener {
                             ));
                         }
 
-                        return completedFuture(null);
+                        return nullCompletedFuture();
                     });
         } else if (request instanceof ReadOnlyReplicaRequest || request instanceof ReplicaSafeTimeSyncRequest) {
             return placementDriver.getPrimaryReplica(replicationGroupId, now)
                     .thenApply(primaryReplica -> (primaryReplica != null && isLocalPeer(primaryReplica.getLeaseholder())));
         } else {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
     }
 
@@ -3422,7 +3424,7 @@ public class PartitionReplicaListener implements ReplicaListener {
             Supplier<@Nullable TimedBinaryRow> lastCommitted
     ) {
         if (readResult == null) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         } else if (!readResult.isWriteIntent()) {
             return completedFuture(new TimedBinaryRow(readResult.binaryRow(), readResult.commitTimestamp()));
         } else {
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/storage/InternalTableImpl.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/storage/InternalTableImpl.java
index 92531ebf44..ed36b4836b 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/storage/InternalTableImpl.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/storage/InternalTableImpl.java
@@ -26,6 +26,8 @@ import static org.apache.ignite.internal.table.distributed.replicator.action.Req
 import static org.apache.ignite.internal.table.distributed.replicator.action.RequestType.RW_GET;
 import static org.apache.ignite.internal.table.distributed.replicator.action.RequestType.RW_GET_ALL;
 import static org.apache.ignite.internal.table.distributed.storage.RowBatch.allResultFutures;
+import static org.apache.ignite.internal.util.CompletableFutures.emptyListCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.ExceptionUtils.withCause;
 import static org.apache.ignite.lang.ErrorGroups.Common.INTERNAL_ERR;
 import static org.apache.ignite.lang.ErrorGroups.Replicator.REPLICA_UNAVAILABLE_ERR;
@@ -42,7 +44,6 @@ import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.BitSet;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -801,7 +802,7 @@ public class InternalTableImpl implements InternalTable {
     @Override
     public CompletableFuture<List<BinaryRow>> getAll(Collection<BinaryRowEx> keyRows, InternalTransaction tx) {
         if (CollectionUtils.nullOrEmpty(keyRows)) {
-            return completedFuture(Collections.emptyList());
+            return emptyListCompletedFuture();
         }
 
         if (tx == null && isSinglePartitionBatch(keyRows)) {
@@ -1831,7 +1832,7 @@ public class InternalTableImpl implements InternalTable {
                     return;
                 }
 
-                onClose.apply(commit, t == null ? completedFuture(null) : failedFuture(t)).handle((ignore, th) -> {
+                onClose.apply(commit, t == null ? nullCompletedFuture() : failedFuture(t)).handle((ignore, th) -> {
                     if (th != null) {
                         subscriber.onError(th);
                     } else {
diff --git a/modules/table/src/main/java/org/apache/ignite/internal/utils/RebalanceUtil.java b/modules/table/src/main/java/org/apache/ignite/internal/utils/RebalanceUtil.java
index 77781b2902..739c7ae447 100644
--- a/modules/table/src/main/java/org/apache/ignite/internal/utils/RebalanceUtil.java
+++ b/modules/table/src/main/java/org/apache/ignite/internal/utils/RebalanceUtil.java
@@ -26,6 +26,7 @@ import static org.apache.ignite.internal.metastorage.dsl.Operations.ops;
 import static org.apache.ignite.internal.metastorage.dsl.Operations.put;
 import static org.apache.ignite.internal.metastorage.dsl.Statements.iif;
 import static org.apache.ignite.internal.util.CollectionUtils.difference;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.nio.charset.StandardCharsets;
 import java.util.Collection;
@@ -218,7 +219,7 @@ public class RebalanceUtil {
                         return startPeerRemoval(partId, peerAssignment, metaStorageMgr);
                     }
 
-                    return CompletableFuture.completedFuture(null);
+                    return nullCompletedFuture();
                 });
     }
 
@@ -241,7 +242,7 @@ public class RebalanceUtil {
         Set<Assignment> switchReduce = ByteUtils.fromBytes(eventData);
 
         if (switchReduce.isEmpty()) {
-            return CompletableFuture.completedFuture(null);
+            return nullCompletedFuture();
         }
 
         Set<Assignment> assignments = AffinityUtils.calculateAssignmentForPartition(dataNodes, partId.partitionId(), replicas);
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/LowWatermarkTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/LowWatermarkTest.java
index 9edc260572..a625802438 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/LowWatermarkTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/LowWatermarkTest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.table.distributed;
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.table.distributed.LowWatermark.LOW_WATERMARK_VAULT_KEY;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willSucceedFast;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.lessThanOrEqualTo;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -89,7 +90,7 @@ public class LowWatermarkTest extends BaseIgniteAbstractTest {
     @Test
     void testStartWithEmptyVault() {
         // Let's check the start with no low watermark in vault.
-        when(vaultManager.get(LOW_WATERMARK_VAULT_KEY)).thenReturn(completedFuture(null));
+        when(vaultManager.get(LOW_WATERMARK_VAULT_KEY)).thenReturn(nullCompletedFuture());
 
         lowWatermark.start();
 
@@ -104,7 +105,7 @@ public class LowWatermarkTest extends BaseIgniteAbstractTest {
         when(vaultManager.get(LOW_WATERMARK_VAULT_KEY))
                 .thenReturn(completedFuture(new VaultEntry(LOW_WATERMARK_VAULT_KEY, ByteUtils.toBytes(lowWatermark))));
 
-        when(txManager.updateLowWatermark(any(HybridTimestamp.class))).thenReturn(completedFuture(null));
+        when(txManager.updateLowWatermark(any(HybridTimestamp.class))).thenReturn(nullCompletedFuture());
 
         this.lowWatermark.start();
 
@@ -130,9 +131,9 @@ public class LowWatermarkTest extends BaseIgniteAbstractTest {
 
         when(clock.now()).thenReturn(now);
 
-        when(txManager.updateLowWatermark(any(HybridTimestamp.class))).thenReturn(completedFuture(null));
+        when(txManager.updateLowWatermark(any(HybridTimestamp.class))).thenReturn(nullCompletedFuture());
 
-        when(vaultManager.put(any(ByteArray.class), any(byte[].class))).thenReturn(completedFuture(null));
+        when(vaultManager.put(any(ByteArray.class), any(byte[].class))).thenReturn(nullCompletedFuture());
 
         // Make a predictable candidate to make it easier to test.
         HybridTimestamp newLowWatermarkCandidate = lowWatermark.createNewLowWatermarkCandidate();
@@ -155,10 +156,10 @@ public class LowWatermarkTest extends BaseIgniteAbstractTest {
      */
     @Test
     void testUpdateWatermarkSequentially() throws Exception {
-        when(vaultManager.get(LOW_WATERMARK_VAULT_KEY)).thenReturn(completedFuture(null));
+        when(vaultManager.get(LOW_WATERMARK_VAULT_KEY)).thenReturn(nullCompletedFuture());
         assertThat(lowWatermarkConfig.updateFrequency().update(10L), willSucceedFast());
 
-        when(vaultManager.put(any(ByteArray.class), any(byte[].class))).thenReturn(completedFuture(null));
+        when(vaultManager.put(any(ByteArray.class), any(byte[].class))).thenReturn(nullCompletedFuture());
 
         CountDownLatch startGetAllReadOnlyTransactions = new CountDownLatch(3);
 
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/PartitionMoverTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/PartitionMoverTest.java
index 2d825b9359..b3dafea7bc 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/PartitionMoverTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/PartitionMoverTest.java
@@ -17,11 +17,11 @@
 
 package org.apache.ignite.internal.table.distributed;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrowsWithCause;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrowWithCauseOrSuppressed;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyLong;
@@ -63,7 +63,7 @@ class PartitionMoverTest extends BaseIgniteAbstractTest {
         when(raftService.changePeersAsync(any(), anyLong()))
                 .thenReturn(failedFuture(new RuntimeException()))
                 .thenReturn(failedFuture(new IOException()))
-                .thenReturn(completedFuture(null));
+                .thenReturn(nullCompletedFuture());
 
         var partitionMover = new PartitionMover(new IgniteSpinBusyLock(), () -> raftService);
 
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java
index 9d89362af9..c2725333c2 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.table.distributed;
 
-import static java.util.Collections.emptySet;
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.catalog.CatalogService.DEFAULT_SCHEMA_NAME;
 import static org.apache.ignite.internal.catalog.events.CatalogEvent.TABLE_CREATE;
@@ -25,6 +24,10 @@ import static org.apache.ignite.internal.catalog.events.CatalogEvent.TABLE_DROP;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrowsWithCause;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureExceptionMatcher.willThrow;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.emptySetCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.trueCompletedFuture;
 import static org.apache.ignite.sql.ColumnType.INT64;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -248,9 +251,9 @@ public class TableManagerTest extends IgniteAbstractTest {
 
         distributionZoneManager = mock(DistributionZoneManager.class);
 
-        when(distributionZoneManager.dataNodes(anyLong(), anyInt())).thenReturn(completedFuture(emptySet()));
+        when(distributionZoneManager.dataNodes(anyLong(), anyInt())).thenReturn(emptySetCompletedFuture());
 
-        when(replicaMgr.stopReplica(any())).thenReturn(completedFuture(true));
+        when(replicaMgr.stopReplica(any())).thenReturn(trueCompletedFuture());
 
         tblManagerFut = new CompletableFuture<>();
 
@@ -545,7 +548,7 @@ public class TableManagerTest extends IgniteAbstractTest {
         }
 
         doReturn(mock(PartitionTimestampCursor.class)).when(mvPartitionStorage).scan(any());
-        when(txStateStorage.clear()).thenReturn(completedFuture(null));
+        when(txStateStorage.clear()).thenReturn(nullCompletedFuture());
 
         when(msm.recoveryFinishedFuture()).thenReturn(completedFuture(1L));
 
@@ -553,7 +556,7 @@ public class TableManagerTest extends IgniteAbstractTest {
         createTableManager(tblManagerFut, (mvTableStorage) -> {
             doReturn(completedFuture(mvPartitionStorage)).when(mvTableStorage).createMvPartition(anyInt());
             doReturn(mvPartitionStorage).when(mvTableStorage).getMvPartition(anyInt());
-            doReturn(completedFuture(null)).when(mvTableStorage).clearPartition(anyInt());
+            doReturn(nullCompletedFuture()).when(mvTableStorage).clearPartition(anyInt());
         }, (txStateTableStorage) -> {
             doReturn(txStateStorage).when(txStateTableStorage).getOrCreateTxStateStorage(anyInt());
             doReturn(txStateStorage).when(txStateTableStorage).getTxStateStorage(anyInt());
@@ -585,9 +588,9 @@ public class TableManagerTest extends IgniteAbstractTest {
             subscriber.onComplete();
         });
 
-        when(msm.invoke(any(), any(Operation.class), any(Operation.class))).thenReturn(completedFuture(null));
-        when(msm.invoke(any(), any(List.class), any(List.class))).thenReturn(completedFuture(null));
-        when(msm.get(any())).thenReturn(completedFuture(null));
+        when(msm.invoke(any(), any(Operation.class), any(Operation.class))).thenReturn(nullCompletedFuture());
+        when(msm.invoke(any(), any(List.class), any(List.class))).thenReturn(nullCompletedFuture());
+        when(msm.get(any())).thenReturn(nullCompletedFuture());
 
         when(msm.recoveryFinishedFuture()).thenReturn(completedFuture(1L));
 
@@ -648,13 +651,13 @@ public class TableManagerTest extends IgniteAbstractTest {
             catalogManager.listen(TABLE_CREATE, (parameters, exception) -> {
                 phaser.arriveAndAwaitAdvance();
 
-                return completedFuture(false);
+                return falseCompletedFuture();
             });
 
             catalogManager.listen(TABLE_DROP, (parameters, exception) -> {
                 phaser.arriveAndAwaitAdvance();
 
-                return completedFuture(false);
+                return falseCompletedFuture();
             });
         }
 
@@ -688,8 +691,8 @@ public class TableManagerTest extends IgniteAbstractTest {
             Consumer<TxStateTableStorage> txStateTableStorageDecorator) {
         VaultManager vaultManager = mock(VaultManager.class);
 
-        when(vaultManager.get(any(ByteArray.class))).thenReturn(completedFuture(null));
-        when(vaultManager.put(any(ByteArray.class), any(byte[].class))).thenReturn(completedFuture(null));
+        when(vaultManager.get(any(ByteArray.class))).thenReturn(nullCompletedFuture());
+        when(vaultManager.put(any(ByteArray.class), any(byte[].class))).thenReturn(nullCompletedFuture());
 
         TableManager tableManager = new TableManager(
                 NODE_NAME,
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/raft/snapshot/incoming/IncomingSnapshotCopierTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/raft/snapshot/incoming/IncomingSnapshotCopierTest.java
index b0db857994..aecfec60cc 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/raft/snapshot/incoming/IncomingSnapshotCopierTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/raft/snapshot/incoming/IncomingSnapshotCopierTest.java
@@ -26,6 +26,7 @@ import static org.apache.ignite.internal.testframework.matchers.CompletableFutur
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willSucceedIn;
 import static org.apache.ignite.internal.tx.TxState.ABORTED;
 import static org.apache.ignite.internal.tx.TxState.COMMITED;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.IgniteUtils.shutdownAndAwaitTermination;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.empty;
@@ -162,9 +163,9 @@ public class IncomingSnapshotCopierTest extends BaseIgniteAbstractTest {
 
     @BeforeEach
     void setUp() {
-        when(mvGc.removeStorage(any(TablePartitionId.class))).then(invocation -> completedFuture(null));
+        when(mvGc.removeStorage(any(TablePartitionId.class))).then(invocation -> nullCompletedFuture());
 
-        when(catalogService.catalogReadyFuture(anyInt())).thenReturn(completedFuture(null));
+        when(catalogService.catalogReadyFuture(anyInt())).thenReturn(nullCompletedFuture());
     }
 
     @AfterEach
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/raft/snapshot/outgoing/SnapshotAwarePartitionDataStorageTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/raft/snapshot/outgoing/SnapshotAwarePartitionDataStorageTest.java
index 87b75fba1c..b90cdf3c15 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/raft/snapshot/outgoing/SnapshotAwarePartitionDataStorageTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/raft/snapshot/outgoing/SnapshotAwarePartitionDataStorageTest.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.table.distributed.raft.snapshot.outgoing;
 
 import static java.util.Collections.singletonList;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.sameInstance;
@@ -100,7 +101,7 @@ class SnapshotAwarePartitionDataStorageTest extends BaseIgniteAbstractTest {
 
     @Test
     void delegatesFlush() {
-        CompletableFuture<Void> future = CompletableFuture.completedFuture(null);
+        CompletableFuture<Void> future = nullCompletedFuture();
 
         when(partitionStorage.flush()).thenReturn(future);
 
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerDurableUnlockTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerDurableUnlockTest.java
index 82ae9feb38..28fc8e54ea 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerDurableUnlockTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerDurableUnlockTest.java
@@ -17,10 +17,10 @@
 
 package org.apache.ignite.internal.table.distributed.replication;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willSucceedIn;
 import static org.apache.ignite.internal.tx.TxState.isFinalState;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.greaterThan;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -99,14 +99,14 @@ public class PartitionReplicaListenerDurableUnlockTest extends IgniteAbstractTes
     /** Partition replication listener to test. */
     private PartitionReplicaListener partitionReplicaListener;
 
-    private BiFunction<UUID, TablePartitionId, CompletableFuture<Void>> cleanupCallback = (a, b) -> completedFuture(null);
+    private BiFunction<UUID, TablePartitionId, CompletableFuture<Void>> cleanupCallback = (a, b) -> nullCompletedFuture();
 
     @BeforeEach
     public void beforeTest() {
         doAnswer(invocation -> {
             Runnable r = invocation.getArgument(0);
             r.run();
-            return completedFuture(null);
+            return nullCompletedFuture();
         }).when(txManager).executeCleanupAsync(any(Runnable.class));
 
         doAnswer(invocation -> {
@@ -160,7 +160,7 @@ public class PartitionReplicaListenerDurableUnlockTest extends IgniteAbstractTes
         cleanupCallback = (tx, partId) -> {
             assertTrue(isFinalState(txStateStorage.get(tx).txState()));
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         };
 
         PrimaryReplicaEventParameters parameters = new PrimaryReplicaEventParameters(0, part0, LOCAL_NODE.name(), clock.now());
@@ -190,7 +190,7 @@ public class PartitionReplicaListenerDurableUnlockTest extends IgniteAbstractTes
                 throw new RuntimeException("test exception");
             }
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         };
 
         PrimaryReplicaEventParameters parameters = new PrimaryReplicaEventParameters(0, part0, LOCAL_NODE.name(), clock.now());
@@ -208,7 +208,7 @@ public class PartitionReplicaListenerDurableUnlockTest extends IgniteAbstractTes
         TablePartitionId part0 = new TablePartitionId(TABLE_ID, PART_ID);
         txStateStorage.put(tx0, new TxMeta(TxState.COMMITED, List.of(part0), null));
 
-        cleanupCallback = (tx, partId) -> completedFuture(null);
+        cleanupCallback = (tx, partId) -> nullCompletedFuture();
 
         CompletableFuture<ReplicaMeta> primaryReplicaFuture = new CompletableFuture<>();
         placementDriver.setAwaitPrimaryReplicaFunction((groupId, timestamp) -> primaryReplicaFuture);
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerIndexLockingTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerIndexLockingTest.java
index 6324fb8aa7..b42394fb28 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerIndexLockingTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerIndexLockingTest.java
@@ -23,6 +23,7 @@ import static org.apache.ignite.internal.table.distributed.replication.Partition
 import static org.apache.ignite.internal.table.distributed.replicator.PartitionReplicaListener.tablePartitionId;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.await;
 import static org.apache.ignite.internal.tx.TxState.checkTransitionCorrectness;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.allOf;
 import static org.hamcrest.Matchers.hasItem;
@@ -137,7 +138,7 @@ public class PartitionReplicaListenerIndexLockingTest extends IgniteAbstractTest
         when(mockRaftClient.refreshAndGetLeaderWithTerm())
                 .thenAnswer(invocationOnMock -> completedFuture(new LeaderWithTerm(null, 1L)));
         when(mockRaftClient.run(any()))
-                .thenAnswer(invocationOnMock -> completedFuture(null));
+                .thenAnswer(invocationOnMock -> nullCompletedFuture());
 
         schemaDescriptor = new SchemaDescriptor(1, new Column[]{
                 new Column("id".toUpperCase(Locale.ROOT), NativeTypes.INT32, false),
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerTest.java
index 5071d0d5ad..7842f1d076 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replication/PartitionReplicaListenerTest.java
@@ -30,6 +30,7 @@ import static org.apache.ignite.internal.testframework.matchers.CompletableFutur
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willSucceedFast;
 import static org.apache.ignite.internal.tx.TxState.checkTransitionCorrectness;
 import static org.apache.ignite.internal.util.ArrayUtils.asList;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.contains;
 import static org.hamcrest.Matchers.containsString;
@@ -253,7 +254,7 @@ public class PartitionReplicaListenerTest extends IgniteAbstractTest {
             });
         }
 
-        return completedFuture(null);
+        return nullCompletedFuture();
     };
 
     /** Tx messages factory. */
@@ -385,10 +386,10 @@ public class PartitionReplicaListenerTest extends IgniteAbstractTest {
 
         when(topologySrv.localMember()).thenReturn(localNode);
 
-        when(safeTimeClock.waitFor(any())).thenReturn(completedFuture(null));
+        when(safeTimeClock.waitFor(any())).thenReturn(nullCompletedFuture());
         when(safeTimeClock.current()).thenReturn(HybridTimestamp.MIN_VALUE);
 
-        when(validationSchemasSource.waitForSchemaAvailability(anyInt(), anyInt())).thenReturn(completedFuture(null));
+        when(validationSchemasSource.waitForSchemaAvailability(anyInt(), anyInt())).thenReturn(nullCompletedFuture());
 
         lenient().when(catalogService.table(anyInt(), anyLong())).thenReturn(tableDescriptor);
 
@@ -434,7 +435,7 @@ public class PartitionReplicaListenerTest extends IgniteAbstractTest {
 
         configureTxManager(txManager);
 
-        doAnswer(invocation -> completedFuture(null)).when(txManager).executeCleanupAsync(any(Runnable.class));
+        doAnswer(invocation -> nullCompletedFuture()).when(txManager).executeCleanupAsync(any(Runnable.class));
 
         doAnswer(invocation -> {
             Object argument = invocation.getArgument(1);
@@ -1466,7 +1467,7 @@ public class PartitionReplicaListenerTest extends IgniteAbstractTest {
     }
 
     private CompletableFuture<?> beginAndAbortTx() {
-        when(txManager.cleanup(any(), any(), any(), anyBoolean(), any())).thenReturn(completedFuture(null));
+        when(txManager.cleanup(any(), any(), any(), anyBoolean(), any())).thenReturn(nullCompletedFuture());
 
         HybridTimestamp beginTimestamp = clock.now();
         UUID txId = transactionIdFor(beginTimestamp);
@@ -1528,7 +1529,7 @@ public class PartitionReplicaListenerTest extends IgniteAbstractTest {
     }
 
     private CompletableFuture<?> beginAndCommitTx() {
-        when(txManager.cleanup(any(), any(), any(), anyBoolean(), any())).thenReturn(completedFuture(null));
+        when(txManager.cleanup(any(), any(), any(), anyBoolean(), any())).thenReturn(nullCompletedFuture());
 
         HybridTimestamp beginTimestamp = clock.now();
         UUID txId = transactionIdFor(beginTimestamp);
@@ -2246,7 +2247,7 @@ public class PartitionReplicaListenerTest extends IgniteAbstractTest {
                 .thenReturn(List.of(
                         tableSchema(CURRENT_SCHEMA_VERSION, List.of(nullableColumn("col")))
                 ));
-        when(txManager.cleanup(any(), any(), any(), anyBoolean(), any())).thenReturn(completedFuture(null));
+        when(txManager.cleanup(any(), any(), any(), anyBoolean(), any())).thenReturn(nullCompletedFuture());
 
         AtomicReference<Boolean> committed = interceptFinishTxCommand();
 
diff --git a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replicator/SchemaCompatibilityValidatorTest.java b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replicator/SchemaCompatibilityValidatorTest.java
index f3072bedc5..c886f208ef 100644
--- a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replicator/SchemaCompatibilityValidatorTest.java
+++ b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/replicator/SchemaCompatibilityValidatorTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.table.distributed.replicator;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.stream.Collectors.groupingBy;
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toSet;
@@ -25,6 +24,7 @@ import static org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_L
 import static org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_PRECISION;
 import static org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_SCALE;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.sql.ColumnType.BITMASK;
 import static org.apache.ignite.sql.ColumnType.BOOLEAN;
 import static org.apache.ignite.sql.ColumnType.BYTE_ARRAY;
@@ -354,7 +354,7 @@ class SchemaCompatibilityValidatorTest extends BaseIgniteAbstractTest {
     private void assertChangeIsNotBackwardCompatible(SchemaChangeSource changeSource) {
         when(schemasSource.tableSchemaVersionsBetween(TABLE_ID, beginTimestamp, 2))
                 .thenReturn(changeSource.schemaVersions());
-        when(schemasSource.waitForSchemaAvailability(anyInt(), anyInt())).thenReturn(completedFuture(null));
+        when(schemasSource.waitForSchemaAvailability(anyInt(), anyInt())).thenReturn(nullCompletedFuture());
 
         CompletableFuture<CompatValidationResult> resultFuture = validator.validateBackwards(2, TABLE_ID, txId);
 
diff --git a/modules/table/src/testFixtures/java/org/apache/ignite/distributed/ItTxTestCluster.java b/modules/table/src/testFixtures/java/org/apache/ignite/distributed/ItTxTestCluster.java
index d0a85e31ad..02b0b9594f 100644
--- a/modules/table/src/testFixtures/java/org/apache/ignite/distributed/ItTxTestCluster.java
+++ b/modules/table/src/testFixtures/java/org/apache/ignite/distributed/ItTxTestCluster.java
@@ -24,6 +24,8 @@ import static java.util.stream.Collectors.toSet;
 import static org.apache.ignite.internal.replicator.ReplicaManager.DEFAULT_IDLE_SAFE_TIME_PROPAGATION_PERIOD_MILLISECONDS;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
 import static org.apache.ignite.internal.util.CollectionUtils.first;
+import static org.apache.ignite.internal.util.CompletableFutures.emptySetCompletedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.utils.ClusterServiceTestUtils.findLocalAddresses;
 import static org.apache.ignite.utils.ClusterServiceTestUtils.waitForTopology;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -320,7 +322,7 @@ public class ItTxTestCluster {
             var cmgManager = mock(ClusterManagementGroupManager.class);
 
             // This test is run without Meta storage.
-            when(cmgManager.metaStorageNodes()).thenReturn(completedFuture(Set.of()));
+            when(cmgManager.metaStorageNodes()).thenReturn(emptySetCompletedFuture());
 
             ReplicaManager replicaMgr = new ReplicaManager(
                     node.name(),
@@ -552,7 +554,7 @@ public class ItTxTestCluster {
 
                                 replicaManagers.get(assignment).startReplica(
                                         new TablePartitionId(tableId, partId),
-                                        completedFuture(null),
+                                        nullCompletedFuture(),
                                         listener,
                                         raftSvc,
                                         storageIndexTracker
diff --git a/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/distributed/schema/AlwaysSyncedSchemaSyncService.java b/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/distributed/schema/AlwaysSyncedSchemaSyncService.java
index b7331a9ab2..62cab02c06 100644
--- a/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/distributed/schema/AlwaysSyncedSchemaSyncService.java
+++ b/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/distributed/schema/AlwaysSyncedSchemaSyncService.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.internal.table.distributed.schema;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.internal.hlc.HybridTimestamp;
@@ -29,6 +29,6 @@ import org.apache.ignite.internal.hlc.HybridTimestamp;
 public class AlwaysSyncedSchemaSyncService implements SchemaSyncService {
     @Override
     public CompletableFuture<Void> waitForMetadataCompleteness(HybridTimestamp ts) {
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 }
diff --git a/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/impl/DummyValidationSchemasSource.java b/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/impl/DummyValidationSchemasSource.java
index 2f38eff1f7..cf970ba226 100644
--- a/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/impl/DummyValidationSchemasSource.java
+++ b/modules/table/src/testFixtures/java/org/apache/ignite/internal/table/impl/DummyValidationSchemasSource.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.table.impl;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.stream.Collectors.toList;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
@@ -50,7 +50,7 @@ public class DummyValidationSchemasSource implements ValidationSchemasSource {
 
     @Override
     public CompletableFuture<Void> waitForSchemaAvailability(int tableId, int schemaVersion) {
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     @Override
diff --git a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/HeapLockManager.java b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/HeapLockManager.java
index 0ad9e8df35..2d8a2b2292 100644
--- a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/HeapLockManager.java
+++ b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/HeapLockManager.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.internal.tx.impl;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.lang.ErrorGroups.Transactions.ACQUIRE_LOCK_ERR;
 import static org.apache.ignite.lang.ErrorGroups.Transactions.ACQUIRE_LOCK_TIMEOUT_ERR;
 
@@ -220,7 +220,7 @@ public class HeapLockManager extends AbstractEventProducer<LockEvent, LockEventP
 
                         waiter.upgrade(prev);
 
-                        return new IgniteBiTuple(completedFuture(null), prev.lockMode());
+                        return new IgniteBiTuple(nullCompletedFuture(), prev.lockMode());
                     } else {
                         waiter.upgrade(prev);
 
diff --git a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/OrphanDetector.java b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/OrphanDetector.java
index 2105a58226..76ddbf6231 100644
--- a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/OrphanDetector.java
+++ b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/OrphanDetector.java
@@ -17,10 +17,10 @@
 
 package org.apache.ignite.internal.tx.impl;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.failedFuture;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.ignite.internal.tx.TxState.isFinalState;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
@@ -159,7 +159,7 @@ public class OrphanDetector {
                 || txState.txState() == TxState.ABANDONED
                 || isFinalState(txState.txState())
                 || topologyService.getById(txState.txCoordinatorId()) != null) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         LOG.info(
@@ -184,7 +184,7 @@ public class OrphanDetector {
                         txId
                 );
 
-                return completedFuture(null);
+                return nullCompletedFuture();
             }
 
             return replicaService.invoke(commitPartPrimaryNode, FACTORY.txRecoveryMessage()
diff --git a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/ReadOnlyTransactionImpl.java b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/ReadOnlyTransactionImpl.java
index d367396ec6..535c2c73cf 100644
--- a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/ReadOnlyTransactionImpl.java
+++ b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/ReadOnlyTransactionImpl.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.tx.impl;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.tx.TxState.COMMITED;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
@@ -108,7 +108,7 @@ class ReadOnlyTransactionImpl extends IgniteAbstractTransactionImpl {
     @Override
     public CompletableFuture<Void> finish(boolean commit, HybridTimestamp executionTimestamp) {
         if (!finishGuard.compareAndSet(false, true)) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         observableTsTracker.update(executionTimestamp);
diff --git a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/TxManagerImpl.java b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/TxManagerImpl.java
index cacbb698c7..dc03c46e0e 100644
--- a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/TxManagerImpl.java
+++ b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/impl/TxManagerImpl.java
@@ -18,7 +18,6 @@
 package org.apache.ignite.internal.tx.impl;
 
 import static java.util.concurrent.CompletableFuture.allOf;
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.concurrent.CompletableFuture.runAsync;
 import static java.util.concurrent.CompletableFuture.supplyAsync;
 import static java.util.concurrent.TimeUnit.SECONDS;
@@ -28,6 +27,7 @@ import static org.apache.ignite.internal.tx.TxState.COMMITED;
 import static org.apache.ignite.internal.tx.TxState.PENDING;
 import static org.apache.ignite.internal.tx.TxState.checkTransitionCorrectness;
 import static org.apache.ignite.internal.tx.TxState.isFinalState;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.internal.util.ExceptionUtils.withCause;
 import static org.apache.ignite.internal.util.IgniteUtils.inBusyLockAsync;
 import static org.apache.ignite.internal.util.IgniteUtils.shutdownAndAwaitTermination;
@@ -84,6 +84,7 @@ import org.apache.ignite.internal.tx.TxStateMeta;
 import org.apache.ignite.internal.tx.TxStateMetaFinishing;
 import org.apache.ignite.internal.tx.message.TxFinishReplicaRequest;
 import org.apache.ignite.internal.tx.message.TxMessagesFactory;
+import org.apache.ignite.internal.util.CompletableFutures;
 import org.apache.ignite.internal.util.ExceptionUtils;
 import org.apache.ignite.internal.util.IgniteSpinBusyLock;
 import org.apache.ignite.network.ClusterService;
@@ -319,7 +320,7 @@ public class TxManagerImpl implements TxManager, NetworkMessageHandler {
             // If there are no enlisted groups, just update local state - we already marked the tx as finished.
             updateTxMeta(txId, old -> coordinatorFinalTxStateMeta(commit, commitPartition, commitTimestamp(commit)));
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         // Here we put finishing state meta into the local map, so that all concurrent operations trying to read tx state
@@ -368,7 +369,7 @@ public class TxManagerImpl implements TxManager, NetworkMessageHandler {
         // given primaries are not expired or, in other words, whether commitTimestamp is less or equal to the enlisted primaries
         // expiration timestamps.
         CompletableFuture<Void> verificationFuture =
-                commit ? verifyCommitTimestamp(enlistedGroups, commitTimestamp) : completedFuture(null);
+                commit ? verifyCommitTimestamp(enlistedGroups, commitTimestamp) : nullCompletedFuture();
 
         return verificationFuture.handle(
                         (unused, throwable) -> {
@@ -454,7 +455,7 @@ public class TxManagerImpl implements TxManager, NetworkMessageHandler {
                         }
                     }
 
-                    return CompletableFuture.<Void>completedFuture(null);
+                    return CompletableFutures.<Void>nullCompletedFuture();
                 })
                 .thenCompose(Function.identity()));
     }
@@ -766,7 +767,7 @@ public class TxManagerImpl implements TxManager, NetworkMessageHandler {
         }
 
         private CompletableFuture<Void> waitReadyToFinish(boolean commit) {
-            return commit ? waitNoInflights() : completedFuture(null);
+            return commit ? waitNoInflights() : nullCompletedFuture();
         }
 
         private CompletableFuture<Void> waitNoInflights() {
diff --git a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/rocksdb/TxStateRocksDbStorage.java b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/rocksdb/TxStateRocksDbStorage.java
index 8645605fb4..8c2c6966b6 100644
--- a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/rocksdb/TxStateRocksDbStorage.java
+++ b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/rocksdb/TxStateRocksDbStorage.java
@@ -17,11 +17,11 @@
 
 package org.apache.ignite.internal.tx.storage.state.rocksdb;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.util.ByteUtils.bytesToLong;
 import static org.apache.ignite.internal.util.ByteUtils.fromBytes;
 import static org.apache.ignite.internal.util.ByteUtils.putLongToBytes;
 import static org.apache.ignite.internal.util.ByteUtils.toBytes;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.lang.ErrorGroups.Transactions.TX_STATE_STORAGE_ERR;
 import static org.apache.ignite.lang.ErrorGroups.Transactions.TX_STATE_STORAGE_REBALANCE_ERR;
 import static org.apache.ignite.lang.ErrorGroups.Transactions.TX_STATE_STORAGE_STOPPED_ERR;
@@ -444,7 +444,7 @@ public class TxStateRocksDbStorage implements TxStateStorage {
 
             db.write(writeOptions, writeBatch);
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         } catch (Exception e) {
             throw new IgniteInternalException(
                     TX_STATE_STORAGE_REBALANCE_ERR,
@@ -459,7 +459,7 @@ public class TxStateRocksDbStorage implements TxStateStorage {
     @Override
     public CompletableFuture<Void> abortRebalance() {
         if (state.get() != StorageState.REBALANCE) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         try (WriteBatch writeBatch = new WriteBatch()) {
@@ -481,7 +481,7 @@ public class TxStateRocksDbStorage implements TxStateStorage {
             );
         }
 
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     @Override
@@ -507,7 +507,7 @@ public class TxStateRocksDbStorage implements TxStateStorage {
             );
         }
 
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     @Override
@@ -526,7 +526,7 @@ public class TxStateRocksDbStorage implements TxStateStorage {
 
             db.write(writeOptions, writeBatch);
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         } catch (RocksDBException e) {
             throw new IgniteInternalException(
                     TX_STATE_STORAGE_ERR,
diff --git a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/AbstractLockManagerEventsTest.java b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/AbstractLockManagerEventsTest.java
index 593fe36d8e..dfc267c347 100644
--- a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/AbstractLockManagerEventsTest.java
+++ b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/AbstractLockManagerEventsTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.internal.tx;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
+import static org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
@@ -57,7 +57,7 @@ public abstract class AbstractLockManagerEventsTest extends AbstractLockingTest
     private CompletableFuture<Boolean> lockEventListener(LockEventParameters params, Throwable e) {
         eventParamsRef.set(params);
 
-        return completedFuture(false);
+        return falseCompletedFuture();
     }
 
     private void checkLockConflictEvent(UUID lockAcquirerTx, UUID lockHolderTx) {
diff --git a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/TxManagerTest.java b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/TxManagerTest.java
index 8f7b4ce5e1..14cc7ac856 100644
--- a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/TxManagerTest.java
+++ b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/TxManagerTest.java
@@ -19,11 +19,13 @@ package org.apache.ignite.internal.tx;
 
 
 import static java.lang.Math.abs;
+import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.hlc.HybridTimestamp.CLOCK_SKEW;
 import static org.apache.ignite.internal.hlc.HybridTimestamp.hybridTimestamp;
 import static org.apache.ignite.internal.replicator.ReplicaManager.DEFAULT_IDLE_SAFE_TIME_PROPAGATION_PERIOD_MILLISECONDS;
 import static org.apache.ignite.internal.testframework.IgniteTestUtils.assertThrowsWithCause;
 import static org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willSucceedFast;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.lang.ErrorGroups.Transactions.TX_COMMIT_ERR;
 import static org.apache.ignite.lang.ErrorGroups.Transactions.TX_PRIMARY_REPLICA_EXPIRED_ERR;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -109,9 +111,9 @@ public class TxManagerTest extends IgniteAbstractTest {
 
         replicaService = mock(ReplicaService.class, RETURNS_DEEP_STUBS);
 
-        when(replicaService.invoke(any(ClusterNode.class), any())).thenReturn(CompletableFuture.completedFuture(null));
+        when(replicaService.invoke(any(ClusterNode.class), any())).thenReturn(nullCompletedFuture());
 
-        when(replicaService.invoke(anyString(), any())).thenReturn(CompletableFuture.completedFuture(null));
+        when(replicaService.invoke(anyString(), any())).thenReturn(nullCompletedFuture());
 
         txManager = new TxManagerImpl(
                 clusterService,
@@ -345,9 +347,9 @@ public class TxManagerTest extends IgniteAbstractTest {
     @Test
     public void testFinishSamePrimary() {
         // Same primary that was enlisted is returned during finish phase and commitTimestamp is less that primary.expirationTimestamp.
-        when(placementDriver.getPrimaryReplica(any(), any())).thenReturn(CompletableFuture.completedFuture(
+        when(placementDriver.getPrimaryReplica(any(), any())).thenReturn(completedFuture(
                 new TestReplicaMetaImpl(LOCAL_NODE, hybridTimestamp(1), HybridTimestamp.MAX_VALUE)));
-        when(placementDriver.awaitPrimaryReplica(any(), any(), anyLong(), any())).thenReturn(CompletableFuture.completedFuture(
+        when(placementDriver.awaitPrimaryReplica(any(), any(), anyLong(), any())).thenReturn(completedFuture(
                 new TestReplicaMetaImpl(LOCAL_NODE, hybridTimestamp(1), HybridTimestamp.MAX_VALUE)));
 
         // Ensure that commit doesn't throw exceptions.
@@ -362,8 +364,8 @@ public class TxManagerTest extends IgniteAbstractTest {
     @Test
     public void testFinishExpiredWithNullPrimary() {
         // Null is returned as primaryReplica during finish phase.
-        when(placementDriver.getPrimaryReplica(any(), any())).thenReturn(CompletableFuture.completedFuture(null));
-        when(placementDriver.awaitPrimaryReplica(any(), any(), anyLong(), any())).thenReturn(CompletableFuture.completedFuture(
+        when(placementDriver.getPrimaryReplica(any(), any())).thenReturn(nullCompletedFuture());
+        when(placementDriver.awaitPrimaryReplica(any(), any(), anyLong(), any())).thenReturn(completedFuture(
                 new TestReplicaMetaImpl(LOCAL_NODE, hybridTimestamp(1), hybridTimestamp(10))));
 
         assertCommitThrowsTransactionExceptionWithPrimaryReplicaExpiredExceptionAsCause();
@@ -376,9 +378,9 @@ public class TxManagerTest extends IgniteAbstractTest {
         // Primary with expirationTimestamp less than commitTimestamp is returned.
         // It's impossible from the point of view of getPrimaryReplica to return expired lease,
         // given test checks that an assertion exception will be thrown and wrapped with proper transaction public one.
-        when(placementDriver.getPrimaryReplica(any(), any())).thenReturn(CompletableFuture.completedFuture(
+        when(placementDriver.getPrimaryReplica(any(), any())).thenReturn(completedFuture(
                 new TestReplicaMetaImpl(LOCAL_NODE, hybridTimestamp(1), hybridTimestamp(10))));
-        when(placementDriver.awaitPrimaryReplica(any(), any(), anyLong(), any())).thenReturn(CompletableFuture.completedFuture(
+        when(placementDriver.awaitPrimaryReplica(any(), any(), anyLong(), any())).thenReturn(completedFuture(
                 new TestReplicaMetaImpl(LOCAL_NODE, hybridTimestamp(1), hybridTimestamp(10))));
 
         InternalTransaction committedTransaction = prepareTransaction();
@@ -397,9 +399,9 @@ public class TxManagerTest extends IgniteAbstractTest {
     @Test
     public void testFinishExpiredWithDifferentEnlistmentConsistencyToken() {
         // Primary with another enlistment consistency token is returned.
-        when(placementDriver.getPrimaryReplica(any(), any())).thenReturn(CompletableFuture.completedFuture(
+        when(placementDriver.getPrimaryReplica(any(), any())).thenReturn(completedFuture(
                 new TestReplicaMetaImpl(LOCAL_NODE, hybridTimestamp(2), HybridTimestamp.MAX_VALUE)));
-        when(placementDriver.awaitPrimaryReplica(any(), any(), anyLong(), any())).thenReturn(CompletableFuture.completedFuture(
+        when(placementDriver.awaitPrimaryReplica(any(), any(), anyLong(), any())).thenReturn(completedFuture(
                 new TestReplicaMetaImpl(LOCAL_NODE, hybridTimestamp(2), HybridTimestamp.MAX_VALUE)));
 
         assertCommitThrowsTransactionExceptionWithPrimaryReplicaExpiredExceptionAsCause();
diff --git a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/impl/ReadWriteTransactionImplTest.java b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/impl/ReadWriteTransactionImplTest.java
index aaf5d89dc0..2fc60c5fd1 100644
--- a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/impl/ReadWriteTransactionImplTest.java
+++ b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/impl/ReadWriteTransactionImplTest.java
@@ -17,10 +17,10 @@
 
 package org.apache.ignite.internal.tx.impl;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static org.apache.ignite.internal.tx.TxState.ABORTED;
 import static org.apache.ignite.internal.tx.TxState.COMMITED;
 import static org.apache.ignite.internal.tx.TxState.FINISHING;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -96,7 +96,7 @@ class ReadWriteTransactionImplTest extends BaseIgniteAbstractTest {
         Mockito.when(txManager.finish(any(), any(), anyBoolean(), any(), any())).thenAnswer(invocation -> {
             finishedTxs.add(invocation.getArgument(4));
 
-            return completedFuture(null);
+            return nullCompletedFuture();
         });
 
         Mockito.when(txManager.stateMeta(any())).thenAnswer(invocation -> {
diff --git a/modules/transactions/src/testFixtures/java/org/apache/ignite/internal/tx/storage/state/test/TestTxStateStorage.java b/modules/transactions/src/testFixtures/java/org/apache/ignite/internal/tx/storage/state/test/TestTxStateStorage.java
index 70a899e4d2..689bd0be80 100644
--- a/modules/transactions/src/testFixtures/java/org/apache/ignite/internal/tx/storage/state/test/TestTxStateStorage.java
+++ b/modules/transactions/src/testFixtures/java/org/apache/ignite/internal/tx/storage/state/test/TestTxStateStorage.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.tx.storage.state.test;
 
-import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.stream.Collectors.toList;
+import static org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
 import static org.apache.ignite.lang.ErrorGroups.Transactions.TX_STATE_STORAGE_REBALANCE_ERR;
 import static org.apache.ignite.lang.ErrorGroups.Transactions.TX_STATE_STORAGE_STOPPED_ERR;
 
@@ -143,7 +143,7 @@ public class TestTxStateStorage implements TxStateStorage {
 
     @Override
     public CompletableFuture<Void> flush() {
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     @Override
@@ -200,7 +200,7 @@ public class TestTxStateStorage implements TxStateStorage {
         CompletableFuture<Void> rebalanceFuture = rebalanceFutureReference.getAndSet(null);
 
         if (rebalanceFuture == null) {
-            return completedFuture(null);
+            return nullCompletedFuture();
         }
 
         return rebalanceFuture
@@ -239,7 +239,7 @@ public class TestTxStateStorage implements TxStateStorage {
         lastAppliedIndex = 0;
         lastAppliedTerm = 0;
 
-        return completedFuture(null);
+        return nullCompletedFuture();
     }
 
     private void checkStorageInProgreesOfRebalance() {