diff --git a/oak-benchmarks/pom.xml b/oak-benchmarks/pom.xml
index 59958a3d3c0..d3982f3efcb 100644
--- a/oak-benchmarks/pom.xml
+++ b/oak-benchmarks/pom.xml
@@ -206,7 +206,7 @@
         </dependency>
         <dependency>
             <groupId>org.mongodb</groupId>
-            <artifactId>mongo-java-driver</artifactId>
+            <artifactId>mongodb-driver-sync</artifactId>
         </dependency>
          <dependency>
             <groupId>com.h2database</groupId>
diff --git a/oak-examples/standalone/pom.xml b/oak-examples/standalone/pom.xml
index 04580efadd1..7cc9ec8e135 100644
--- a/oak-examples/standalone/pom.xml
+++ b/oak-examples/standalone/pom.xml
@@ -100,8 +100,7 @@
     </dependency>
     <dependency>
       <groupId>org.mongodb</groupId>
-      <artifactId>mongo-java-driver</artifactId>
-      <version>${mongo.driver.version}</version>
+      <artifactId>mongodb-driver-sync</artifactId>
       <optional>true</optional>
     </dependency>
     <!-- Required for the persistent cache -->
diff --git a/oak-it/pom.xml b/oak-it/pom.xml
index 1d296e13819..008d4cb596a 100644
--- a/oak-it/pom.xml
+++ b/oak-it/pom.xml
@@ -186,7 +186,7 @@
         </dependency>
         <dependency>
             <groupId>org.mongodb</groupId>
-            <artifactId>mongo-java-driver</artifactId>
+            <artifactId>mongodb-driver-sync</artifactId>
             <optional>true</optional>
             <scope>test</scope>
         </dependency>
diff --git a/oak-jcr/pom.xml b/oak-jcr/pom.xml
index 6eb3b6bc438..192346a4aa0 100644
--- a/oak-jcr/pom.xml
+++ b/oak-jcr/pom.xml
@@ -389,7 +389,7 @@
     </dependency>
     <dependency>
       <groupId>org.mongodb</groupId>
-      <artifactId>mongo-java-driver</artifactId>
+      <artifactId>mongodb-driver-sync</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
diff --git a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/cluster/NonLocalObservationIT.java b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/cluster/NonLocalObservationIT.java
index 4c18043c99d..6557e1c746e 100644
--- a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/cluster/NonLocalObservationIT.java
+++ b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/cluster/NonLocalObservationIT.java
@@ -48,7 +48,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.mongodb.MongoClient;
+import com.mongodb.client.MongoClient;
 
 /**
  * Test for external events from another cluster node.
@@ -108,7 +108,7 @@ public void dispose(NodeStore nodeStore) {
                 nodeStores.remove(nodeStore);
                 if (nodeStores.size() == 0) {
                     try (MongoClient c = createClient()) {
-                        c.dropDatabase(dbName);
+                        c.getDatabase(dbName).drop();
                     } catch (Exception e) {
                         log.error("dispose: Can't close Mongo", e);
                     }
diff --git a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/random/RandomOpCompare.java b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/random/RandomOpCompare.java
index 656964ce522..6628c11a21e 100644
--- a/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/random/RandomOpCompare.java
+++ b/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/random/RandomOpCompare.java
@@ -38,7 +38,6 @@
 import org.apache.jackrabbit.oak.plugins.document.util.MongoConnection;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 
-import com.mongodb.DB;
 
 /**
  * A randomized test that writes to two repositories (using different storage
diff --git a/oak-lucene/pom.xml b/oak-lucene/pom.xml
index d3684328c59..758e2f7edd4 100644
--- a/oak-lucene/pom.xml
+++ b/oak-lucene/pom.xml
@@ -281,7 +281,7 @@
     </dependency>
     <dependency>
       <groupId>org.mongodb</groupId>
-      <artifactId>mongo-java-driver</artifactId>
+      <artifactId>mongodb-driver-sync</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
diff --git a/oak-parent/pom.xml b/oak-parent/pom.xml
index d86b32c6d3b..c868055d355 100644
--- a/oak-parent/pom.xml
+++ b/oak-parent/pom.xml
@@ -58,7 +58,7 @@
     <segment.db>SegmentMK</segment.db>
     <lucene.version>4.7.2</lucene.version>
     <solr.version>8.11.1</solr.version>
-    <mongo.driver.version>3.12.14</mongo.driver.version>
+    <mongo.driver.version>5.2.0</mongo.driver.version>
     <slf4j.api.version>1.7.36</slf4j.api.version>
     <slf4j.version>1.7.36</slf4j.version> <!-- sync with logback version -->
     <logback.version>1.2.13</logback.version>
@@ -558,9 +558,9 @@
       </dependency>
       <dependency>
         <groupId>org.mongodb</groupId>
-        <artifactId>mongo-java-driver</artifactId>
+        <artifactId>mongodb-driver-sync</artifactId>
         <version>${mongo.driver.version}</version>
-      </dependency>
+      </dependency>      
       <dependency>
         <groupId>org.easymock</groupId>
         <artifactId>easymock</artifactId>
diff --git a/oak-pojosr/pom.xml b/oak-pojosr/pom.xml
index 2b1c01a8f83..f7a7dd50fdc 100644
--- a/oak-pojosr/pom.xml
+++ b/oak-pojosr/pom.xml
@@ -121,7 +121,7 @@
     </dependency>
     <dependency>
       <groupId>org.mongodb</groupId>
-      <artifactId>mongo-java-driver</artifactId>
+      <artifactId>mongodb-driver-sync</artifactId>
       <optional>true</optional>
     </dependency>
     <dependency>
diff --git a/oak-run-commons/pom.xml b/oak-run-commons/pom.xml
index d46e5ea5d63..f4961f635e0 100644
--- a/oak-run-commons/pom.xml
+++ b/oak-run-commons/pom.xml
@@ -117,7 +117,7 @@
         </dependency>
         <dependency>
             <groupId>org.mongodb</groupId>
-            <artifactId>mongo-java-driver</artifactId>
+            <artifactId>mongodb-driver-sync</artifactId>
         </dependency>
         <dependency>
             <groupId>commons-io</groupId>
diff --git a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/CompositeStoreFixture.java b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/CompositeStoreFixture.java
index 4cfc278b98a..851fbfe67ac 100644
--- a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/CompositeStoreFixture.java
+++ b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/fixture/CompositeStoreFixture.java
@@ -43,7 +43,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import com.mongodb.MongoClientURI;
+import com.mongodb.ConnectionString;
 
 import static java.util.Arrays.asList;
 import static org.apache.jackrabbit.oak.plugins.document.mongo.MongoDocumentNodeStoreBuilder.newMongoDocumentNodeStoreBuilder;
@@ -109,7 +109,7 @@ static OakFixture newCompositeMongoFixture(String name, String uri, boolean drop
                                                boolean throttlingEnabled) {
         return new CompositeStoreFixture(name) {
 
-            private String database = new MongoClientURI(uri).getDatabase();
+            private String database = new ConnectionString(uri).getDatabase();
             private DocumentNodeStore ns;
 
             @Override
diff --git a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/DocumentStoreIndexerBase.java b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/DocumentStoreIndexerBase.java
index 1a25acc7c1d..7e941f50961 100644
--- a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/DocumentStoreIndexerBase.java
+++ b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/DocumentStoreIndexerBase.java
@@ -20,7 +20,8 @@
 package org.apache.jackrabbit.oak.index.indexer.document;
 
 import com.codahale.metrics.MetricRegistry;
-import com.mongodb.MongoClientURI;
+import com.mongodb.ConnectionString;
+import com.mongodb.client.MongoCollection;
 import com.mongodb.client.MongoDatabase;
 import org.apache.jackrabbit.guava.common.base.Stopwatch;
 import org.apache.jackrabbit.guava.common.io.Closer;
@@ -61,6 +62,7 @@
 import org.apache.jackrabbit.oak.spi.state.NodeStateUtils;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.apache.jackrabbit.oak.stats.StatisticsProvider;
+import org.bson.Document;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -483,8 +485,8 @@ private MongoDocumentStore getMongoDocumentStore() {
         return requireNonNull(indexHelper.getService(MongoDocumentStore.class));
     }
 
-    private MongoClientURI getMongoClientURI() {
-        return requireNonNull(indexHelper.getService(MongoClientURI.class));
+    private ConnectionString getMongoClientURI() {
+        return requireNonNull(indexHelper.getService(ConnectionString.class));
     }
 
     private MongoDatabase getMongoDatabase() {
@@ -508,7 +510,8 @@ private void configureEstimators(IndexingProgressReporter progressReporter) {
     private long getEstimatedDocumentCount() {
         MongoConnection mongoConnection = indexHelper.getService(MongoConnection.class);
         if (mongoConnection != null) {
-            return mongoConnection.getDatabase().getCollection("nodes").count();
+            MongoCollection<Document> nodesCollection = mongoConnection.getDatabase().getCollection("nodes");
+            return nodesCollection.countDocuments();
         }
         return 0;
     }
diff --git a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/FlatFileNodeStoreBuilder.java b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/FlatFileNodeStoreBuilder.java
index 60cfc3037c6..1d85447ac8a 100644
--- a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/FlatFileNodeStoreBuilder.java
+++ b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/FlatFileNodeStoreBuilder.java
@@ -19,7 +19,7 @@
 
 package org.apache.jackrabbit.oak.index.indexer.document.flatfile;
 
-import com.mongodb.MongoClientURI;
+import com.mongodb.ConnectionString;
 import com.mongodb.client.MongoDatabase;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.jackrabbit.guava.common.collect.Iterables;
@@ -112,7 +112,7 @@ public class FlatFileNodeStoreBuilder {
     private String checkpoint;
     private StatisticsProvider statisticsProvider = StatisticsProvider.NOOP;
     private IndexingReporter indexingReporter = IndexingReporter.NOOP;
-    private MongoClientURI mongoClientURI;
+    private ConnectionString mongoClientURI;
     private boolean withAheadOfTimeBlobDownloading = false;
 
     public enum SortStrategyType {
@@ -191,7 +191,7 @@ public FlatFileNodeStoreBuilder withCheckpoint(String checkpoint) {
         return this;
     }
 
-    public FlatFileNodeStoreBuilder withMongoClientURI(MongoClientURI mongoClientURI) {
+    public FlatFileNodeStoreBuilder withMongoClientURI(ConnectionString mongoClientURI) {
         this.mongoClientURI = mongoClientURI;
         return this;
     }
diff --git a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelinedMongoDownloadTask.java b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelinedMongoDownloadTask.java
index 2c7c78cd75c..10e61148af2 100644
--- a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelinedMongoDownloadTask.java
+++ b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelinedMongoDownloadTask.java
@@ -20,7 +20,6 @@
 
 import com.mongodb.ConnectionString;
 import com.mongodb.MongoClientSettings;
-import com.mongodb.MongoClientURI;
 import com.mongodb.MongoException;
 import com.mongodb.MongoIncompatibleDriverException;
 import com.mongodb.MongoInterruptedException;
@@ -204,7 +203,7 @@ public String toString() {
     static final String THREAD_NAME_PREFIX = "mongo-dump";
 
 
-    private final MongoClientURI mongoClientURI;
+    private final ConnectionString mongoClientURI;
     private final MongoDocumentStore docStore;
     private final int maxBatchSizeBytes;
     private final int maxBatchNumberOfDocuments;
@@ -229,7 +228,7 @@ public String toString() {
     private final DownloadStageStatistics downloadStageStatistics = new DownloadStageStatistics();
     private Instant lastDelayedEnqueueWarningMessageLoggedTimestamp = Instant.now();
 
-    public PipelinedMongoDownloadTask(MongoClientURI mongoClientURI,
+    public PipelinedMongoDownloadTask(ConnectionString mongoClientURI,
                                       MongoDocumentStore docStore,
                                       int maxBatchSizeBytes,
                                       int maxBatchNumberOfDocuments,
@@ -240,7 +239,7 @@ public PipelinedMongoDownloadTask(MongoClientURI mongoClientURI,
         this(mongoClientURI, docStore, maxBatchSizeBytes, maxBatchNumberOfDocuments, queue, pathFilters, statisticsProvider, reporter, new ThreadFactoryBuilder().setDaemon(true).build());
     }
 
-    public PipelinedMongoDownloadTask(MongoClientURI mongoClientURI,
+    public PipelinedMongoDownloadTask(ConnectionString mongoClientURI,
                                       MongoDocumentStore docStore,
                                       int maxBatchSizeBytes,
                                       int maxBatchNumberOfDocuments,
@@ -343,7 +342,7 @@ public Result call() throws Exception {
             );
 
             MongoClientSettings.Builder settingsBuilder = MongoClientSettings.builder()
-                    .applyConnectionString(new ConnectionString(mongoClientURI.getURI()))
+                    .applyConnectionString(mongoClientURI)
                     .readPreference(ReadPreference.secondaryPreferred());
             if (parallelDump && parallelDumpSecondariesOnly) {
                 // Set a custom server selector that is able to distribute the two connections between the two secondaries.
diff --git a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelinedStrategy.java b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelinedStrategy.java
index a3417a769bf..b212ca1f7cf 100644
--- a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelinedStrategy.java
+++ b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelinedStrategy.java
@@ -18,7 +18,7 @@
  */
 package org.apache.jackrabbit.oak.index.indexer.document.flatfile.pipelined;
 
-import com.mongodb.MongoClientURI;
+import com.mongodb.ConnectionString;
 import org.apache.commons.io.FileUtils;
 import org.apache.jackrabbit.guava.common.base.Preconditions;
 import org.apache.jackrabbit.guava.common.base.Stopwatch;
@@ -179,7 +179,7 @@ private static void prettyPrintTransformStatisticsHistograms(TransformStageStati
     }
 
     private final MongoDocumentStore docStore;
-    private final MongoClientURI mongoClientURI;
+    private final ConnectionString mongoClientURI;
     private final DocumentNodeStore documentNodeStore;
     private final RevisionVector rootRevision;
     private final BlobStore blobStore;
@@ -204,7 +204,7 @@ private static void prettyPrintTransformStatisticsHistograms(TransformStageStati
      * @param statisticsProvider Used to collect statistics about the indexing process.
      * @param indexingReporter   Used to collect diagnostics, metrics and statistics and report them at the end of the indexing process.
      */
-    public PipelinedStrategy(MongoClientURI mongoClientURI,
+    public PipelinedStrategy(ConnectionString mongoClientURI,
                              MongoDocumentStore documentStore,
                              DocumentNodeStore documentNodeStore,
                              RevisionVector rootRevision,
diff --git a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelinedTreeStoreStrategy.java b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelinedTreeStoreStrategy.java
index b5cb0371136..642c50a41fe 100644
--- a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelinedTreeStoreStrategy.java
+++ b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelinedTreeStoreStrategy.java
@@ -18,7 +18,7 @@
  */
 package org.apache.jackrabbit.oak.index.indexer.document.flatfile.pipelined;
 
-import com.mongodb.MongoClientURI;
+import com.mongodb.ConnectionString;
 import org.apache.commons.io.FileUtils;
 import org.apache.jackrabbit.guava.common.base.Preconditions;
 import org.apache.jackrabbit.guava.common.base.Stopwatch;
@@ -166,7 +166,7 @@ private static void prettyPrintTransformStatisticsHistograms(TransformStageStati
     }
 
     private final MongoDocumentStore docStore;
-    private final MongoClientURI mongoClientURI;
+    private final ConnectionString mongoClientURI;
     private final DocumentNodeStore documentNodeStore;
     private final RevisionVector rootRevision;
     private final BlobStore blobStore;
@@ -190,7 +190,7 @@ private static void prettyPrintTransformStatisticsHistograms(TransformStageStati
      * @param statisticsProvider Used to collect statistics about the indexing process.
      * @param indexingReporter   Used to collect diagnostics, metrics and statistics and report them at the end of the indexing process.
      */
-    public PipelinedTreeStoreStrategy(MongoClientURI mongoClientURI,
+    public PipelinedTreeStoreStrategy(ConnectionString mongoClientURI,
                              MongoDocumentStore documentStore,
                              DocumentNodeStore documentNodeStore,
                              RevisionVector rootRevision,
diff --git a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/run/cli/DocumentFixtureProvider.java b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/run/cli/DocumentFixtureProvider.java
index 8535682ddf5..a4f46e9dc36 100644
--- a/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/run/cli/DocumentFixtureProvider.java
+++ b/oak-run-commons/src/main/java/org/apache/jackrabbit/oak/run/cli/DocumentFixtureProvider.java
@@ -22,9 +22,9 @@
 
 import javax.sql.DataSource;
 
+import com.mongodb.ConnectionString;
 import com.mongodb.client.MongoDatabase;
 import org.apache.jackrabbit.guava.common.io.Closer;
-import com.mongodb.MongoClientURI;
 import org.apache.commons.io.FileUtils;
 import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore;
 import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStoreBuilder;
@@ -101,14 +101,14 @@ static DocumentNodeStore configureDocumentMk(Options options,
 
         DocumentNodeStore dns;
         if (commonOpts.isMongo()) {
-            MongoClientURI uri = new MongoClientURI(commonOpts.getStoreArg());
+            ConnectionString uri = new ConnectionString(commonOpts.getStoreArg());
             if (uri.getDatabase() == null) {
                 System.err.println("Database missing in MongoDB URI: "
-                        + uri.getURI());
+                        + uri);
                 System.exit(1);
             }
-            MongoConnection mongo = new MongoConnection(uri.getURI());
-            wb.register(MongoClientURI.class, uri, emptyMap());
+            MongoConnection mongo = new MongoConnection(uri.getConnectionString());
+            wb.register(ConnectionString.class, uri, emptyMap());
             wb.register(MongoConnection.class, mongo, emptyMap());
             wb.register(MongoDatabase.class, mongo.getDatabase(), emptyMap());
             closer.register(mongo::close);
diff --git a/oak-run-commons/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/MongoTestBackend.java b/oak-run-commons/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/MongoTestBackend.java
index 243939a9c07..a446a7617b6 100644
--- a/oak-run-commons/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/MongoTestBackend.java
+++ b/oak-run-commons/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/MongoTestBackend.java
@@ -18,7 +18,7 @@
  */
 package org.apache.jackrabbit.oak.index.indexer.document.flatfile.pipelined;
 
-import com.mongodb.MongoClientURI;
+import com.mongodb.ConnectionString;
 import com.mongodb.client.MongoDatabase;
 import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore;
 import org.apache.jackrabbit.oak.plugins.document.mongo.MongoDocumentStore;
@@ -27,12 +27,12 @@
 import java.io.IOException;
 
 class MongoTestBackend implements Closeable {
-    final MongoClientURI mongoClientURI;
+    final ConnectionString mongoClientURI;
     final MongoDocumentStore mongoDocumentStore;
     final DocumentNodeStore documentNodeStore;
     final MongoDatabase mongoDatabase;
 
-    public MongoTestBackend(MongoClientURI mongoClientURI, MongoDocumentStore mongoDocumentStore, DocumentNodeStore documentNodeStore, MongoDatabase mongoDatabase) {
+    public MongoTestBackend(ConnectionString mongoClientURI, MongoDocumentStore mongoDocumentStore, DocumentNodeStore documentNodeStore, MongoDatabase mongoDatabase) {
         this.mongoClientURI = mongoClientURI;
         this.mongoDocumentStore = mongoDocumentStore;
         this.documentNodeStore = documentNodeStore;
diff --git a/oak-run-commons/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelineITUtil.java b/oak-run-commons/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelineITUtil.java
index b5543a30fa6..020880f8b9e 100644
--- a/oak-run-commons/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelineITUtil.java
+++ b/oak-run-commons/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelineITUtil.java
@@ -18,7 +18,7 @@
  */
 package org.apache.jackrabbit.oak.index.indexer.document.flatfile.pipelined;
 
-import com.mongodb.MongoClientURI;
+import com.mongodb.ConnectionString;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.commons.Compression;
 import org.apache.jackrabbit.oak.plugins.document.DocumentMK;
@@ -179,7 +179,7 @@ static MongoTestBackend createNodeStore(boolean readOnly, MongoConnectionFactory
     }
 
     static MongoTestBackend createNodeStore(boolean readOnly, String mongoUri, DocumentMKBuilderProvider builderProvider) {
-        MongoClientURI mongoClientUri = new MongoClientURI(mongoUri);
+        ConnectionString mongoClientUri = new ConnectionString(mongoUri);
         DocumentMK.Builder builder = builderProvider.newBuilder();
         builder.setMongoDB(mongoUri, "oak", 0);
         if (readOnly) {
diff --git a/oak-run-commons/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelinedMongoDownloadTaskTest.java b/oak-run-commons/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelinedMongoDownloadTaskTest.java
index 7f4eb4a9476..36b74d2e7f8 100644
--- a/oak-run-commons/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelinedMongoDownloadTaskTest.java
+++ b/oak-run-commons/src/test/java/org/apache/jackrabbit/oak/index/indexer/document/flatfile/pipelined/PipelinedMongoDownloadTaskTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.jackrabbit.oak.index.indexer.document.flatfile.pipelined;
 
-import com.mongodb.MongoClient;
+import com.mongodb.MongoClientSettings;
 import com.mongodb.client.model.Filters;
 import org.apache.jackrabbit.oak.index.indexer.document.flatfile.pipelined.MongoRegexPathFilterFactory.MongoFilterPaths;
 import org.apache.jackrabbit.oak.plugins.document.NodeDocument;
@@ -336,8 +336,8 @@ private void assertBsonEquals(Bson actual, Bson expected) {
             throw new AssertionError("One of the bson is null. Actual: " + actual + ", expected: " + expected);
         }
         assertEquals(
-                actual.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry()),
-                expected.toBsonDocument(BsonDocument.class, MongoClient.getDefaultCodecRegistry())
+                actual.toBsonDocument(BsonDocument.class, MongoClientSettings.getDefaultCodecRegistry()),
+                expected.toBsonDocument(BsonDocument.class, MongoClientSettings.getDefaultCodecRegistry())
         );
     }
 
diff --git a/oak-run/pom.xml b/oak-run/pom.xml
index ff542d2e3d6..784f6511acf 100644
--- a/oak-run/pom.xml
+++ b/oak-run/pom.xml
@@ -296,7 +296,7 @@
     </dependency>
     <dependency>
       <groupId>org.mongodb</groupId>
-      <artifactId>mongo-java-driver</artifactId>
+      <artifactId>mongodb-driver-sync</artifactId>
     </dependency>
     <dependency>
       <groupId>org.mapdb</groupId>
diff --git a/oak-run/src/main/java/org/apache/jackrabbit/oak/run/DataStoreCheckCommand.java b/oak-run/src/main/java/org/apache/jackrabbit/oak/run/DataStoreCheckCommand.java
index facb06396c7..a6ddb3d32d2 100644
--- a/oak-run/src/main/java/org/apache/jackrabbit/oak/run/DataStoreCheckCommand.java
+++ b/oak-run/src/main/java/org/apache/jackrabbit/oak/run/DataStoreCheckCommand.java
@@ -50,9 +50,9 @@
 import org.apache.jackrabbit.guava.common.io.Closeables;
 import org.apache.jackrabbit.guava.common.io.Closer;
 import org.apache.jackrabbit.guava.common.io.Files;
-import com.mongodb.MongoClient;
-import com.mongodb.MongoClientURI;
-import com.mongodb.MongoURI;
+import com.mongodb.ConnectionString;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
 import joptsimple.ArgumentAcceptingOptionSpec;
 import joptsimple.OptionParser;
 import joptsimple.OptionSet;
@@ -185,9 +185,9 @@ static int checkDataStore(String... args) {
             NodeStore nodeStore = null;
             if (options.has(store)) {
                 String source = options.valueOf(store);
-                if (source.startsWith(MongoURI.MONGODB_PREFIX)) {
-                    MongoClientURI uri = new MongoClientURI(source);
-                    MongoClient client = new MongoClient(uri);
+                if (source.startsWith("mongodb://")) {
+                    ConnectionString uri = new ConnectionString(source);
+                    MongoClient client = MongoClients.create(uri);
                     DocumentNodeStore docNodeStore =
                         newMongoDocumentNodeStoreBuilder().setMongoDB(client, uri.getDatabase()).build();
                     closer.register(Utils.asCloseable(docNodeStore));
diff --git a/oak-run/src/main/java/org/apache/jackrabbit/oak/run/UnlockUpgradeCommand.java b/oak-run/src/main/java/org/apache/jackrabbit/oak/run/UnlockUpgradeCommand.java
index a266a84fd78..71766b23141 100644
--- a/oak-run/src/main/java/org/apache/jackrabbit/oak/run/UnlockUpgradeCommand.java
+++ b/oak-run/src/main/java/org/apache/jackrabbit/oak/run/UnlockUpgradeCommand.java
@@ -22,8 +22,7 @@
 
 import javax.sql.DataSource;
 
-import com.mongodb.MongoClientURI;
-
+import com.mongodb.ConnectionString;
 import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStoreBuilder;
 import org.apache.jackrabbit.oak.plugins.document.mongo.MongoDocumentNodeStoreBuilder;
 import org.apache.jackrabbit.oak.run.commons.Command;
@@ -38,7 +37,6 @@
 import joptsimple.OptionSet;
 import joptsimple.OptionSpec;
 
-import static com.mongodb.MongoURI.MONGODB_PREFIX;
 import static java.util.Arrays.asList;
 import static org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore.VERSION;
 
@@ -74,12 +72,12 @@ public void execute(String... args) throws Exception {
         DocumentStore store = null;
         try {
             String uri = nonOptions.get(0);
-            if (uri.startsWith(MONGODB_PREFIX)) {
-                MongoClientURI clientURI = new MongoClientURI(uri);
+            if (uri.startsWith("mongodb://")) {
+                ConnectionString clientURI = new ConnectionString(uri);
                 if (clientURI.getDatabase() == null) {
-                    System.err.println("Database missing in MongoDB URI: " + clientURI.getURI());
+                    System.err.println("Database missing in MongoDB URI: " + clientURI);
                 } else {
-                    MongoConnection mongo = new MongoConnection(clientURI.getURI());
+                    MongoConnection mongo = new MongoConnection(uri);
                     store = new MongoDocumentStore(
                             mongo.getMongoClient(), mongo.getDatabase(),
                             new MongoDocumentNodeStoreBuilder());
diff --git a/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java b/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java
index f202486bc9e..284e36c42e6 100644
--- a/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java
+++ b/oak-run/src/main/java/org/apache/jackrabbit/oak/run/Utils.java
@@ -17,7 +17,6 @@
 
 package org.apache.jackrabbit.oak.run;
 
-import static com.mongodb.MongoURI.MONGODB_PREFIX;
 import static java.util.Arrays.asList;
 import static java.util.Objects.isNull;
 import static java.util.Optional.empty;
@@ -67,12 +66,10 @@
 import org.apache.jackrabbit.oak.spi.blob.GarbageCollectableBlobStore;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.jetbrains.annotations.Nullable;
-
+import com.mongodb.ConnectionString;
 import org.apache.jackrabbit.guava.common.collect.Maps;
 import org.apache.jackrabbit.guava.common.io.Closer;
 import org.apache.jackrabbit.guava.common.io.Files;
-import com.mongodb.MongoClientURI;
-import com.mongodb.MongoURI;
 
 import joptsimple.ArgumentAcceptingOptionSpec;
 import joptsimple.OptionParser;
@@ -184,7 +181,7 @@ public static NodeStore bootstrapNodeStore(NodeStoreOptions options, Closer clos
             System.exit(1);
         }
 
-        if (src.startsWith(MongoURI.MONGODB_PREFIX) || src.startsWith("jdbc")) {
+        if (src.startsWith("mongodb://") || src.startsWith("jdbc")) {
             DocumentNodeStoreBuilder<?> builder = createDocumentMKBuilder(options, closer);
             if (builder != null) {
                 if (readOnlyMode) {
@@ -218,7 +215,7 @@ static DocumentNodeStoreBuilder<?> createDocumentMKBuilder(String[] args, Closer
 
     static Optional<MongoConnection> getMongoConnection(final NodeStoreOptions options, final Closer closer) {
         String src = options.getStoreArg();
-        if (isNull(src) || !src.startsWith(MONGODB_PREFIX)) {
+        if (isNull(src) || !src.startsWith("mongodb://")) {
             return empty();
         }
 
@@ -235,7 +232,7 @@ static DocumentNodeStoreBuilder<?> createDocumentMKBuilder(NodeStoreOptions opti
             System.exit(1);
         }
         DocumentNodeStoreBuilder<?> builder;
-        if (src.startsWith(MONGODB_PREFIX)) {
+        if (src.startsWith("mongodb://")) {
             MongoConnection mongo = getMongoConnection(closer, src);
             builder = newMongoDocumentNodeStoreBuilder().setMongoDB(mongo.getMongoClient(), mongo.getDBName());
         } else if (src.startsWith("jdbc")) {
@@ -262,12 +259,12 @@ static DocumentNodeStoreBuilder<?> createDocumentMKBuilder(NodeStoreOptions opti
     }
 
     private static MongoConnection getMongoConnection(Closer closer, String src) {
-        MongoClientURI uri = new MongoClientURI(src);
+        ConnectionString uri = new ConnectionString(src);
         if (uri.getDatabase() == null) {
-            System.err.println("Database missing in MongoDB URI: " + uri.getURI());
+            System.err.println("Database missing in MongoDB URI: " + uri);
             System.exit(1);
         }
-        MongoConnection mongo = new MongoConnection(uri.getURI());
+        MongoConnection mongo = new MongoConnection(src);
         closer.register(asCloseable(mongo));
         return mongo;
     }
diff --git a/oak-run/src/test/java/org/apache/jackrabbit/oak/index/DocumentStoreIndexerIT.java b/oak-run/src/test/java/org/apache/jackrabbit/oak/index/DocumentStoreIndexerIT.java
index 317c5bca738..8fea020b2a3 100644
--- a/oak-run/src/test/java/org/apache/jackrabbit/oak/index/DocumentStoreIndexerIT.java
+++ b/oak-run/src/test/java/org/apache/jackrabbit/oak/index/DocumentStoreIndexerIT.java
@@ -20,7 +20,7 @@
 package org.apache.jackrabbit.oak.index;
 
 import com.codahale.metrics.Counter;
-import com.mongodb.MongoClientURI;
+import com.mongodb.ConnectionString;
 import com.mongodb.client.MongoDatabase;
 import org.apache.jackrabbit.guava.common.collect.Iterators;
 import org.apache.jackrabbit.oak.InitialContent;
@@ -319,7 +319,7 @@ public void bundling() throws Exception {
         Whiteboard wb = new DefaultWhiteboard();
         MongoDocumentStore ds = (MongoDocumentStore) docBuilder.getDocumentStore();
         Registration r1 = wb.register(MongoDocumentStore.class, ds, emptyMap());
-        wb.register(MongoClientURI.class, c1.getMongoURI(), emptyMap());
+        wb.register(ConnectionString.class, c1.getMongoURI(), emptyMap());
         wb.register(StatisticsProvider.class, StatisticsProvider.NOOP, emptyMap());
         wb.register(IndexingReporter.class, IndexingReporter.NOOP, emptyMap());
         Registration c1Registration = wb.register(MongoDatabase.class, c1.getDatabase(), emptyMap());
@@ -408,7 +408,7 @@ public void metrics() throws Exception {
             wb.register(StatisticsProvider.class, metricsStatisticsProvider, emptyMap());
             wb.register(IndexingReporter.class, new ConsoleIndexingReporter(), emptyMap());
             Registration c1Registration = wb.register(MongoDatabase.class, mongoConnection.getDatabase(), emptyMap());
-            wb.register(MongoClientURI.class, mongoConnection.getMongoURI(), emptyMap());
+            wb.register(ConnectionString.class, mongoConnection.getMongoURI(), emptyMap());
 
             configureIndex(store);
 
diff --git a/oak-run/src/test/java/org/apache/jackrabbit/oak/index/IncrementalStoreTest.java b/oak-run/src/test/java/org/apache/jackrabbit/oak/index/IncrementalStoreTest.java
index 7dbe79b31f5..2345cad292f 100644
--- a/oak-run/src/test/java/org/apache/jackrabbit/oak/index/IncrementalStoreTest.java
+++ b/oak-run/src/test/java/org/apache/jackrabbit/oak/index/IncrementalStoreTest.java
@@ -20,7 +20,7 @@
 
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.mongodb.MongoClientURI;
+import com.mongodb.ConnectionString;
 import com.mongodb.client.MongoDatabase;
 import org.apache.commons.collections4.set.ListOrderedSet;
 import org.apache.commons.io.IOUtils;
@@ -723,13 +723,13 @@ private Backend createNodeStore(boolean readOnly) {
 
 
     static class Backend {
-        private final MongoClientURI mongoURI;
+        private final ConnectionString mongoURI;
         final MongoDocumentStore mongoDocumentStore;
         final DocumentNodeStore documentNodeStore;
         final MongoDatabase mongoDatabase;
         final BlobStore blobStore;
 
-        public Backend(MongoClientURI mongoURI, MongoDocumentStore mongoDocumentStore, DocumentNodeStore documentNodeStore, MongoDatabase mongoDatabase, BlobStore blobStore) {
+        public Backend(ConnectionString mongoURI, MongoDocumentStore mongoDocumentStore, DocumentNodeStore documentNodeStore, MongoDatabase mongoDatabase, BlobStore blobStore) {
             this.mongoURI = mongoURI;
             this.mongoDocumentStore = mongoDocumentStore;
             this.documentNodeStore = documentNodeStore;
diff --git a/oak-store-composite/pom.xml b/oak-store-composite/pom.xml
index f05dda244f8..195404bfcf6 100644
--- a/oak-store-composite/pom.xml
+++ b/oak-store-composite/pom.xml
@@ -212,7 +212,7 @@
     </dependency>
     <dependency>
       <groupId>org.mongodb</groupId>
-      <artifactId>mongo-java-driver</artifactId>
+      <artifactId>mongodb-driver-sync</artifactId>
       <optional>true</optional>
       <scope>test</scope>
     </dependency>
diff --git a/oak-store-document/pom.xml b/oak-store-document/pom.xml
index 8b299b2ee7c..41686c0d3e4 100644
--- a/oak-store-document/pom.xml
+++ b/oak-store-document/pom.xml
@@ -43,8 +43,8 @@
         <configuration>
           <instructions>
             <Import-Package>
-              com.mongodb*;version="[3.8, 4)";resolution:=optional,
-              org.bson*;version="[3.8, 4)";resolution:=optional,
+              com.mongodb*;version="[5.0, 5.2)";resolution:=optional,
+              org.bson*;version="[5.0, 5.2)";resolution:=optional,
               *
             </Import-Package>
             <Export-Package>
@@ -161,7 +161,7 @@
     <!-- Optional dependencies for different persistence backends -->
     <dependency>
       <groupId>org.mongodb</groupId>
-      <artifactId>mongo-java-driver</artifactId>
+      <artifactId>mongodb-driver-sync</artifactId>
       <optional>true</optional>
     </dependency>
 
diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java
index 115951f080e..1349fb8e17d 100644
--- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java
+++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java
@@ -53,7 +53,8 @@
 import org.apache.jackrabbit.guava.common.base.Strings;
 import org.apache.jackrabbit.guava.common.io.Closer;
 import org.apache.jackrabbit.guava.common.util.concurrent.UncheckedExecutionException;
-import com.mongodb.MongoClientURI;
+import com.mongodb.ConnectionString;
+import com.mongodb.MongoClientSettings;
 
 import org.apache.commons.io.FilenameUtils;
 import org.apache.jackrabbit.commons.SimpleValueFactory;
@@ -320,7 +321,11 @@ private void registerNodeStore() throws IOException {
             String db = config.db();
             boolean soKeepAlive = config.socketKeepAlive();
 
-            MongoClientURI mongoURI = new MongoClientURI(uri);
+            ConnectionString mongoURI = new ConnectionString(uri);
+            MongoClientSettings settings = MongoClientSettings.builder()
+                    .applyConnectionString(mongoURI)
+                    .build();
+
             String persistentCache = resolvePath(config.persistentCache(), DEFAULT_PERSISTENT_CACHE);
             String journalCache = resolvePath(config.journalCache(), DEFAULT_JOURNAL_CACHE);
 
@@ -328,12 +333,12 @@ private void registerNodeStore() throws IOException {
                 // Take care around not logging the uri directly as it
                 // might contain passwords
                 log.info("Starting DocumentNodeStore with host={}, db={}, cache size (MB)={}, persistentCache={}, " +
-                                "journalCache={}, blobCacheSize (MB)={}, maxReplicationLagInSecs={}, " +
-                                "clusterIdReuseDelayAfterRecoveryMillis={}, recoveryDelayMillis={}",
+                        "journalCache={}, blobCacheSize (MB)={}, maxReplicationLagInSecs={}, " +
+                        "clusterIdReuseDelayAfterRecoveryMillis={}, recoveryDelayMillis={}",
                         mongoURI.getHosts(), db, config.cache(), persistentCache,
                         journalCache, config.blobCacheSize(), config.maxReplicationLagInSecs(),
                         config.clusterIdReuseDelayAfterRecoveryMillis(), config.recoveryDelayMillis());
-                log.info("Mongo Connection details {}", MongoConnection.toString(mongoURI.getOptions()));
+                log.info("Mongo Connection details {}", MongoConnection.toString(settings));
             }
 
             MongoDocumentNodeStoreBuilder builder = newMongoDocumentNodeStoreBuilder();
@@ -478,35 +483,36 @@ private void configureBuilder(DocumentNodeStoreBuilder<?> builder) {
         String persistentCache = resolvePath(config.persistentCache(), DEFAULT_PERSISTENT_CACHE);
         String journalCache = resolvePath(config.journalCache(), DEFAULT_JOURNAL_CACHE);
         final Tracker<LeaseFailureHandler> leaseFailureHandlerTracker = whiteboard.track(LeaseFailureHandler.class);
-        builder.setStatisticsProvider(statisticsProvider).
-                setExecutor(executor).
-                memoryCacheSize(config.cache() * MB).
-                memoryCacheDistribution(
+        builder.setStatisticsProvider(statisticsProvider)
+                .setExecutor(executor)
+                .memoryCacheSize(config.cache() * MB)
+                .memoryCacheDistribution(
                         config.nodeCachePercentage(),
                         config.prevDocCachePercentage(),
                         config.childrenCachePercentage(),
-                        config.diffCachePercentage()).
-                setCacheSegmentCount(config.cacheSegmentCount()).
-                setCacheStackMoveDistance(config.cacheStackMoveDistance()).
-                setBundlingDisabled(config.bundlingDisabled()).
-                setJournalPropertyHandlerFactory(journalPropertyHandlerFactory).
-                setLeaseCheckMode(ClusterNodeInfo.DEFAULT_LEASE_CHECK_DISABLED ? LeaseCheckMode.DISABLED : LeaseCheckMode.valueOf(config.leaseCheckMode())).
-                setPrefetchFeature(prefetchFeature).
-                setDocStoreThrottlingFeature(docStoreThrottlingFeature).
-                setNoChildOrderCleanupFeature(noChildOrderCleanupFeature).
-                setCancelInvalidationFeature(cancelInvalidationFeature).
-                setDocStoreFullGCFeature(docStoreFullGCFeature).
-                setDocStoreEmbeddedVerificationFeature(docStoreEmbeddedVerificationFeature).
-                setThrottlingEnabled(config.throttlingEnabled()).
-                setFullGCEnabled(config.fullGCEnabled()).
-                setFullGCIncludePaths(config.fullGCIncludePaths()).
-                setFullGCExcludePaths(config.fullGCExcludePaths()).
-                setEmbeddedVerificationEnabled(config.embeddedVerificationEnabled()).
-                setFullGCMode(config.fullGCMode()).
-                setSuspendTimeoutMillis(config.suspendTimeoutMillis()).
-                setClusterIdReuseDelayAfterRecovery(config.clusterIdReuseDelayAfterRecoveryMillis()).
-                setRecoveryDelayMillis(config.recoveryDelayMillis()).
-                setLeaseFailureHandler(new LeaseFailureHandler() {
+                        config.diffCachePercentage())
+                .setCacheSegmentCount(config.cacheSegmentCount())
+                .setCacheStackMoveDistance(config.cacheStackMoveDistance())
+                .setBundlingDisabled(config.bundlingDisabled())
+                .setJournalPropertyHandlerFactory(journalPropertyHandlerFactory)
+                .setLeaseCheckMode(
+                        ClusterNodeInfo.DEFAULT_LEASE_CHECK_DISABLED ? LeaseCheckMode.DISABLED : LeaseCheckMode.valueOf(config.leaseCheckMode()))
+                .setPrefetchFeature(prefetchFeature)
+                .setDocStoreThrottlingFeature(docStoreThrottlingFeature)
+                .setNoChildOrderCleanupFeature(noChildOrderCleanupFeature)
+                .setCancelInvalidationFeature(cancelInvalidationFeature)
+                .setDocStoreFullGCFeature(docStoreFullGCFeature)
+                .setDocStoreEmbeddedVerificationFeature(docStoreEmbeddedVerificationFeature)
+                .setThrottlingEnabled(config.throttlingEnabled())
+                .setFullGCEnabled(config.fullGCEnabled())
+                .setFullGCIncludePaths(config.fullGCIncludePaths())
+                .setFullGCExcludePaths(config.fullGCExcludePaths())
+                .setEmbeddedVerificationEnabled(config.embeddedVerificationEnabled())
+                .setFullGCMode(config.fullGCMode())
+                .setSuspendTimeoutMillis(config.suspendTimeoutMillis())
+                .setClusterIdReuseDelayAfterRecovery(config.clusterIdReuseDelayAfterRecoveryMillis())
+                .setRecoveryDelayMillis(config.recoveryDelayMillis())
+                .setLeaseFailureHandler(new LeaseFailureHandler() {
 
                     private final LeaseFailureHandler defaultLeaseFailureHandler = createDefaultLeaseFailureHandler();
 
@@ -535,11 +541,11 @@ public void handleLeaseFailure() {
                             }
                         }
                     }
-                }).
-                setPrefetchExternalChanges(config.prefetchExternalChanges()).
-                setUpdateLimit(config.updateLimit()).
-                setJournalGCMaxAge(config.journalGCMaxAge()).
-                setNodeCachePathPredicate(createCachePredicate());
+                })
+                .setPrefetchExternalChanges(config.prefetchExternalChanges())
+                .setUpdateLimit(config.updateLimit())
+                .setJournalGCMaxAge(config.journalGCMaxAge())
+                .setNodeCachePathPredicate(createCachePredicate());
 
         if (!Strings.isNullOrEmpty(persistentCache)) {
             builder.setPersistentCache(persistentCache);
diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java
index c391c371114..4b0b5e304f2 100644
--- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java
+++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoBlobStore.java
@@ -39,7 +39,7 @@
 
 import org.apache.jackrabbit.guava.common.collect.AbstractIterator;
 import com.mongodb.BasicDBObject;
-import com.mongodb.MongoClient;
+import com.mongodb.MongoClientSettings;
 import com.mongodb.MongoException;
 import com.mongodb.client.MongoCollection;
 import com.mongodb.client.MongoCursor;
@@ -68,7 +68,7 @@ public class MongoBlobStore extends CachingBlobStore {
 
     private static final CodecRegistry CODEC_REGISTRY = fromRegistries(
             fromCodecs(new MongoBlobCodec()),
-            MongoClient.getDefaultCodecRegistry()
+            MongoClientSettings.getDefaultCodecRegistry()
     );
 
     private final ReadPreference defaultReadPreference;
diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDBConnection.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDBConnection.java
index 4ef0151f52d..6dfdda9f3d7 100644
--- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDBConnection.java
+++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDBConnection.java
@@ -17,14 +17,16 @@
 package org.apache.jackrabbit.oak.plugins.document.mongo;
 
 import com.mongodb.BasicDBObject;
-import com.mongodb.MongoClient;
-import com.mongodb.MongoClientOptions;
-import com.mongodb.MongoClientURI;
+import com.mongodb.ConnectionString;
+import com.mongodb.MongoClientSettings.Builder;
 import com.mongodb.ReadConcernLevel;
 import com.mongodb.client.ClientSession;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
 import com.mongodb.client.MongoCollection;
 import com.mongodb.client.MongoDatabase;
 
+import java.util.concurrent.TimeUnit;
 import org.apache.jackrabbit.oak.plugins.document.util.MongoConnection;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
@@ -34,8 +36,7 @@
 import static org.apache.jackrabbit.oak.plugins.document.util.MongoConnection.readConcernLevel;
 
 /**
- * Simple struct that contains {@code MongoClient}, {@code MongoDatabase} and
- * {@code MongoStatus}.
+ * Simple struct that contains {@code MongoClient}, {@code MongoDatabase} and {@code MongoStatus}.
  */
 final class MongoDBConnection {
 
@@ -64,17 +65,25 @@ static MongoDBConnection newMongoDBConnection(@NotNull String uri,
                                                   int socketTimeout,
                                                   boolean socketKeepAlive) {
         CompositeServerMonitorListener serverMonitorListener = new CompositeServerMonitorListener();
-        MongoClientOptions.Builder options = MongoConnection.getDefaultBuilder();
-        options.addServerMonitorListener(serverMonitorListener);
-        options.socketKeepAlive(socketKeepAlive);
-        if (socketTimeout > 0) {
-            options.socketTimeout(socketTimeout);
-        }
-        MongoClient client = new MongoClient(new MongoClientURI(uri, options));
+
+        ConnectionString connectionString = new ConnectionString(uri);
+        Builder options = MongoConnection.getDefaultBuilder();
+        options.applyConnectionString(connectionString);
+        options.applyToServerSettings(builder -> builder.addServerMonitorListener(serverMonitorListener));
+        options.applyToSocketSettings(builder -> {
+            // It's not possible anymore setting keepalive, it was deprecated since at least 3.6.0 version
+            // builder.keepAlive(socketKeepAlive);
+            if (socketTimeout > 0) {
+                builder.readTimeout(socketTimeout, TimeUnit.MILLISECONDS);
+            }
+        });
+
+        MongoClient client = MongoClients.create(options.build());
+
         MongoStatus status = new MongoStatus(client, name);
         serverMonitorListener.addListener(status);
         MongoDatabase db = client.getDatabase(name);
-        if (!MongoConnection.hasWriteConcern(uri)) {
+        if (MongoConnection.hasMongoDbDefaultWriteConcern(uri)) {
             db = db.withWriteConcern(MongoConnection.getDefaultWriteConcern(client));
         }
         if (status.isMajorityReadConcernSupported()
diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentNodeStoreBuilderBase.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentNodeStoreBuilderBase.java
index 46f6f7decdf..24ea29c3797 100644
--- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentNodeStoreBuilderBase.java
+++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentNodeStoreBuilderBase.java
@@ -18,7 +18,7 @@
 
 import java.util.concurrent.TimeUnit;
 
-import com.mongodb.MongoClient;
+import com.mongodb.client.MongoClient;
 
 import org.apache.jackrabbit.oak.plugins.blob.ReferencedBlob;
 import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore;
diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
index baaaf8b9aef..11bc8e83833 100644
--- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
+++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStore.java
@@ -37,6 +37,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.locks.Lock;
+import java.util.function.Consumer;
 import java.util.stream.StreamSupport;
 
 import org.apache.jackrabbit.guava.common.base.Stopwatch;
@@ -45,20 +46,9 @@
 import org.apache.jackrabbit.guava.common.collect.Iterables;
 import org.apache.jackrabbit.guava.common.collect.Iterators;
 import org.apache.jackrabbit.guava.common.collect.Lists;
+import org.apache.jackrabbit.guava.common.collect.Maps;
 import org.apache.jackrabbit.guava.common.io.Closeables;
 import org.apache.jackrabbit.guava.common.util.concurrent.AtomicDouble;
-import com.mongodb.Block;
-import com.mongodb.DBObject;
-import com.mongodb.MongoBulkWriteException;
-import com.mongodb.MongoWriteException;
-import com.mongodb.MongoCommandException;
-import com.mongodb.WriteError;
-import com.mongodb.MongoClient;
-import com.mongodb.MongoClientURI;
-import com.mongodb.ReadPreference;
-
-import com.mongodb.client.model.CreateCollectionOptions;
-
 import org.apache.jackrabbit.guava.common.util.concurrent.UncheckedExecutionException;
 import org.apache.jackrabbit.oak.cache.CacheStats;
 import org.apache.jackrabbit.oak.cache.CacheValue;
@@ -93,20 +83,28 @@
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
-import org.apache.jackrabbit.guava.common.collect.Maps;
 import com.mongodb.BasicDBObject;
+import com.mongodb.ConnectionString;
+import com.mongodb.DBObject;
+import com.mongodb.MongoBulkWriteException;
+import com.mongodb.MongoClientSettings;
+import com.mongodb.MongoCommandException;
 import com.mongodb.MongoException;
+import com.mongodb.MongoWriteException;
+import com.mongodb.ReadPreference;
 import com.mongodb.WriteConcern;
+import com.mongodb.WriteError;
 import com.mongodb.bulk.BulkWriteError;
 import com.mongodb.bulk.BulkWriteResult;
 import com.mongodb.bulk.BulkWriteUpsert;
 import com.mongodb.client.ClientSession;
 import com.mongodb.client.FindIterable;
+import com.mongodb.client.MongoClient;
 import com.mongodb.client.MongoCollection;
 import com.mongodb.client.MongoCursor;
 import com.mongodb.client.MongoDatabase;
 import com.mongodb.client.model.BulkWriteOptions;
+import com.mongodb.client.model.CreateCollectionOptions;
 import com.mongodb.client.model.Filters;
 import com.mongodb.client.model.FindOneAndUpdateOptions;
 import com.mongodb.client.model.ReturnDocument;
@@ -689,7 +687,7 @@ protected <T extends Document> T findUncached(Collection<T> collection, String k
             ReadPreference readPreference = getMongoReadPreference(collection, null, docReadPref);
             MongoCollection<BasicDBObject> dbCollection = getDBCollection(collection, readPreference);
 
-            if(readPreference.isSlaveOk()){
+            if (readPreference.isSecondaryOk()) {
                 LOG.trace("Routing call to secondary for fetching [{}]", key);
                 isSlaveOk = true;
             }
@@ -835,7 +833,7 @@ && canUseModifiedTimeIdx(startValue)) {
             ReadPreference readPreference =
                     getMongoReadPreference(collection, parentId, getDefaultReadPreference(collection));
 
-            if(readPreference.isSlaveOk()){
+            if (readPreference.isSecondaryOk()) {
                 isSlaveOk = true;
                 LOG.trace("Routing call to secondary for fetching children from [{}] to [{}]", fromKey, toKey);
             }
@@ -1539,12 +1537,7 @@ private <T extends Document> Map<String, T> findDocuments(Collection<T> collecti
                     conditions.add(getByKeyQuery(key));
                 }
                 MongoCollection<BasicDBObject> dbCollection;
-                if (secondariesWithinAcceptableLag()) {
-                    dbCollection = getDBCollection(collection);
-                } else {
-                    lagTooHigh();
-                    dbCollection = getDBCollection(collection).withReadPreference(ReadPreference.primary());
-                }
+                dbCollection = getDBCollection(collection);
                 execute(session -> {
                     FindIterable<BasicDBObject> cursor;
                     if (session != null) {
@@ -1574,12 +1567,7 @@ private <T extends Document> Map<String, T> findDocumentsOneByOne(Collection<T>
             Bson condition = getByKeyQuery(key);
 
             MongoCollection<BasicDBObject> dbCollection;
-            if (secondariesWithinAcceptableLag()) {
-                dbCollection = getDBCollection(collection);
-            } else {
-                lagTooHigh();
-                dbCollection = getDBCollection(collection).withReadPreference(ReadPreference.primary());
-            }
+           dbCollection = getDBCollection(collection);
             execute(session -> {
                 FindIterable<BasicDBObject> cursor;
                 if (session != null) {
@@ -1774,7 +1762,7 @@ public <T extends Document> void prefetch(Collection<T> collection,
             ReadPreference readPreference = getMongoReadPreference(collection, null, getDefaultReadPreference(collection));
             MongoCollection<BasicDBObject> dbCollection = getDBCollection(collection, readPreference);
 
-            if (readPreference.isSlaveOk()) {
+            if (readPreference.isSecondaryOk()) {
                 LOG.trace("Routing call to secondary for prefetching [{}]", keys);
             }
 
@@ -1855,8 +1843,9 @@ private Map<String, ModificationStamp> getModStamps(Iterable<String> keys)
         Map<String, ModificationStamp> modCounts = Maps.newHashMap();
 
         nodes.withReadPreference(ReadPreference.primary())
-                .find(Filters.in(Document.ID, keys)).projection(fields)
-                .forEach((Block<BasicDBObject>) obj -> {
+                .find(Filters.in(Document.ID, keys))
+                .projection(fields)
+                .forEach((Consumer<? super BasicDBObject>) obj -> {
                     String id = (String) obj.get(Document.ID);
                     Long modCount = Utils.asLong((Number) obj.get(Document.MOD_COUNT));
                     if (modCount == null) {
@@ -1902,10 +1891,10 @@ <T extends Document> ReadPreference getMongoReadPreference(@NotNull Collection<T
             case PREFER_PRIMARY :
                 return ReadPreference.primaryPreferred();
             case PREFER_SECONDARY :
-                if (!withClientSession() || secondariesWithinAcceptableLag()) {
+                if (!withClientSession()) {
                     return getConfiguredReadPreference(collection);
                 } else {
-                    lagTooHigh();
+                    LOG.debug("Asked PREFER_SECONDARY but return \"primary\" because client session is unsupported or disabled by configuration");
                     return ReadPreference.primary();
                 }
             case PREFER_SECONDARY_IF_OLD_ENOUGH:
@@ -1914,7 +1903,7 @@ <T extends Document> ReadPreference getMongoReadPreference(@NotNull Collection<T
                 }
 
                 boolean secondarySafe;
-                if (withClientSession() && secondariesWithinAcceptableLag()) {
+                if (withClientSession()) {
                     secondarySafe = true;
                 } else {
                    // This is not quite accurate, because ancestors
@@ -2213,15 +2202,20 @@ public void setReadWriteMode(String readWriteMode) {
             if(!readWriteMode.startsWith("mongodb://")){
                 rwModeUri = String.format("mongodb://localhost/?%s", readWriteMode);
             }
-            MongoClientURI uri = new MongoClientURI(rwModeUri);
-            ReadPreference readPref = uri.getOptions().getReadPreference();
+            ConnectionString connectionString = new ConnectionString(rwModeUri);
+
+            // Build MongoClientSettings from ConnectionString
+            MongoClientSettings settings = MongoClientSettings.builder()
+                 .applyConnectionString(connectionString)
+                 .build();
+            ReadPreference readPref = settings.getReadPreference();
 
             if (!readPref.equals(nodes.getReadPreference())) {
                 nodes = nodes.withReadPreference(readPref);
                 LOG.info("Using ReadPreference {} ", readPref);
             }
 
-            WriteConcern writeConcern = uri.getOptions().getWriteConcern();
+            WriteConcern writeConcern = settings.getWriteConcern();
             if (!writeConcern.equals(nodes.getWriteConcern())) {
                 nodes = nodes.withWriteConcern(writeConcern);
                 LOG.info("Using WriteConcern " + writeConcern);
@@ -2345,11 +2339,6 @@ private boolean withClientSession() {
         return connection.getStatus().isClientSessionSupported() && useClientSession;
     }
 
-    private boolean secondariesWithinAcceptableLag() {
-        return getClient().getReplicaSetStatus() == null
-                || connection.getStatus().getReplicaSetLagEstimate() < acceptableLagMillis;
-    }
-
     private void lagTooHigh() {
         LOG.debug("Read from secondary is preferred but replication lag is too high. Directing read to primary.");
     }
diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoSessionFactory.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoSessionFactory.java
index dbf631e58e2..a9f5fe98713 100644
--- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoSessionFactory.java
+++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoSessionFactory.java
@@ -17,11 +17,12 @@
 package org.apache.jackrabbit.oak.plugins.document.mongo;
 
 import com.mongodb.ClientSessionOptions;
-import com.mongodb.MongoClient;
+import com.mongodb.client.MongoClient;
 import com.mongodb.ServerAddress;
 import com.mongodb.TransactionOptions;
 import com.mongodb.client.ClientSession;
 import com.mongodb.client.TransactionBody;
+import com.mongodb.internal.TimeoutContext;
 import com.mongodb.session.ServerSession;
 
 import org.bson.BsonDocument;
@@ -146,11 +147,6 @@ public ServerAddress getPinnedServerAddress() {
             return session.getPinnedServerAddress();
         }
 
-        @Override
-        public void setPinnedServerAddress(ServerAddress address) {
-            session.setPinnedServerAddress(address);
-        }
-
         @NotNull
         @Override
         public <T> T withTransaction(@NotNull TransactionBody<T> transactionBody) {
@@ -179,5 +175,43 @@ public void close() {
             clock.advanceSessionAndClock(session);
             session.close();
         }
+
+        @Override
+        public Object getTransactionContext() {
+            return session.getTransactionContext();
+        }
+
+        @Override
+        public void setTransactionContext(ServerAddress address, Object transactionContext) {
+            session.setTransactionContext(address, transactionContext);
+
+        }
+
+        @Override
+        public void clearTransactionContext() {
+            session.clearTransactionContext();
+
+        }
+
+        @Override
+        public void setSnapshotTimestamp(BsonTimestamp snapshotTimestamp) {
+            session.setSnapshotTimestamp(snapshotTimestamp);
+
+        }
+
+        @Override
+        public BsonTimestamp getSnapshotTimestamp() {
+            return session.getSnapshotTimestamp();
+        }
+
+        @Override
+        public TimeoutContext getTimeoutContext() {
+            return session.getTimeoutContext();
+        }
+
+        @Override
+        public void notifyOperationInitiated(Object operation) {
+            session.notifyOperationInitiated(operation);
+        }
     }
 }
diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoStatus.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoStatus.java
index 5ed5b7d5f2d..6d355bdc3d4 100644
--- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoStatus.java
+++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoStatus.java
@@ -20,7 +20,7 @@
 import org.apache.jackrabbit.guava.common.collect.Maps;
 import com.mongodb.BasicDBObject;
 import com.mongodb.ClientSessionOptions;
-import com.mongodb.MongoClient;
+import com.mongodb.client.MongoClient;
 import com.mongodb.MongoClientException;
 import com.mongodb.MongoCommandException;
 import com.mongodb.MongoQueryException;
diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoVersionGCSupport.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoVersionGCSupport.java
index 6d741bf578a..69395abc3aa 100644
--- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoVersionGCSupport.java
+++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoVersionGCSupport.java
@@ -18,20 +18,21 @@
  */
 package org.apache.jackrabbit.oak.plugins.document.mongo;
 
+import static com.mongodb.client.model.Filters.and;
 import static com.mongodb.client.model.Filters.eq;
 import static com.mongodb.client.model.Filters.exists;
 import static com.mongodb.client.model.Filters.gt;
+import static com.mongodb.client.model.Filters.lt;
 import static com.mongodb.client.model.Filters.or;
 import static com.mongodb.client.model.Projections.include;
+
+import static java.util.Collections.emptyList;
 import static com.mongodb.client.model.Sorts.ascending;
 import static java.util.Optional.empty;
 import static java.util.Optional.ofNullable;
 import static org.apache.jackrabbit.guava.common.collect.Iterables.concat;
 import static org.apache.jackrabbit.guava.common.collect.Iterables.filter;
 import static org.apache.jackrabbit.guava.common.collect.Iterables.transform;
-import static com.mongodb.client.model.Filters.and;
-import static com.mongodb.client.model.Filters.lt;
-import static java.util.Collections.emptyList;
 import static org.apache.jackrabbit.oak.plugins.document.Collection.NODES;
 import static org.apache.jackrabbit.oak.plugins.document.Document.ID;
 import static org.apache.jackrabbit.oak.plugins.document.NodeDocument.DELETED_ONCE;
@@ -51,9 +52,8 @@
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Pattern;
-
-import com.mongodb.client.MongoCursor;
-
+import org.apache.jackrabbit.guava.common.base.Joiner;
+import org.apache.jackrabbit.guava.common.collect.Lists;
 import org.apache.jackrabbit.oak.commons.json.JsopBuilder;
 import org.apache.jackrabbit.oak.plugins.document.Document;
 import org.apache.jackrabbit.oak.plugins.document.NodeDocument;
@@ -72,14 +72,12 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.jackrabbit.guava.common.base.Joiner;
-
-import org.apache.jackrabbit.guava.common.collect.Lists;
 import com.mongodb.BasicDBObject;
-import com.mongodb.Block;
 import com.mongodb.client.FindIterable;
 import com.mongodb.client.MongoCollection;
+import com.mongodb.client.MongoCursor;
 import com.mongodb.client.model.Filters;
+import com.mongodb.client.model.Sorts;
 
 /**
  * Mongo specific version of VersionGCSupport which uses mongo queries
@@ -259,6 +257,7 @@ public Iterable<NodeDocument> getModifiedDocs(final long fromModified, final lon
                         and(gt(MODIFIED_IN_SECS, getModifiedInSecs(fromModified)), lt(MODIFIED_IN_SECS, getModifiedInSecs(toModified)))));
 
         // first sort by _modified and then by _id
+
         final Bson sort = ascending(MODIFIED_IN_SECS, ID);
 
         logQueryExplain("fullGC query explain details, hint : {} - explain : {}", query, modifiedIdHint);
@@ -345,19 +344,17 @@ protected Iterable<NodeDocument> identifyGarbage(final Set<SplitDocType> gcTypes
     public long getOldestDeletedOnceTimestamp(Clock clock, long precisionMs) {
         LOG.debug("getOldestDeletedOnceTimestamp() <- start");
         Bson query = Filters.eq(DELETED_ONCE, Boolean.TRUE);
+
         Bson sort = ascending(MODIFIED_IN_SECS);
         List<Long> result = new ArrayList<>(1);
         getNodeCollection().find(query).sort(sort).limit(1).forEach(
-                new Block<BasicDBObject>() {
-            @Override
-            public void apply(BasicDBObject document) {
+                document -> {
                 NodeDocument doc = store.convertFromDBObject(NODES, document);
                 long modifiedMs = doc.getModified() * TimeUnit.SECONDS.toMillis(1);
                 if (LOG.isDebugEnabled()) {
                     LOG.debug("getOldestDeletedOnceTimestamp() -> {}", Utils.timestampToString(modifiedMs));
                 }
                 result.add(modifiedMs);
-            }
         });
         if (result.isEmpty()) {
             LOG.debug("getOldestDeletedOnceTimestamp() -> none found, return current time");
@@ -374,6 +371,7 @@ public void apply(BasicDBObject document) {
      */
     @Override
     public Optional<NodeDocument> getOldestModifiedDoc(final Clock clock) {
+
         // we need to add query condition to ignore `previous` documents which doesn't have this field
         final Bson query = exists(MODIFIED_IN_SECS);
         // sort by MODIFIED_IN_SECS first, ID otherwise
@@ -460,7 +458,7 @@ private void logSplitDocIdsTobeDeleted(Bson query) {
         getNodeCollection()
                 .withReadPreference(store.getConfiguredReadPreference(NODES))
                 .find(query).projection(keys)
-                .forEach((Block<BasicDBObject>) doc -> ids.add(getID(doc)));
+                .forEach(doc -> ids.add(getID(doc)));
 
         StringBuilder sb = new StringBuilder("Split documents with following ids were deleted as part of GC \n");
         Joiner.on(System.getProperty("line.separator")).appendTo(sb, ids);
diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/ReplicaSetStatus.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/ReplicaSetStatus.java
index 41a45911b04..452c6c059ff 100644
--- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/ReplicaSetStatus.java
+++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/ReplicaSetStatus.java
@@ -30,7 +30,7 @@
 
 import com.mongodb.ServerAddress;
 import com.mongodb.event.ServerHeartbeatSucceededEvent;
-import com.mongodb.event.ServerMonitorListenerAdapter;
+import com.mongodb.event.ServerMonitorListener;
 
 import org.bson.BsonArray;
 import org.bson.BsonDocument;
@@ -47,7 +47,7 @@
  * operations shouldn't be sent to a secondary when it lags too much behind,
  * otherwise the read operation will block until it was able to catch up.
  */
-public class ReplicaSetStatus extends ServerMonitorListenerAdapter {
+public class ReplicaSetStatus implements ServerMonitorListener {
 
     private static final Logger LOG = LoggerFactory.getLogger(ReplicaSetStatus.class);
 
diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/RevisionEntry.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/RevisionEntry.java
index bdc6fcc0440..2c7d777d0a7 100644
--- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/RevisionEntry.java
+++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/mongo/RevisionEntry.java
@@ -27,7 +27,6 @@
 
 import com.mongodb.BasicDBObject;
 import com.mongodb.DBObject;
-import com.mongodb.util.JSON;
 
 import static java.util.Objects.requireNonNull;
 
@@ -86,11 +85,6 @@ public Object removeField(String key) {
         throw new UnsupportedOperationException();
     }
 
-    @Override
-    public boolean containsKey(String s) {
-        return containsField(s);
-    }
-
     @Override
     public boolean containsField(String s) {
         return revision.toString().equals(s);
diff --git a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/MongoConnection.java b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/MongoConnection.java
index 8a9b7c8b06f..da145439da2 100644
--- a/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/MongoConnection.java
+++ b/oak-store-document/src/main/java/org/apache/jackrabbit/oak/plugins/document/util/MongoConnection.java
@@ -21,15 +21,21 @@
 import java.util.concurrent.TimeUnit;
 
 import org.apache.jackrabbit.guava.common.base.MoreObjects;
-import org.apache.jackrabbit.guava.common.collect.ImmutableSet;
-import com.mongodb.MongoClient;
-import com.mongodb.MongoClientOptions;
-import com.mongodb.MongoClientURI;
+import com.mongodb.ConnectionString;
+import com.mongodb.MongoClientSettings;
+import com.mongodb.MongoClientSettings.Builder;
 import com.mongodb.MongoException;
 import com.mongodb.ReadConcern;
 import com.mongodb.ReadConcernLevel;
 import com.mongodb.WriteConcern;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
 import com.mongodb.client.MongoDatabase;
+import com.mongodb.connection.ClusterDescription;
+import com.mongodb.connection.ClusterType;
+import com.mongodb.connection.ConnectionPoolSettings;
+import com.mongodb.connection.ServerSettings;
+import com.mongodb.connection.SocketSettings;
 
 import static java.util.Objects.requireNonNull;
 
@@ -42,9 +48,12 @@ public class MongoConnection {
 
     private static final int DEFAULT_MAX_WAIT_TIME = (int) TimeUnit.MINUTES.toMillis(1);
     private static final int DEFAULT_HEARTBEAT_FREQUENCY_MS = (int) TimeUnit.SECONDS.toMillis(5);
+    
+    // TODO why using a non-sense "w"? values for w should those listed in the head comment of WriteConcern...
     private static final WriteConcern WC_UNKNOWN = new WriteConcern("unknown");
+    
     private static final Set<ReadConcernLevel> REPLICA_RC = Set.of(ReadConcernLevel.MAJORITY, ReadConcernLevel.LINEARIZABLE);
-    private final MongoClientURI mongoURI;
+    private final ConnectionString mongoURI;
     private final MongoClient mongo;
 
     /**
@@ -66,10 +75,13 @@ public MongoConnection(String uri) throws MongoException {
      * @param builder the client option defaults.
      * @throws MongoException if there are failures
      */
-    public MongoConnection(String uri, MongoClientOptions.Builder builder)
+    public MongoConnection(String uri, MongoClientSettings.Builder builder)
             throws MongoException {
-        mongoURI = new MongoClientURI(uri, builder);
-        mongo = new MongoClient(mongoURI);
+
+        mongoURI = new ConnectionString(uri);
+        builder.applyConnectionString(mongoURI);
+        MongoClientSettings settings = builder.build();
+        mongo = MongoClients.create(settings);
     }
 
     /**
@@ -92,15 +104,19 @@ public MongoConnection(String host, int port, String database)
      * @param client the already connected client.
      */
     public MongoConnection(String uri, MongoClient client) {
-        mongoURI = new MongoClientURI(uri, MongoConnection.getDefaultBuilder());
-        mongo = client;
+
+        Builder defaultBuilder = MongoConnection.getDefaultBuilder();
+        mongoURI = new ConnectionString(uri);
+        defaultBuilder.applyConnectionString(mongoURI);
+        MongoClientSettings settings = defaultBuilder.build();
+        mongo = MongoClients.create(settings);
     }
 
     /**
      *
      * @return the {@link MongoClientURI} for this connection
      */
-    public MongoClientURI getMongoURI() {
+    public ConnectionString getMongoURI() {
         return mongoURI;
     }
 
@@ -151,26 +167,33 @@ public void close() {
      *
      * @return builder with default options set
      */
-    public static MongoClientOptions.Builder getDefaultBuilder() {
-        return new MongoClientOptions.Builder()
-                .description("MongoConnection for Oak DocumentMK")
-                .maxWaitTime(DEFAULT_MAX_WAIT_TIME)
-                .heartbeatFrequency(DEFAULT_HEARTBEAT_FREQUENCY_MS)
-                .threadsAllowedToBlockForConnectionMultiplier(100);
+    public static MongoClientSettings.Builder getDefaultBuilder() {
+        return MongoClientSettings.builder()
+                .applicationName("MongoConnection for Oak DocumentMK")
+                .applyToConnectionPoolSettings(builder -> builder
+                        .maxWaitTime(DEFAULT_MAX_WAIT_TIME, java.util.concurrent.TimeUnit.MILLISECONDS))
+                .applyToServerSettings(builder -> builder
+                        .heartbeatFrequency(DEFAULT_HEARTBEAT_FREQUENCY_MS, java.util.concurrent.TimeUnit.MILLISECONDS))
+                .applyToConnectionPoolSettings(builder -> builder
+                        .maxSize(100));
     }
 
-    public static String toString(MongoClientOptions opts) {
-        return MoreObjects.toStringHelper(opts)
-                .add("connectionsPerHost", opts.getConnectionsPerHost())
-                .add("connectTimeout", opts.getConnectTimeout())
-                .add("socketTimeout", opts.getSocketTimeout())
-                .add("socketKeepAlive", opts.isSocketKeepAlive())
-                .add("maxWaitTime", opts.getMaxWaitTime())
-                .add("heartbeatFrequency", opts.getHeartbeatFrequency())
-                .add("threadsAllowedToBlockForConnectionMultiplier",
-                        opts.getThreadsAllowedToBlockForConnectionMultiplier())
-                .add("readPreference", opts.getReadPreference().getName())
-                .add("writeConcern", opts.getWriteConcern())
+    public static String toString(MongoClientSettings settings) {
+        ConnectionPoolSettings poolSettings = settings.getConnectionPoolSettings();
+        SocketSettings socketSettings = settings.getSocketSettings();
+        ServerSettings serverSettings = settings.getServerSettings();
+
+        return MoreObjects.toStringHelper(settings)
+                .add("connectionsPerHost", poolSettings.getMaxSize())
+                .add("connectTimeout", socketSettings.getConnectTimeout(java.util.concurrent.TimeUnit.MILLISECONDS))
+                .add("socketTimeout", socketSettings.getReadTimeout(java.util.concurrent.TimeUnit.MILLISECONDS))
+                .add("socketKeepAlive", "Unavailable in MongoClientSettings")
+                .add("maxWaitTime", poolSettings.getMaxWaitTime(java.util.concurrent.TimeUnit.MILLISECONDS))
+                .add("heartbeatFrequency", serverSettings.getHeartbeatFrequency(java.util.concurrent.TimeUnit.MILLISECONDS))
+                .add("threadsAllowedToBlockForConnectionMultiplier", "Handled via maxSize in connection pool")
+                .add("readPreference", settings.getReadPreference()
+                        .getName())
+                .add("writeConcern", settings.getWriteConcern())
                 .toString();
     }
 
@@ -180,12 +203,14 @@ public static String toString(MongoClientOptions opts) {
      * @return {@code true} if the URI has a write concern set, {@code false}
      *      otherwise.
      */
-    public static boolean hasWriteConcern(@NotNull String uri) {
-        MongoClientOptions.Builder builder = MongoClientOptions.builder();
-        builder.writeConcern(WC_UNKNOWN);
-        WriteConcern wc = new MongoClientURI(requireNonNull(uri), builder)
-                .getOptions().getWriteConcern();
-        return !WC_UNKNOWN.equals(wc);
+    public static boolean hasMongoDbDefaultWriteConcern(@NotNull String uri) {
+        ConnectionString connectionString = new ConnectionString(requireNonNull(uri));
+        MongoClientSettings.Builder builder = MongoClientSettings.builder()
+                .applyConnectionString(connectionString);
+        MongoClientSettings settings = builder.build();
+
+        // ACKNOWLEDGE is the default of MongoClientSettings.Builder while the default of ConnectionString would be UNACKNOWLEDGED
+        return WriteConcern.ACKNOWLEDGED.equals(settings.getWriteConcern());
     }
 
     /**
@@ -195,9 +220,12 @@ public static boolean hasWriteConcern(@NotNull String uri) {
      *      otherwise.
      */
     public static boolean hasReadConcern(@NotNull String uri) {
-        ReadConcern rc = new MongoClientURI(requireNonNull(uri))
-                .getOptions().getReadConcern();
-        return readConcernLevel(rc) != null;
+        ConnectionString connectionString = new ConnectionString(requireNonNull(uri));
+        MongoClientSettings.Builder builder = MongoClientSettings.builder()
+                .applyConnectionString(connectionString);
+        MongoClientSettings settings = builder.build();
+
+        return readConcernLevel(settings.getReadConcern()) != null;
     }
 
     /**
@@ -211,13 +239,13 @@ public static boolean hasReadConcern(@NotNull String uri) {
      * @return the default write concern to use for Oak.
      */
     public static WriteConcern getDefaultWriteConcern(@NotNull MongoClient client) {
-        WriteConcern w;
-        if (client.getReplicaSetStatus() != null) {
-            w = WriteConcern.MAJORITY;
+        ClusterDescription clusterDescription = client.getClusterDescription();
+
+        if (clusterDescription.getType() == ClusterType.REPLICA_SET) {
+            return WriteConcern.MAJORITY;
         } else {
-            w = WriteConcern.ACKNOWLEDGED;
+            return WriteConcern.ACKNOWLEDGED;
         }
-        return w;
     }
 
     /**
@@ -233,7 +261,10 @@ public static WriteConcern getDefaultWriteConcern(@NotNull MongoClient client) {
     public static ReadConcern getDefaultReadConcern(@NotNull MongoClient client,
                                                     @NotNull MongoDatabase db) {
         ReadConcern r;
-        if (requireNonNull(client).getReplicaSetStatus() != null && isMajorityWriteConcern(db)) {
+
+        ClusterDescription clusterDescription = requireNonNull(client).getClusterDescription();
+
+        if (clusterDescription.getType() == ClusterType.REPLICA_SET && isMajorityWriteConcern(db)) {
             r = ReadConcern.MAJORITY;
         } else {
             r = ReadConcern.LOCAL;
@@ -276,7 +307,9 @@ public static boolean isSufficientWriteConcern(@NotNull MongoClient client,
             throw new IllegalArgumentException(
                     "Unknown write concern: " + wc);
         }
-        if (client.getReplicaSetStatus() != null) {
+
+        ClusterDescription clusterDescription = client.getClusterDescription();
+        if (clusterDescription.getType() == ClusterType.REPLICA_SET) {
             return w >= 2;
         } else {
             return w >= 1;
@@ -295,7 +328,8 @@ public static boolean isSufficientWriteConcern(@NotNull MongoClient client,
     public static boolean isSufficientReadConcern(@NotNull MongoClient client,
                                                   @NotNull ReadConcern rc) {
         ReadConcernLevel r = readConcernLevel(requireNonNull(rc));
-        if (client.getReplicaSetStatus() == null) {
+        ClusterDescription clusterDescription = client.getClusterDescription();
+        if (clusterDescription.getType() != ClusterType.REPLICA_SET) {
             return true;
         } else {
             return Objects.nonNull(r) && REPLICA_RC.contains(r);
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/fixture/DocumentMongoFixture.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/fixture/DocumentMongoFixture.java
index e87f76ffb04..9446666d86f 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/fixture/DocumentMongoFixture.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/fixture/DocumentMongoFixture.java
@@ -34,8 +34,10 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.mongodb.MongoClient;
-import com.mongodb.MongoClientURI;
+import com.mongodb.ConnectionString;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
+import com.mongodb.client.MongoDatabase;
 
 public class DocumentMongoFixture extends NodeStoreFixture {
 
@@ -83,11 +85,11 @@ public NodeStore createNodeStore() {
     }
 
     protected MongoClient createClient() {
-        return new MongoClient(new MongoClientURI(uri));
+        return MongoClients.create(uri);
     }
 
     protected String getDBName(String suffix) {
-        String dbName = new MongoClientURI(uri).getDatabase();
+        String dbName = new ConnectionString(uri).getDatabase();
         return dbName + "-" + suffix;
     }
 
@@ -110,7 +112,8 @@ public void dispose(NodeStore nodeStore) {
         String suffix = suffixes.remove(nodeStore);
         if (suffix != null) {
             try (MongoClient client = createClient()) {
-                client.dropDatabase(getDBName(suffix));
+                MongoDatabase database = client.getDatabase(getDBName(suffix));
+                database.drop();
             } catch (Exception e) {
                 log.error("Can't close Mongo", e);
             }
@@ -121,4 +124,4 @@ public void dispose(NodeStore nodeStore) {
     public String toString() {
         return "DocumentNodeStore[Mongo] on " + this.uri;
     }
-}
\ No newline at end of file
+}
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/AbstractMongoConnectionTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/AbstractMongoConnectionTest.java
index 0a0b45a06ab..6b360915b45 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/AbstractMongoConnectionTest.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/AbstractMongoConnectionTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.document;
 
-import com.mongodb.MongoClient;
+import com.mongodb.client.MongoClient;
 
 import org.apache.jackrabbit.oak.plugins.document.util.MongoConnection;
 import org.apache.jackrabbit.oak.stats.Clock;
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BlobThroughPutTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BlobThroughPutTest.java
index cac59c145cd..ff32f035e26 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BlobThroughPutTest.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/BlobThroughPutTest.java
@@ -30,9 +30,10 @@
 import org.apache.commons.collections4.bidimap.DualHashBidiMap;
 import org.apache.jackrabbit.guava.common.io.ByteStreams;
 import com.mongodb.BasicDBObject;
-import com.mongodb.MongoClient;
-import com.mongodb.MongoClientURI;
+import com.mongodb.ConnectionString;
 import com.mongodb.WriteConcern;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
 import com.mongodb.client.MongoCollection;
 import com.mongodb.client.MongoDatabase;
 import com.mongodb.client.model.Filters;
@@ -60,13 +61,11 @@ public class BlobThroughPutTest {
 
     static {
         Map<WriteConcern,String> bimap = new DualHashBidiMap<WriteConcern,String>();
-        bimap.put(WriteConcern.FSYNC_SAFE,"FSYNC_SAFE");
-        bimap.put(WriteConcern.JOURNAL_SAFE,"JOURNAL_SAFE");
+        bimap.put(WriteConcern.JOURNALED,"JOURNALED");
 //        bimap.put(WriteConcern.MAJORITY,"MAJORITY");
         bimap.put(WriteConcern.UNACKNOWLEDGED,"UNACKNOWLEDGED");
-        bimap.put(WriteConcern.NORMAL,"NORMAL");
 //        bimap.put(WriteConcern.REPLICAS_SAFE,"REPLICAS_SAFE");
-        bimap.put(WriteConcern.SAFE,"SAFE");
+        bimap.put(WriteConcern.ACKNOWLEDGED,"ACKNOWLEDGED");
         namedConcerns = Collections.unmodifiableMap(bimap);
     }
 
@@ -76,8 +75,11 @@ public class BlobThroughPutTest {
     @Ignore
     @Test
     public void performBenchMark() throws InterruptedException {
-        MongoClient local = new MongoClient(new MongoClientURI(localServer));
-        MongoClient remote = new MongoClient(new MongoClientURI(remoteServer));
+        ConnectionString localServerConnectionString = new ConnectionString(localServer);
+        MongoClient local = MongoClients.create(localServerConnectionString);
+
+        ConnectionString remoteServerConnectionString = new ConnectionString(remoteServer);
+        MongoClient remote = MongoClients.create(remoteServerConnectionString);
 
         run(local, false, false);
         run(local, true, false);
@@ -90,7 +92,8 @@ public void performBenchMark() throws InterruptedException {
     @Ignore
     @Test
     public void performBenchMark_WriteConcern() throws InterruptedException {
-        MongoClient mongo = new MongoClient(new MongoClientURI(remoteServer));
+        ConnectionString remoteServerConnectionString = new ConnectionString(remoteServer);
+        MongoClient mongo = MongoClients.create(remoteServerConnectionString);
         final MongoDatabase db = mongo.getDatabase(TEST_DB1);
         final MongoCollection<BasicDBObject> nodes = db.getCollection("nodes", BasicDBObject.class);
         final MongoCollection<BasicDBObject> blobs = db.getCollection("blobs", BasicDBObject.class);
@@ -128,7 +131,7 @@ private void run(MongoClient mongo, boolean useSameDB, boolean remote) throws In
             for (int writers : WRITERS) {
                 prepareDB(nodes, blobs);
                 final Benchmark b = new Benchmark(nodes, blobs);
-                Result r = b.run(readers, writers, remote, WriteConcern.SAFE);
+                Result r = b.run(readers, writers, remote, WriteConcern.ACKNOWLEDGED);
                 results.add(r);
             }
         }
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CacheConsistencyTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CacheConsistencyTest.java
index 30ae23a7029..04ed05d4974 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CacheConsistencyTest.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/CacheConsistencyTest.java
@@ -30,7 +30,7 @@
 
 import org.apache.jackrabbit.guava.common.collect.Maps;
 import com.mongodb.DBObject;
-import com.mongodb.MongoClient;
+import com.mongodb.client.MongoClient;
 import com.mongodb.client.MongoDatabase;
 
 import static org.apache.jackrabbit.oak.plugins.document.Collection.NODES;
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterInfoTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterInfoTest.java
index 9d9f50a85ed..3e2bbd11324 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterInfoTest.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/ClusterInfoTest.java
@@ -89,11 +89,11 @@ public void readWriteMode() throws InterruptedException {
         assertEquals(WriteConcern.MAJORITY, mem.getWriteConcern());
 
         op = new UpdateOp(list.get(0).getId(), false);
-        op.set("readWriteMode", "read:nearest, write:fsynced");
+        op.set("readWriteMode", "read:nearest, write:w2");
         mem.findAndUpdate(Collection.CLUSTER_NODES, op);
         ns1.renewClusterIdLease();
         assertEquals(ReadPreference.nearest(), mem.getReadPreference());
-        assertEquals(WriteConcern.FSYNCED, mem.getWriteConcern());
+        assertEquals(WriteConcern.W2, mem.getWriteConcern());
 
         ns1.dispose();
         ns2.dispose();
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentPrefetchAndUpdateIT.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentPrefetchAndUpdateIT.java
index 9645ec0c014..19732901439 100755
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentPrefetchAndUpdateIT.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/ConcurrentPrefetchAndUpdateIT.java
@@ -24,7 +24,7 @@
 
 import org.apache.jackrabbit.guava.common.collect.Lists;
 import com.mongodb.DBObject;
-import com.mongodb.MongoClient;
+import com.mongodb.client.MongoClient;
 import com.mongodb.client.MongoDatabase;
 
 import org.apache.jackrabbit.oak.plugins.document.mongo.MongoDocumentStore;
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentMKBuilderTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentMKBuilderTest.java
index 7cf6d9a9fd8..dc0b1a6402e 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentMKBuilderTest.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentMKBuilderTest.java
@@ -17,7 +17,7 @@
 package org.apache.jackrabbit.oak.plugins.document;
 
 import org.apache.jackrabbit.guava.common.collect.Iterables;
-import com.mongodb.MongoClient;
+import com.mongodb.client.MongoClient;
 
 import org.apache.jackrabbit.oak.cache.CacheStats;
 import org.junit.Test;
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreServiceTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreServiceTest.java
index c0fb2299efa..689c91c1b7c 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreServiceTest.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreServiceTest.java
@@ -23,11 +23,9 @@
 import java.util.function.Supplier;
 
 import org.apache.jackrabbit.guava.common.collect.Maps;
-import com.mongodb.MongoClient;
 
 import org.apache.commons.io.FilenameUtils;
 import org.apache.jackrabbit.oak.plugins.document.mongo.MongoDocumentStore;
-import org.apache.jackrabbit.oak.plugins.document.mongo.MongoDocumentStoreTestHelper;
 import org.apache.jackrabbit.oak.plugins.document.spi.JournalPropertyService;
 import org.apache.jackrabbit.oak.plugins.document.spi.lease.LeaseFailureHandler;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
@@ -150,18 +148,6 @@ public void setUpdateLimit() throws Exception {
         assertEquals(17, store.getUpdateLimit());
     }
 
-    @Test
-    public void keepAlive() throws Exception {
-        Map<String, Object> config = newConfig(repoHome);
-        config.put(DocumentNodeStoreServiceConfiguration.PROP_SO_KEEP_ALIVE, true);
-        MockOsgi.setConfigForPid(context.bundleContext(), PID, config);
-        MockOsgi.activate(service, context.bundleContext());
-        DocumentNodeStore store = context.getService(DocumentNodeStore.class);
-        MongoDocumentStore mds = getMongoDocumentStore(store);
-        MongoClient client = MongoDocumentStoreTestHelper.getClient(mds);
-        assertTrue(client.getMongoClientOptions().isSocketKeepAlive());
-    }
-
     @Test
     public void continuousRGCDefault() throws Exception {
         Map<String, Object> config = newConfig(repoHome);
@@ -217,8 +203,6 @@ public void preset() throws Exception {
         DocumentNodeStore store = context.getService(DocumentNodeStore.class);
         MongoDocumentStore mds = getMongoDocumentStore(store);
         assertNotNull(mds);
-        MongoClient client = MongoDocumentStoreTestHelper.getClient(mds);
-        assertTrue(client.getMongoClientOptions().isSocketKeepAlive());
     }
 
     @Test
@@ -233,11 +217,6 @@ public void presetOverride() throws Exception {
         MockOsgi.setConfigForPid(context.bundleContext(), PID, config);
 
         MockOsgi.activate(service, context.bundleContext());
-
-        DocumentNodeStore store = context.getService(DocumentNodeStore.class);
-        MongoDocumentStore mds = getMongoDocumentStore(store);
-        MongoClient client = MongoDocumentStoreTestHelper.getClient(mds);
-        assertFalse(client.getMongoClientOptions().isSocketKeepAlive());
     }
 
     @Test
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/MongoDbTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/MongoDbTest.java
index fbe09d223fe..a706b052380 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/MongoDbTest.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/MongoDbTest.java
@@ -25,6 +25,7 @@
 import org.junit.Test;
 
 import com.mongodb.BasicDBObject;
+import com.mongodb.ExplainVerbosity;
 import com.mongodb.client.FindIterable;
 import com.mongodb.client.MongoCollection;
 import com.mongodb.client.MongoDatabase;
@@ -199,9 +200,9 @@ public void updateDocument() {
         c.close();
     }
 
-    private static BasicDBObject explain(MongoCollection<BasicDBObject> collection,
+    private static org.bson.Document explain(MongoCollection<BasicDBObject> collection,
                                          Bson query) {
-        return collection.find(query).modifiers(new BasicDBObject("$explain", true)).first();
+        return collection.find(query).explain(ExplainVerbosity.QUERY_PLANNER);
     }
 
     private static void log(String msg) {
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/MongoUtils.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/MongoUtils.java
index a1a6e206209..757b629b8fc 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/MongoUtils.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/MongoUtils.java
@@ -29,8 +29,7 @@
 import org.slf4j.LoggerFactory;
 
 import com.mongodb.BasicDBObject;
-import com.mongodb.DB;
-import com.mongodb.MongoClientURI;
+import com.mongodb.ConnectionString;
 import com.mongodb.client.MongoDatabase;
 
 /**
@@ -107,16 +106,15 @@ public static MongoConnection getConnection() {
      * @return the connection or null
      */
     public static MongoConnection getConnection(String dbName) {
-        MongoClientURI clientURI;
+        ConnectionString connectionString;
         try {
-            clientURI = new MongoClientURI(URL);
+            connectionString = new ConnectionString(URL);
         } catch (IllegalArgumentException e) {
-            // configured URL is invalid
             return null;
         }
         StringBuilder uri = new StringBuilder("mongodb://");
         String separator = "";
-        for (String host : clientURI.getHosts()) {
+        for (String host : connectionString.getHosts()) {
             uri.append(separator);
             separator = ",";
             uri.append(host);
@@ -144,20 +142,6 @@ public static void dropCollections(String dbName) {
         }
     }
 
-    /**
-     * Drop all user defined collections. System collections are not dropped.
-     *
-     * @param db the connection
-     * @deprecated use {@link #dropCollections(MongoDatabase)} instead.
-     */
-    public static void dropCollections(DB db) {
-        for (String name : db.getCollectionNames()) {
-            if (!name.startsWith("system.")) {
-                db.getCollection(name).drop();
-            }
-        }
-    }
-
     /**
      * Drop all user defined collections. System collections are not dropped.
      *
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/AcquireRecoveryLockTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/AcquireRecoveryLockTest.java
index db79a5dc0d7..5b975e07d75 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/AcquireRecoveryLockTest.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/AcquireRecoveryLockTest.java
@@ -18,7 +18,7 @@
 
 import java.util.List;
 
-import com.mongodb.MongoClient;
+import com.mongodb.client.MongoClient;
 
 import org.apache.jackrabbit.oak.plugins.document.AbstractMongoConnectionTest;
 import org.apache.jackrabbit.oak.plugins.document.ClusterNodeInfo;
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ClusterConflictTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ClusterConflictTest.java
index 182c2fa6e29..5fb6af32322 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ClusterConflictTest.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ClusterConflictTest.java
@@ -16,7 +16,8 @@
  */
 package org.apache.jackrabbit.oak.plugins.document.mongo;
 
-import com.mongodb.MongoClient;
+
+import com.mongodb.client.MongoClient;
 
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.commons.PathUtils;
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoConnectionTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoConnectionTest.java
index e5a51920456..150c4cfe67c 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoConnectionTest.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoConnectionTest.java
@@ -16,20 +16,18 @@
  */
 package org.apache.jackrabbit.oak.plugins.document.mongo;
 
-import com.mongodb.MongoClient;
-import com.mongodb.MongoClientOptions;
 import com.mongodb.ReadConcern;
-import com.mongodb.ReplicaSetStatus;
 import com.mongodb.WriteConcern;
+import com.mongodb.client.MongoClient;
+import com.mongodb.connection.ClusterDescription;
+import com.mongodb.connection.ClusterType;
 
-import org.apache.jackrabbit.oak.plugins.document.MongoUtils;
 import org.apache.jackrabbit.oak.plugins.document.util.MongoConnection;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -37,8 +35,8 @@ public class MongoConnectionTest {
 
     @Test
     public void hasWriteConcern() throws Exception {
-        assertFalse(MongoConnection.hasWriteConcern("mongodb://localhost:27017/foo"));
-        assertTrue(MongoConnection.hasWriteConcern("mongodb://localhost:27017/foo?w=1"));
+        assertTrue(MongoConnection.hasMongoDbDefaultWriteConcern("mongodb://localhost:27017/foo"));
+        assertFalse(MongoConnection.hasMongoDbDefaultWriteConcern("mongodb://localhost:27017/foo?w=1"));
     }
 
     @Test
@@ -52,25 +50,13 @@ public void sufficientWriteConcern() throws Exception {
         sufficientWriteConcernReplicaSet(WriteConcern.ACKNOWLEDGED, false);
         sufficientWriteConcernReplicaSet(WriteConcern.JOURNALED, false);
         sufficientWriteConcernReplicaSet(WriteConcern.MAJORITY, true);
-        sufficientWriteConcernReplicaSet(WriteConcern.FSYNC_SAFE, false);
-        sufficientWriteConcernReplicaSet(WriteConcern.FSYNCED, false);
-        sufficientWriteConcernReplicaSet(WriteConcern.JOURNAL_SAFE, false);
-        sufficientWriteConcernReplicaSet(WriteConcern.NORMAL, false);
-        sufficientWriteConcernReplicaSet(WriteConcern.REPLICA_ACKNOWLEDGED, true);
-        sufficientWriteConcernReplicaSet(WriteConcern.REPLICAS_SAFE, true);
-        sufficientWriteConcernReplicaSet(WriteConcern.SAFE, false);
+        sufficientWriteConcernReplicaSet(WriteConcern.W2, true);
         sufficientWriteConcernReplicaSet(WriteConcern.UNACKNOWLEDGED, false);
 
         sufficientWriteConcernSingleNode(WriteConcern.ACKNOWLEDGED, true);
         sufficientWriteConcernSingleNode(WriteConcern.JOURNALED, true);
         sufficientWriteConcernSingleNode(WriteConcern.MAJORITY, true);
-        sufficientWriteConcernSingleNode(WriteConcern.FSYNC_SAFE, true);
-        sufficientWriteConcernSingleNode(WriteConcern.FSYNCED, true);
-        sufficientWriteConcernSingleNode(WriteConcern.JOURNAL_SAFE, true);
-        sufficientWriteConcernSingleNode(WriteConcern.NORMAL, false);
-        sufficientWriteConcernSingleNode(WriteConcern.REPLICA_ACKNOWLEDGED, true);
-        sufficientWriteConcernSingleNode(WriteConcern.REPLICAS_SAFE, true);
-        sufficientWriteConcernSingleNode(WriteConcern.SAFE, true);
+        sufficientWriteConcernReplicaSet(WriteConcern.W2, true);
         sufficientWriteConcernSingleNode(WriteConcern.UNACKNOWLEDGED, false);
     }
 
@@ -85,26 +71,6 @@ public void sufficientReadConcern() throws Exception {
         sufficientReadConcernSingleNode(ReadConcern.MAJORITY, true);
     }
 
-    @Test
-    public void socketKeepAlive() throws Exception {
-        assumeTrue(MongoUtils.isAvailable());
-        MongoClientOptions.Builder options = MongoConnection.getDefaultBuilder();
-        options.socketKeepAlive(false);
-        MongoConnection c = new MongoConnection(MongoUtils.URL, options);
-        try {
-            assertFalse(c.getMongoClient().getMongoClientOptions().isSocketKeepAlive());
-        } finally {
-            c.close();
-        }
-        // default is with keep-alive (starting with 3.6 driver)
-        c = new MongoConnection(MongoUtils.URL);
-        try {
-            assertTrue(c.getMongoClient().getMongoClientOptions().isSocketKeepAlive());
-        } finally {
-            c.close();
-        }
-    }
-
     private void sufficientWriteConcernReplicaSet(WriteConcern w,
                                                   boolean sufficient) {
         sufficientWriteConcern(w, true, sufficient);
@@ -139,14 +105,15 @@ private void sufficientReadConcern(ReadConcern r,
     }
 
     private MongoClient mockMongoClient(boolean replicaSet) {
-        ReplicaSetStatus status;
+        ClusterDescription description = mock(ClusterDescription.class);
         if (replicaSet) {
-            status = mock(ReplicaSetStatus.class);
+            when(description.getType()).thenReturn(ClusterType.REPLICA_SET);
         } else {
-            status = null;
+            when(description.getType()).thenReturn(ClusterType.STANDALONE);
         }
         MongoClient client = mock(MongoClient.class);
-        when(client.getReplicaSetStatus()).thenReturn(status);
+        when(client.getClusterDescription()).thenReturn(description);
+        
         return client;
     }
 }
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDBConfigTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDBConfigTest.java
index de6646d98f0..0b5ae991f08 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDBConfigTest.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDBConfigTest.java
@@ -17,7 +17,7 @@
 package org.apache.jackrabbit.oak.plugins.document.mongo;
 
 import com.mongodb.BasicDBObject;
-import com.mongodb.MongoClient;
+import com.mongodb.MongoClientSettings;
 import org.apache.jackrabbit.oak.plugins.document.mongo.MongoDBConfig.CollectionCompressor;
 import org.bson.BsonDocument;
 import org.bson.conversions.Bson;
@@ -25,21 +25,19 @@
 
 import java.util.Collections;
 
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
-import static org.apache.jackrabbit.oak.plugins.document.mongo.MongoDBConfig.getCollectionStorageOptions;
 import static org.apache.jackrabbit.oak.plugins.document.mongo.MongoDBConfig.COLLECTION_COMPRESSION_TYPE;
 import static org.apache.jackrabbit.oak.plugins.document.mongo.MongoDBConfig.STORAGE_CONFIG;
 import static org.apache.jackrabbit.oak.plugins.document.mongo.MongoDBConfig.STORAGE_ENGINE;
-
+import static org.apache.jackrabbit.oak.plugins.document.mongo.MongoDBConfig.getCollectionStorageOptions;
 
 public class MongoDBConfigTest {
 
     @Test
     public void defaultCollectionStorageOptions() {
         Bson bson = getCollectionStorageOptions(Collections.emptyMap());
-        BsonDocument bsonDocument = bson.toBsonDocument(BasicDBObject.class, MongoClient.getDefaultCodecRegistry());
+        BsonDocument bsonDocument = bson.toBsonDocument(BasicDBObject.class, MongoClientSettings.getDefaultCodecRegistry());
         String  configuredCompressor = bsonDocument.getDocument(STORAGE_ENGINE).getString(STORAGE_CONFIG).getValue();
         assertTrue(configuredCompressor.indexOf(CollectionCompressor.SNAPPY.getName()) > 0);
 
@@ -54,7 +52,7 @@ public void invalidCollectionStorageOptions() {
     @Test
     public void overrideDefaultCollectionStorageOptions() {
         Bson bson = getCollectionStorageOptions(Collections.singletonMap(COLLECTION_COMPRESSION_TYPE, "zstd"));
-        BsonDocument bsonDocument = bson.toBsonDocument(BasicDBObject.class, MongoClient.getDefaultCodecRegistry());
+        BsonDocument bsonDocument = bson.toBsonDocument(BasicDBObject.class, MongoClientSettings.getDefaultCodecRegistry());
         String  configuredCompressor = bsonDocument.getDocument(STORAGE_ENGINE).getString(STORAGE_CONFIG).getValue();
 
         assertTrue(configuredCompressor.indexOf(CollectionCompressor.ZSTD.getName()) > 0);
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDBExceptionTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDBExceptionTest.java
index 5dbe01d66b6..52754f6b2bd 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDBExceptionTest.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDBExceptionTest.java
@@ -1,21 +1,26 @@
 /*
- * 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
+ * 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
+ * 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.
+ * 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.jackrabbit.oak.plugins.document.mongo;
 
+import static java.util.Collections.singletonList;
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.apache.jackrabbit.oak.commons.junit.LogCustomizer;
 import org.apache.jackrabbit.oak.plugins.document.Collection;
 import org.apache.jackrabbit.oak.plugins.document.DocumentMK;
 import org.apache.jackrabbit.oak.plugins.document.DocumentStoreException;
@@ -25,24 +30,12 @@
 import org.apache.jackrabbit.oak.plugins.document.Revision;
 import org.apache.jackrabbit.oak.plugins.document.UpdateOp;
 import org.apache.jackrabbit.oak.plugins.document.util.Utils;
-import org.apache.jackrabbit.oak.commons.junit.LogCustomizer;
 import org.junit.After;
 import org.junit.Assume;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import static java.util.Collections.singletonList;
-import static org.hamcrest.Matchers.containsString;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assert.assertFalse;
-
 public class MongoDBExceptionTest {
 
     private MongoDocumentStore store;
@@ -83,9 +76,11 @@ public void idInExceptionMessage() {
             store.findAndUpdate(Collection.NODES, op);
             fail("DocumentStoreException expected");
         } catch (DocumentStoreException e) {
-            assertTrue(e.getMessage().contains(exceptionMsg));
+            assertTrue(e.getMessage()
+                    .contains(exceptionMsg));
             assertTrue("Exception message does not contain id: '" + e.getMessage() + "'",
-                    e.getMessage().contains(id));
+                    e.getMessage()
+                            .contains(id));
         }
 
         exceptionMsg = "createOrUpdate failed";
@@ -94,9 +89,11 @@ public void idInExceptionMessage() {
             store.createOrUpdate(Collection.NODES, op);
             fail("DocumentStoreException expected");
         } catch (DocumentStoreException e) {
-            assertTrue(e.getMessage().contains(exceptionMsg));
+            assertTrue(e.getMessage()
+                    .contains(exceptionMsg));
             assertTrue("Exception message does not contain id: '" + e.getMessage() + "'",
-                    e.getMessage().contains(id));
+                    e.getMessage()
+                            .contains(id));
         }
 
         exceptionMsg = "createOrUpdate (multiple) failed";
@@ -105,9 +102,11 @@ public void idInExceptionMessage() {
             store.createOrUpdate(Collection.NODES, singletonList(op));
             fail("DocumentStoreException expected");
         } catch (DocumentStoreException e) {
-            assertTrue(e.getMessage().contains(exceptionMsg));
+            assertTrue(e.getMessage()
+                    .contains(exceptionMsg));
             assertTrue("Exception message does not contain id: '" + e.getMessage() + "'",
-                    e.getMessage().contains(id));
+                    e.getMessage()
+                            .contains(id));
         }
 
         exceptionMsg = "find failed";
@@ -118,7 +117,8 @@ public void idInExceptionMessage() {
         } catch (DocumentStoreException e) {
             assertThat(e.getMessage(), containsString(exceptionMsg));
             assertTrue("Exception message does not contain id: '" + e.getMessage() + "'",
-                    e.getMessage().contains(id));
+                    e.getMessage()
+                            .contains(id));
         }
 
         Path foo = Path.fromString("/foo");
@@ -132,15 +132,18 @@ public void idInExceptionMessage() {
         } catch (DocumentStoreException e) {
             assertThat(e.getMessage(), containsString(exceptionMsg));
             assertTrue("Exception message does not contain id: '" + e.getMessage() + "'",
-                    e.getMessage().contains(fromKey));
+                    e.getMessage()
+                            .contains(fromKey));
             assertTrue("Exception message does not contain id: '" + e.getMessage() + "'",
-                    e.getMessage().contains(toKey));
+                    e.getMessage()
+                            .contains(toKey));
         }
     }
 
     @Test
     public void createOrUpdate16MBDoc() {
-        LogCustomizer customizer = LogCustomizer.forLogger(MongoDocumentStore.class.getName()).create();
+        LogCustomizer customizer = LogCustomizer.forLogger(MongoDocumentStore.class.getName())
+                .create();
         customizer.starting();
         String id = "/foo";
         UpdateOp updateOp = new UpdateOp(id, true);
@@ -151,7 +154,8 @@ public void createOrUpdate16MBDoc() {
             fail("DocumentStoreException expected");
         } catch (DocumentStoreException e) {
             assertThat(e.getMessage(), containsString(exceptionMsg));
-            String log = customizer.getLogs().toString();
+            String log = customizer.getLogs()
+                    .toString();
             assertTrue("Message doesn't contain the id", log.contains(id));
         }
         customizer.finished();
@@ -179,7 +183,8 @@ public void update16MBDoc() {
     public void multiCreateOrUpdate16MBDoc() {
 
         List<UpdateOp> updateOps = new ArrayList<>();
-        LogCustomizer customizer = LogCustomizer.forLogger(MongoDocumentStore.class.getName()).create();
+        LogCustomizer customizer = LogCustomizer.forLogger(MongoDocumentStore.class.getName())
+                .create();
         customizer.starting();
         String id1 = "/test";
         String id2 = "/foo";
@@ -203,7 +208,8 @@ public void multiCreateOrUpdate16MBDoc() {
             fail("DocumentStoreException expected");
         } catch (DocumentStoreException e) {
             assertThat(e.getMessage(), containsString(exceptionMsg));
-            String log = customizer.getLogs().toString();
+            String log = customizer.getLogs()
+                    .toString();
             assertTrue("Message doesn't contain the id", log.contains(id1));
         }
         customizer.finished();
@@ -213,7 +219,8 @@ public void multiCreateOrUpdate16MBDoc() {
     public void create16MBDoc() {
 
         List<UpdateOp> updateOps = new ArrayList<>();
-        LogCustomizer customizer = LogCustomizer.forLogger(MongoDocumentStore.class.getName()).create();
+        LogCustomizer customizer = LogCustomizer.forLogger(MongoDocumentStore.class.getName())
+                .create();
         customizer.starting();
         String id1 = "/test";
         String id2 = "/foo";
@@ -227,7 +234,8 @@ public void create16MBDoc() {
         updateOps.add(op1);
         updateOps.add(op2);
         assertFalse(store.create(Collection.NODES, updateOps));
-        String log = customizer.getLogs().toString();
+        String log = customizer.getLogs()
+                .toString();
         assertTrue("Message doesn't contain the id", log.contains(id2));
     }
 
@@ -245,7 +253,7 @@ public void findAndUpdate16MBDoc() throws Exception {
         } catch (DocumentStoreException e) {
             assertThat(e.getMessage(), containsString(exceptionMsg));
             assertThat(e.getMessage(), containsString(id));
-       }
+        }
     }
 
     private void setExceptionMsg() {
@@ -263,11 +271,11 @@ private UpdateOp create1MBProp(UpdateOp op) {
     private UpdateOp create16MBProp(UpdateOp op) {
         // create a 1 MB property
         String content = create1MBContent();
-        
 
-        //create 16MB property
+
+        // create 16MB property
         for (int i = 0; i < 16; i++) {
-            op.set("property"+ i, content);
+            op.set("property" + i, content);
         }
         return op;
     }
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreTestHelper.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreTestHelper.java
index 11e547e4644..bedf0bad776 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreTestHelper.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoDocumentStoreTestHelper.java
@@ -16,7 +16,7 @@
  */
 package org.apache.jackrabbit.oak.plugins.document.mongo;
 
-import com.mongodb.MongoClient;
+import com.mongodb.client.MongoClient;
 import com.mongodb.client.MongoDatabase;
 
 public final class MongoDocumentStoreTestHelper {
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoStatusTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoStatusTest.java
index dc1a90e4e66..0d9bdfd1d52 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoStatusTest.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoStatusTest.java
@@ -1,30 +1,24 @@
 /*
- * 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
+ * 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
+ * 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.
+ * 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.jackrabbit.oak.plugins.document.mongo;
 
+import static org.apache.jackrabbit.oak.plugins.document.MongoUtils.isAvailable;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+import java.util.Iterator;
 import java.util.concurrent.atomic.AtomicReference;
-
-import com.mongodb.BasicDBObject;
-import com.mongodb.MongoCommandException;
-import com.mongodb.ReadPreference;
-import com.mongodb.ServerAddress;
-import com.mongodb.client.ClientSession;
-import com.mongodb.client.MongoDatabase;
-
 import org.apache.jackrabbit.oak.plugins.document.MongoConnectionFactory;
 import org.apache.jackrabbit.oak.plugins.document.MongoUtils;
 import org.apache.jackrabbit.oak.plugins.document.util.MongoConnection;
@@ -39,13 +33,15 @@
 import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
-
-import static org.apache.jackrabbit.oak.plugins.document.MongoUtils.isAvailable;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
+import com.mongodb.BasicDBObject;
+import com.mongodb.MongoClientSettings;
+import com.mongodb.MongoCommandException;
+import com.mongodb.ReadPreference;
+import com.mongodb.ServerAddress;
+import com.mongodb.client.ClientSession;
+import com.mongodb.client.MongoDatabase;
+import com.mongodb.connection.ClusterDescription;
+import com.mongodb.connection.ServerDescription;
 
 public class MongoStatusTest {
 
@@ -103,12 +99,13 @@ public void testReadConcern() {
 
     @Test
     public void testGetVersion() {
-        assertTrue(status.getVersion().matches("^\\d+\\.\\d+\\.\\d+$"));
+        assertTrue(status.getVersion()
+                .matches("^\\d+\\.\\d+\\.\\d+$"));
     }
 
     @Test
     public void testCheckVersionValid() {
-        for (String v : new String[] { "2.6.0", "2.7.0", "3.0.0"}) {
+        for (String v : new String[] {"2.6.0", "2.7.0", "3.0.0"}) {
             status.setVersion(v);
             status.checkVersion();
         }
@@ -116,7 +113,7 @@ public void testCheckVersionValid() {
 
     @Test
     public void testCheckVersionInvalid() {
-        for (String v : new String[] { "1.0.0", "2.0.0", "2.5.0"}) {
+        for (String v : new String[] {"1.0.0", "2.0.0", "2.5.0"}) {
             status.setVersion(v);
             try {
                 status.checkVersion();
@@ -144,54 +141,54 @@ public void unauthorized() {
 
                     @Override
                     public @NotNull Document runCommand(@NotNull Bson command,
-                                                        @NotNull ReadPreference readPreference) {
+                            @NotNull ReadPreference readPreference) {
                         unauthorizedIfServerStatus(command);
                         return super.runCommand(command, readPreference);
                     }
 
                     @Override
                     public <TResult> @NotNull TResult runCommand(@NotNull Bson command,
-                                                                 @NotNull Class<TResult> tResultClass) {
+                            @NotNull Class<TResult> tResultClass) {
                         unauthorizedIfServerStatus(command);
                         return super.runCommand(command, tResultClass);
                     }
 
                     @Override
                     public <TResult> @NotNull TResult runCommand(@NotNull Bson command,
-                                                                 @NotNull ReadPreference readPreference,
-                                                                 @NotNull Class<TResult> tResultClass) {
+                            @NotNull ReadPreference readPreference,
+                            @NotNull Class<TResult> tResultClass) {
                         unauthorizedIfServerStatus(command);
                         return super.runCommand(command, readPreference, tResultClass);
                     }
 
                     @Override
                     public @NotNull Document runCommand(@NotNull ClientSession clientSession,
-                                                        @NotNull Bson command) {
+                            @NotNull Bson command) {
                         unauthorizedIfServerStatus(command);
                         return super.runCommand(clientSession, command);
                     }
 
                     @Override
                     public @NotNull Document runCommand(@NotNull ClientSession clientSession,
-                                                        @NotNull Bson command,
-                                                        @NotNull ReadPreference readPreference) {
+                            @NotNull Bson command,
+                            @NotNull ReadPreference readPreference) {
                         unauthorizedIfServerStatus(command);
                         return super.runCommand(clientSession, command, readPreference);
                     }
 
                     @Override
                     public <TResult> @NotNull TResult runCommand(@NotNull ClientSession clientSession,
-                                                                 @NotNull Bson command,
-                                                                 @NotNull Class<TResult> tResultClass) {
+                            @NotNull Bson command,
+                            @NotNull Class<TResult> tResultClass) {
                         unauthorizedIfServerStatus(command);
                         return super.runCommand(clientSession, command, tResultClass);
                     }
 
                     @Override
                     public <TResult> @NotNull TResult runCommand(@NotNull ClientSession clientSession,
-                                                                 @NotNull Bson command,
-                                                                 @NotNull ReadPreference readPreference,
-                                                                 @NotNull Class<TResult> tResultClass) {
+                            @NotNull Bson command,
+                            @NotNull ReadPreference readPreference,
+                            @NotNull Class<TResult> tResultClass) {
                         unauthorizedIfServerStatus(command);
                         return super.runCommand(clientSession, command, readPreference, tResultClass);
                     }
@@ -199,12 +196,22 @@ public void unauthorized() {
             }
 
             private void unauthorizedIfServerStatus(Bson command) {
-                if (command.toBsonDocument(BasicDBObject.class, getDefaultCodecRegistry()).containsKey("serverStatus")) {
+                if (command.toBsonDocument(BasicDBObject.class, MongoClientSettings.getDefaultCodecRegistry())
+                        .containsKey("serverStatus")) {
                     BsonDocument response = new BsonDocument("ok", new BsonDouble(0.0));
                     response.put("errmsg", new BsonString("command serverStatus requires authentication"));
                     response.put("code", new BsonInt32(13));
                     response.put("codeName", new BsonString("Unauthorized"));
-                    ServerAddress address = getAddress();
+                    
+                    ServerAddress address = null;
+                    ClusterDescription clusterDescription = getClusterDescription();
+                    for (Iterator<ServerDescription> iterator = clusterDescription.getServerDescriptions().iterator(); iterator.hasNext();) {
+                        ServerDescription serverDescription = iterator.next();
+                        
+                        address = serverDescription.getAddress();
+                        break;
+                    }
+                    
                     if (address == null) {
                         // OAK-8459: use dummy/default address instead
                         address = new ServerAddress();
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoTestClient.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoTestClient.java
index 28bc39e1c31..2f36610f0b2 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoTestClient.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoTestClient.java
@@ -16,28 +16,45 @@
  */
 package org.apache.jackrabbit.oak.plugins.document.mongo;
 
+import java.util.List;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
-
-import com.mongodb.MongoClient;
-import com.mongodb.MongoClientURI;
-import com.mongodb.client.MongoDatabase;
-
+import org.bson.Document;
+import org.bson.codecs.configuration.CodecRegistry;
+import org.bson.conversions.Bson;
 import org.jetbrains.annotations.NotNull;
+import com.mongodb.ClientSessionOptions;
+import com.mongodb.ConnectionString;
+import com.mongodb.ReadConcern;
+import com.mongodb.ReadPreference;
+import com.mongodb.WriteConcern;
+import com.mongodb.client.ChangeStreamIterable;
+import com.mongodb.client.ClientSession;
+import com.mongodb.client.ListDatabasesIterable;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
+import com.mongodb.client.MongoCluster;
+import com.mongodb.client.MongoDatabase;
+import com.mongodb.client.MongoIterable;
+import com.mongodb.connection.ClusterDescription;
 
-class MongoTestClient extends MongoClient {
+class MongoTestClient implements MongoClient {
 
     private AtomicReference<String> beforeQueryException = new AtomicReference<>();
     private AtomicReference<String> beforeUpdateException = new AtomicReference<>();
     private AtomicReference<String> afterUpdateException = new AtomicReference<>();
+    
+    private MongoClient delegate;
 
     MongoTestClient(String uri) {
-        super(new MongoClientURI(uri));
+        ConnectionString connectionString = new ConnectionString(uri);
+        delegate = MongoClients.create(connectionString);
     }
 
     @NotNull
     @Override
     public MongoDatabase getDatabase(String databaseName) {
-        return new MongoTestDatabase(super.getDatabase(databaseName),
+        return new MongoTestDatabase(delegate.getDatabase(databaseName),
                 beforeQueryException, beforeUpdateException, afterUpdateException);
     }
 
@@ -52,4 +69,145 @@ void setExceptionBeforeUpdate(String msg) {
     void setExceptionAfterUpdate(String msg) {
         afterUpdateException.set(msg);
     }
+
+    @Override
+    public CodecRegistry getCodecRegistry() {
+        return delegate.getCodecRegistry();
+    }
+
+    @Override
+    public ReadPreference getReadPreference() {
+        return delegate.getReadPreference();
+    }
+
+    @Override
+    public WriteConcern getWriteConcern() {
+        return delegate.getWriteConcern();
+    }
+
+    @Override
+    public ReadConcern getReadConcern() {
+        return delegate.getReadConcern();
+    }
+
+    @Override
+    public Long getTimeout(TimeUnit timeUnit) {
+        return delegate.getTimeout(timeUnit);
+    }
+
+    @Override
+    public MongoCluster withCodecRegistry(CodecRegistry codecRegistry) {
+        return delegate.withCodecRegistry(codecRegistry);
+    }
+
+    @Override
+    public MongoCluster withReadPreference(ReadPreference readPreference) {
+        return delegate.withReadPreference(readPreference);
+    }
+
+    @Override
+    public MongoCluster withWriteConcern(WriteConcern writeConcern) {
+        return delegate.withWriteConcern(writeConcern);
+    }
+
+    @Override
+    public MongoCluster withReadConcern(ReadConcern readConcern) {
+        return delegate.withReadConcern(readConcern);
+    }
+
+    @Override
+    public MongoCluster withTimeout(long timeout, TimeUnit timeUnit) {
+        return delegate.withTimeout(timeout, timeUnit);
+    }
+
+    @Override
+    public ClientSession startSession() {
+        return delegate.startSession();
+    }
+
+    @Override
+    public ClientSession startSession(ClientSessionOptions options) {
+        return delegate.startSession(options);
+    }
+
+    @Override
+    public MongoIterable<String> listDatabaseNames() {
+        return delegate.listDatabaseNames();
+    }
+
+    @Override
+    public MongoIterable<String> listDatabaseNames(ClientSession clientSession) {
+        return delegate.listDatabaseNames(clientSession);
+    }
+
+    @Override
+    public ListDatabasesIterable<Document> listDatabases() {
+        return delegate.listDatabases();
+    }
+
+    @Override
+    public ListDatabasesIterable<Document> listDatabases(ClientSession clientSession) {
+        return delegate.listDatabases(clientSession);
+    }
+
+    @Override
+    public <TResult> ListDatabasesIterable<TResult> listDatabases(Class<TResult> resultClass) {
+        return delegate.listDatabases(resultClass);
+    }
+
+    @Override
+    public <TResult> ListDatabasesIterable<TResult> listDatabases(ClientSession clientSession, Class<TResult> resultClass) {
+        return delegate.listDatabases(clientSession, resultClass);
+    }
+
+    @Override
+    public ChangeStreamIterable<Document> watch() {
+        return delegate.watch();
+    }
+
+    @Override
+    public <TResult> ChangeStreamIterable<TResult> watch(Class<TResult> resultClass) {
+        return delegate.watch(resultClass);
+    }
+
+    @Override
+    public ChangeStreamIterable<Document> watch(List<? extends Bson> pipeline) {
+        return delegate.watch(pipeline);
+    }
+
+    @Override
+    public <TResult> ChangeStreamIterable<TResult> watch(List<? extends Bson> pipeline, Class<TResult> resultClass) {
+        return delegate.watch(pipeline, resultClass);
+    }
+
+    @Override
+    public ChangeStreamIterable<Document> watch(ClientSession clientSession) {
+        return delegate.watch(clientSession);
+    }
+
+    @Override
+    public <TResult> ChangeStreamIterable<TResult> watch(ClientSession clientSession, Class<TResult> resultClass) {
+        return delegate.watch(clientSession, resultClass);
+    }
+
+    @Override
+    public ChangeStreamIterable<Document> watch(ClientSession clientSession, List<? extends Bson> pipeline) {
+        return delegate.watch(clientSession, pipeline);
+    }
+
+    @Override
+    public <TResult> ChangeStreamIterable<TResult> watch(ClientSession clientSession, List<? extends Bson> pipeline, Class<TResult> resultClass) {
+        return delegate.watch(clientSession, pipeline, resultClass);
+    }
+
+    @Override
+    public void close() {
+        delegate.close();
+        
+    }
+
+    @Override
+    public ClusterDescription getClusterDescription() {
+        return delegate.getClusterDescription();
+    }
 }
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoTestCollection.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoTestCollection.java
index 051f99d49db..7cf70a14a94 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoTestCollection.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoTestCollection.java
@@ -17,8 +17,13 @@
 package org.apache.jackrabbit.oak.plugins.document.mongo;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
-
+import org.bson.Document;
+import org.bson.codecs.configuration.CodecRegistry;
+import org.bson.conversions.Bson;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import com.mongodb.MongoException;
 import com.mongodb.MongoNamespace;
 import com.mongodb.ReadConcern;
@@ -31,12 +36,14 @@
 import com.mongodb.client.DistinctIterable;
 import com.mongodb.client.FindIterable;
 import com.mongodb.client.ListIndexesIterable;
+import com.mongodb.client.ListSearchIndexesIterable;
 import com.mongodb.client.MapReduceIterable;
 import com.mongodb.client.MongoCollection;
 import com.mongodb.client.model.BulkWriteOptions;
 import com.mongodb.client.model.CountOptions;
 import com.mongodb.client.model.CreateIndexOptions;
 import com.mongodb.client.model.DeleteOptions;
+import com.mongodb.client.model.DropCollectionOptions;
 import com.mongodb.client.model.DropIndexOptions;
 import com.mongodb.client.model.EstimatedDocumentCountOptions;
 import com.mongodb.client.model.FindOneAndDeleteOptions;
@@ -48,17 +55,14 @@
 import com.mongodb.client.model.InsertOneOptions;
 import com.mongodb.client.model.RenameCollectionOptions;
 import com.mongodb.client.model.ReplaceOptions;
+import com.mongodb.client.model.SearchIndexModel;
 import com.mongodb.client.model.UpdateOptions;
 import com.mongodb.client.model.WriteModel;
 import com.mongodb.client.result.DeleteResult;
+import com.mongodb.client.result.InsertManyResult;
+import com.mongodb.client.result.InsertOneResult;
 import com.mongodb.client.result.UpdateResult;
 
-import org.bson.Document;
-import org.bson.codecs.configuration.CodecRegistry;
-import org.bson.conversions.Bson;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
 public class MongoTestCollection<TDocument> implements MongoCollection<TDocument> {
 
     private final MongoCollection<TDocument> collection;
@@ -143,44 +147,6 @@ public MongoCollection<TDocument> withReadConcern(@NotNull ReadConcern readConce
         return new MongoTestCollection<>(collection.withReadConcern(readConcern), beforeQueryException, beforeUpdateException, afterUpdateException);
     }
 
-    @Override
-    @Deprecated
-    public long count() {
-        return collection.count();
-    }
-
-    @Override
-    @Deprecated
-    public long count(@NotNull Bson filter) {
-        return collection.count(filter);
-    }
-
-    @Override
-    @Deprecated
-    public long count(@NotNull Bson filter, @NotNull CountOptions options) {
-        return collection.count(filter, options);
-    }
-
-    @Override
-    @Deprecated
-    public long count(@NotNull ClientSession clientSession) {
-        return collection.count(clientSession);
-    }
-
-    @Override
-    @Deprecated
-    public long count(@NotNull ClientSession clientSession, @NotNull Bson filter) {
-        return collection.count(clientSession, filter);
-    }
-
-    @Override
-    @Deprecated
-    public long count(@NotNull ClientSession clientSession,
-                      @NotNull Bson filter,
-                      @NotNull CountOptions options) {
-        return collection.count(clientSession, filter, options);
-    }
-
     @Override
     public long countDocuments() {
         return collection.countDocuments();
@@ -472,65 +438,73 @@ public BulkWriteResult bulkWrite(@NotNull ClientSession clientSession,
     }
 
     @Override
-    public void insertOne(@NotNull TDocument tDocument) {
+    public InsertOneResult insertOne(@NotNull TDocument tDocument) {
         maybeThrowExceptionBeforeUpdate();
-        collection.insertOne(tDocument);
+        InsertOneResult insertOne = collection.insertOne(tDocument);
         maybeThrowExceptionAfterUpdate();
+        return insertOne;
     }
 
     @Override
-    public void insertOne(@NotNull TDocument tDocument, @NotNull InsertOneOptions options) {
+    public InsertOneResult insertOne(@NotNull TDocument tDocument, @NotNull InsertOneOptions options) {
         maybeThrowExceptionBeforeUpdate();
-        collection.insertOne(tDocument, options);
+        InsertOneResult insertOne = collection.insertOne(tDocument, options);
         maybeThrowExceptionAfterUpdate();
+        return insertOne;
     }
 
     @Override
-    public void insertOne(@NotNull ClientSession clientSession, @NotNull TDocument tDocument) {
+    public InsertOneResult insertOne(@NotNull ClientSession clientSession, @NotNull TDocument tDocument) {
         maybeThrowExceptionBeforeUpdate();
-        collection.insertOne(clientSession, tDocument);
+        InsertOneResult insertOne = collection.insertOne(clientSession, tDocument);
         maybeThrowExceptionAfterUpdate();
+        return insertOne;
     }
 
     @Override
-    public void insertOne(@NotNull ClientSession clientSession,
+    public InsertOneResult insertOne(@NotNull ClientSession clientSession,
                           @NotNull TDocument tDocument,
                           @NotNull InsertOneOptions options) {
         maybeThrowExceptionBeforeUpdate();
-        collection.insertOne(clientSession, tDocument, options);
+        InsertOneResult insertOne = collection.insertOne(clientSession, tDocument, options);
         maybeThrowExceptionAfterUpdate();
+        return insertOne;
     }
 
     @Override
-    public void insertMany(@NotNull List<? extends TDocument> tDocuments) {
+    public InsertManyResult insertMany(@NotNull List<? extends TDocument> tDocuments) {
         maybeThrowExceptionBeforeUpdate();
-        collection.insertMany(tDocuments);
+        InsertManyResult insertMany = collection.insertMany(tDocuments);
         maybeThrowExceptionAfterUpdate();
+        return insertMany;
     }
 
     @Override
-    public void insertMany(@NotNull List<? extends TDocument> tDocuments,
+    public InsertManyResult insertMany(@NotNull List<? extends TDocument> tDocuments,
                            @NotNull InsertManyOptions options) {
         maybeThrowExceptionBeforeUpdate();
-        collection.insertMany(tDocuments, options);
+        InsertManyResult insertMany = collection.insertMany(tDocuments, options);
         maybeThrowExceptionAfterUpdate();
+        return insertMany;
     }
 
     @Override
-    public void insertMany(@NotNull ClientSession clientSession,
+    public InsertManyResult insertMany(@NotNull ClientSession clientSession,
                            @NotNull List<? extends TDocument> tDocuments) {
         maybeThrowExceptionBeforeUpdate();
-        collection.insertMany(clientSession, tDocuments);
+        InsertManyResult insertMany = collection.insertMany(clientSession, tDocuments);
         maybeThrowExceptionAfterUpdate();
+        return insertMany;
     }
 
     @Override
-    public void insertMany(@NotNull ClientSession clientSession,
+    public InsertManyResult insertMany(@NotNull ClientSession clientSession,
                            @NotNull List<? extends TDocument> tDocuments,
                            @NotNull InsertManyOptions options) {
         maybeThrowExceptionBeforeUpdate();
-        collection.insertMany(clientSession, tDocuments, options);
+        InsertManyResult insertMany = collection.insertMany(clientSession, tDocuments, options);
         maybeThrowExceptionAfterUpdate();
+        return insertMany;
     }
 
     @NotNull
@@ -618,18 +592,6 @@ public UpdateResult replaceOne(@NotNull Bson filter, @NotNull TDocument replacem
         return result;
     }
 
-    @NotNull
-    @Override
-    @Deprecated
-    public UpdateResult replaceOne(@NotNull Bson filter,
-                                   @NotNull TDocument replacement,
-                                   @NotNull UpdateOptions updateOptions) {
-        maybeThrowExceptionBeforeUpdate();
-        UpdateResult result = collection.replaceOne(filter, replacement, updateOptions);
-        maybeThrowExceptionAfterUpdate();
-        return result;
-    }
-
     @NotNull
     @Override
     public UpdateResult replaceOne(@NotNull ClientSession clientSession,
@@ -641,19 +603,6 @@ public UpdateResult replaceOne(@NotNull ClientSession clientSession,
         return result;
     }
 
-    @NotNull
-    @Override
-    @Deprecated
-    public UpdateResult replaceOne(@NotNull ClientSession clientSession,
-                                   @NotNull Bson filter,
-                                   @NotNull TDocument replacement,
-                                   @NotNull UpdateOptions updateOptions) {
-        maybeThrowExceptionBeforeUpdate();
-        UpdateResult result = collection.replaceOne(clientSession, filter, replacement, updateOptions);
-        maybeThrowExceptionAfterUpdate();
-        return result;
-    }
-
     @NotNull
     @Override
     public UpdateResult replaceOne(@NotNull Bson filter,
@@ -1194,6 +1143,61 @@ public void renameCollection(@NotNull ClientSession clientSession,
                                  @NotNull RenameCollectionOptions renameCollectionOptions) {
         collection.renameCollection(clientSession, newCollectionNamespace, renameCollectionOptions);
     }
+    
+    @Override
+    public Long getTimeout(TimeUnit timeUnit) {
+        return collection.getTimeout(timeUnit);
+    }
+
+    @Override
+    public MongoCollection<TDocument> withTimeout(long timeout, TimeUnit timeUnit) {
+        return collection.withTimeout(timeout, timeUnit);
+    }
+
+    @Override
+    public void drop(DropCollectionOptions dropCollectionOptions) {
+        collection.drop(dropCollectionOptions);
+    }
+
+    @Override
+    public void drop(ClientSession clientSession, DropCollectionOptions dropCollectionOptions) {
+        collection.drop(clientSession, dropCollectionOptions);
+    }
+
+    @Override
+    public String createSearchIndex(String indexName, Bson definition) {
+        return collection.createSearchIndex(indexName, definition);
+    }
+
+    @Override
+    public String createSearchIndex(Bson definition) {
+        return collection.createSearchIndex(definition);
+    }
+
+    @Override
+    public List<String> createSearchIndexes(List<SearchIndexModel> searchIndexModels) {
+        return collection.createSearchIndexes(searchIndexModels);
+    }
+
+    @Override
+    public void updateSearchIndex(String indexName, Bson definition) {
+        collection.updateSearchIndex(indexName, definition);
+    }
+
+    @Override
+    public void dropSearchIndex(String indexName) {
+        collection.dropSearchIndex(indexName);
+    }
+
+    @Override
+    public ListSearchIndexesIterable<Document> listSearchIndexes() {
+        return collection.listSearchIndexes();
+    }
+
+    @Override
+    public <TResult> ListSearchIndexesIterable<TResult> listSearchIndexes(Class<TResult> resultClass) {
+        return collection.listSearchIndexes(resultClass);
+    }
 
     private void maybeThrowExceptionBeforeQuery() {
         String msg = beforeQueryException.get();
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoTestDatabase.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoTestDatabase.java
index 27d89cffc9f..db3c231b2f7 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoTestDatabase.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoTestDatabase.java
@@ -17,26 +17,25 @@
 package org.apache.jackrabbit.oak.plugins.document.mongo;
 
 import java.util.List;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
-
+import org.bson.Document;
+import org.bson.codecs.configuration.CodecRegistry;
+import org.bson.conversions.Bson;
+import org.jetbrains.annotations.NotNull;
 import com.mongodb.ReadConcern;
 import com.mongodb.ReadPreference;
 import com.mongodb.WriteConcern;
 import com.mongodb.client.AggregateIterable;
 import com.mongodb.client.ChangeStreamIterable;
 import com.mongodb.client.ClientSession;
+import com.mongodb.client.ListCollectionNamesIterable;
 import com.mongodb.client.ListCollectionsIterable;
 import com.mongodb.client.MongoCollection;
 import com.mongodb.client.MongoDatabase;
-import com.mongodb.client.MongoIterable;
 import com.mongodb.client.model.CreateCollectionOptions;
 import com.mongodb.client.model.CreateViewOptions;
 
-import org.bson.Document;
-import org.bson.codecs.configuration.CodecRegistry;
-import org.bson.conversions.Bson;
-import org.jetbrains.annotations.NotNull;
-
 public class MongoTestDatabase implements MongoDatabase {
 
     private final MongoDatabase db;
@@ -194,7 +193,7 @@ public void drop(@NotNull ClientSession clientSession) {
 
     @NotNull
     @Override
-    public MongoIterable<String> listCollectionNames() {
+    public ListCollectionNamesIterable listCollectionNames() {
         return db.listCollectionNames();
     }
 
@@ -212,7 +211,7 @@ public <TResult> ListCollectionsIterable<TResult> listCollections(@NotNull Class
 
     @NotNull
     @Override
-    public MongoIterable<String> listCollectionNames(@NotNull ClientSession clientSession) {
+    public ListCollectionNamesIterable listCollectionNames(@NotNull ClientSession clientSession) {
         return db.listCollectionNames(clientSession);
     }
 
@@ -366,4 +365,16 @@ public <TResult> AggregateIterable<TResult> aggregate(@NotNull ClientSession cli
                                                           @NotNull Class<TResult> tResultClass) {
         return db.aggregate(clientSession, pipeline, tResultClass);
     }
+
+    @Override
+    public Long getTimeout(TimeUnit timeUnit) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public MongoDatabase withTimeout(long timeout, TimeUnit timeUnit) {
+        // TODO Auto-generated method stub
+        return null;
+    }
 }
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoUtilsTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoUtilsTest.java
index 5d24e77d3dc..55520e77866 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoUtilsTest.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongoUtilsTest.java
@@ -16,21 +16,19 @@
  */
 package org.apache.jackrabbit.oak.plugins.document.mongo;
 
+import static org.apache.jackrabbit.oak.plugins.document.DocumentStoreException.Type.GENERIC;
+import static org.apache.jackrabbit.oak.plugins.document.DocumentStoreException.Type.TRANSIENT;
+import static org.apache.jackrabbit.oak.plugins.document.MongoUtils.isAvailable;
+import static org.apache.jackrabbit.oak.plugins.document.mongo.MongoUtils.getDocumentStoreExceptionTypeFor;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+import static org.mockito.Mockito.mock;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
-
-import com.mongodb.BasicDBObject;
-import com.mongodb.DuplicateKeyException;
-import com.mongodb.MongoClient;
-import com.mongodb.MongoCommandException;
-import com.mongodb.MongoException;
-import com.mongodb.MongoSocketException;
-import com.mongodb.ServerAddress;
-import com.mongodb.WriteConcernException;
-import com.mongodb.client.ClientSession;
-import com.mongodb.client.MongoCollection;
-
 import org.apache.jackrabbit.oak.plugins.document.Collection;
 import org.apache.jackrabbit.oak.plugins.document.MongoConnectionFactory;
 import org.apache.jackrabbit.oak.plugins.document.util.MongoConnection;
@@ -41,17 +39,16 @@
 import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
-
-import static org.apache.jackrabbit.oak.plugins.document.DocumentStoreException.Type.GENERIC;
-import static org.apache.jackrabbit.oak.plugins.document.DocumentStoreException.Type.TRANSIENT;
-import static org.apache.jackrabbit.oak.plugins.document.MongoUtils.isAvailable;
-import static org.apache.jackrabbit.oak.plugins.document.mongo.MongoUtils.getDocumentStoreExceptionTypeFor;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeTrue;
-import static org.mockito.Mockito.mock;
+import com.mongodb.BasicDBObject;
+import com.mongodb.DuplicateKeyException;
+import com.mongodb.MongoCommandException;
+import com.mongodb.MongoException;
+import com.mongodb.MongoSocketException;
+import com.mongodb.ServerAddress;
+import com.mongodb.WriteConcernException;
+import com.mongodb.client.ClientSession;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoCollection;
 
 public class MongoUtilsTest {
 
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongodProcessFactory.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongodProcessFactory.java
index 7ddcd850df3..de930362b5e 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongodProcessFactory.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/MongodProcessFactory.java
@@ -18,6 +18,8 @@
  */
 package org.apache.jackrabbit.oak.plugins.document.mongo;
 
+import static org.apache.jackrabbit.oak.plugins.document.mongo.MongodProcess.join;
+import static org.junit.Assert.assertTrue;
 import java.io.IOException;
 import java.net.InetAddress;
 import java.util.ArrayList;
@@ -25,15 +27,13 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
 import org.apache.jackrabbit.guava.common.base.Joiner;
-import com.mongodb.MongoClient;
-
 import org.bson.Document;
 import org.junit.rules.ExternalResource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
 import de.flapdoodle.embed.mongo.Command;
 import de.flapdoodle.embed.mongo.MongodStarter;
 import de.flapdoodle.embed.mongo.config.Defaults;
@@ -43,9 +43,6 @@
 import de.flapdoodle.embed.process.io.progress.Slf4jProgressListener;
 import de.flapdoodle.embed.process.runtime.Network;
 
-import static org.apache.jackrabbit.oak.plugins.document.mongo.MongodProcess.join;
-import static org.junit.Assert.assertTrue;
-
 /**
  * External resource for mongod processes.
  */
@@ -145,7 +142,7 @@ private void initRS(String rs, int[] ports) {
         }
         Document config = new Document("_id", rs);
         config.append("members", members);
-        try (MongoClient c = new MongoClient(localhost(), ports[0])) {
+        try (MongoClient c = MongoClients.create("mongodb://" + localhost() + ":" + ports[0])) {
             c.getDatabase("admin").runCommand(
                     new Document("replSetInitiate", config));
         }
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ReplicaSetResilienceIT.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ReplicaSetResilienceIT.java
index 77d949da489..b76f777b377 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ReplicaSetResilienceIT.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ReplicaSetResilienceIT.java
@@ -18,6 +18,11 @@
  */
 package org.apache.jackrabbit.oak.plugins.document.mongo;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeThat;
 import java.io.IOException;
 import java.io.UncheckedIOException;
 import java.util.ArrayList;
@@ -31,12 +36,7 @@
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
-
 import org.apache.jackrabbit.guava.common.base.Stopwatch;
-import com.mongodb.MongoClient;
-import com.mongodb.MongoClientOptions;
-import com.mongodb.ServerAddress;
-
 import org.apache.jackrabbit.oak.plugins.document.DocumentMKBuilderProvider;
 import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore;
 import org.apache.jackrabbit.oak.plugins.document.MongoUtils;
@@ -49,12 +49,13 @@
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeThat;
+import com.mongodb.MongoClientSettings;
+import com.mongodb.ServerAddress;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
+import com.mongodb.connection.ClusterDescription;
+import com.mongodb.connection.ServerDescription;
+import com.mongodb.connection.ServerType;
 
 /**
  * A long running resilience IT. The test sets up a three node replica set and
@@ -215,11 +216,29 @@ private void stopPrimary() {
             for (MongodProcess p : executables.values()) {
                 seeds.add(p.getAddress());
             }
-            try (MongoClient c = new MongoClient(seeds,
-                    new MongoClientOptions.Builder().requiredReplicaSetName("rs").build())) {
+            
+            String replicaSetName = "rs";
+            
+            MongoClientSettings settings = MongoClientSettings.builder()
+                    .applyToClusterSettings(builder -> 
+                        builder.hosts(seeds).requiredReplicaSetName(replicaSetName)
+                    )
+                    .build();
+            
+            try (MongoClient c = MongoClients.create(settings)) {
                 ServerAddress address = null;
                 for (int i = 0; i < 5; i++) {
-                    address = c.getReplicaSetStatus().getMaster();
+                    ClusterDescription clusterDescription = c.getClusterDescription();
+                    
+                    for (Iterator<ServerDescription> iterator = clusterDescription.getServerDescriptions().iterator(); iterator.hasNext();) {
+                        ServerDescription sd = iterator.next();
+                        
+                        if (ServerType.REPLICA_SET_PRIMARY.equals(sd.getType())) {
+                            address = sd.getAddress();
+                            break;
+                        }
+                    }
+                    
                     if (address == null) {
                         LOG.info("Primary unavailable. Waiting one second...");
                         try {
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ReplicaSetStatusTest.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ReplicaSetStatusTest.java
index c334a1055b5..41c89ea7263 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ReplicaSetStatusTest.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/ReplicaSetStatusTest.java
@@ -104,6 +104,6 @@ private ServerHeartbeatSucceededEvent newEvent(int connectionIndex, long localTi
         reply.put("hosts", new BsonArray(hostValues));
         BsonDocument lastWrite = new BsonDocument("lastWriteDate", new BsonDateTime(lastWriteDate));
         reply.put("lastWrite", lastWrite);
-        return new ServerHeartbeatSucceededEvent(description.getConnectionId(), reply, 0);
+        return new ServerHeartbeatSucceededEvent(description.getConnectionId(), reply, 0, false);
     }
 }
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/RetryReadIT.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/RetryReadIT.java
index a77ca245e0d..029547d4aff 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/RetryReadIT.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/mongo/RetryReadIT.java
@@ -30,8 +30,8 @@
 import org.jetbrains.annotations.NotNull;
 import org.junit.Test;
 
-import com.mongodb.MongoClient;
 import com.mongodb.MongoException;
+import com.mongodb.client.MongoClient;
 import com.mongodb.client.MongoDatabase;
 
 import static org.apache.jackrabbit.oak.plugins.document.Collection.NODES;
diff --git a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/prefetch/CountingMongoDatabase.java b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/prefetch/CountingMongoDatabase.java
index e1e68b49353..170934943cb 100644
--- a/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/prefetch/CountingMongoDatabase.java
+++ b/oak-store-document/src/test/java/org/apache/jackrabbit/oak/plugins/document/prefetch/CountingMongoDatabase.java
@@ -19,6 +19,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 
 import org.bson.Document;
@@ -31,10 +32,10 @@
 import com.mongodb.client.AggregateIterable;
 import com.mongodb.client.ChangeStreamIterable;
 import com.mongodb.client.ClientSession;
+import com.mongodb.client.ListCollectionNamesIterable;
 import com.mongodb.client.ListCollectionsIterable;
 import com.mongodb.client.MongoCollection;
 import com.mongodb.client.MongoDatabase;
-import com.mongodb.client.MongoIterable;
 import com.mongodb.client.model.CreateCollectionOptions;
 import com.mongodb.client.model.CreateViewOptions;
 
@@ -180,7 +181,7 @@ public void drop(ClientSession clientSession) {
     }
 
     @Override
-    public MongoIterable<String> listCollectionNames() {
+    public ListCollectionNamesIterable listCollectionNames() {
         return delegate.listCollectionNames();
 
     }
@@ -199,7 +200,7 @@ public <TResult> ListCollectionsIterable<TResult> listCollections(
     }
 
     @Override
-    public MongoIterable<String> listCollectionNames(ClientSession clientSession) {
+    public ListCollectionNamesIterable listCollectionNames(ClientSession clientSession) {
         return delegate.listCollectionNames(clientSession);
 
     }
@@ -351,4 +352,14 @@ public <TResult> AggregateIterable<TResult> aggregate(ClientSession clientSessio
 
     }
 
+    @Override
+    public Long getTimeout(TimeUnit timeUnit) {
+        return delegate.getTimeout(timeUnit);
+    }
+
+    @Override
+    public MongoDatabase withTimeout(long timeout, TimeUnit timeUnit) {
+        return delegate.withTimeout(timeout, timeUnit);
+    }
+
 }
diff --git a/oak-upgrade/pom.xml b/oak-upgrade/pom.xml
index 4fc33e044d4..63fd382b609 100644
--- a/oak-upgrade/pom.xml
+++ b/oak-upgrade/pom.xml
@@ -169,7 +169,7 @@
 
     <dependency>
       <groupId>org.mongodb</groupId>
-      <artifactId>mongo-java-driver</artifactId>
+      <artifactId>mongodb-driver-sync</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.tomcat</groupId>
diff --git a/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/MongoFactory.java b/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/MongoFactory.java
index cee39f4f507..cd5ca42db3d 100644
--- a/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/MongoFactory.java
+++ b/oak-upgrade/src/main/java/org/apache/jackrabbit/oak/upgrade/cli/node/MongoFactory.java
@@ -16,15 +16,16 @@
  */
 package org.apache.jackrabbit.oak.upgrade.cli.node;
 
+import org.apache.jackrabbit.guava.common.io.Closer;
 import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore;
 import org.apache.jackrabbit.oak.plugins.document.mongo.MongoBlobStore;
 import org.apache.jackrabbit.oak.plugins.document.mongo.MongoDocumentNodeStoreBuilder;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 
-import org.apache.jackrabbit.guava.common.io.Closer;
-import com.mongodb.MongoClient;
-import com.mongodb.MongoClientURI;
+import com.mongodb.ConnectionString;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
 
 import java.io.IOException;
 
@@ -32,14 +33,14 @@
 
 public class MongoFactory extends DocumentFactory {
 
-    private final MongoClientURI uri;
+    private final ConnectionString uri;
 
     private final int cacheSize;
 
     private final boolean readOnly;
 
     public MongoFactory(String repoDesc, int cacheSize, boolean readOnly) {
-        this.uri = new MongoClientURI(repoDesc);
+        this.uri = new ConnectionString(repoDesc);
         this.cacheSize = cacheSize;
         this.readOnly = readOnly;
     }
@@ -65,7 +66,7 @@ public NodeStore create(BlobStore blobStore, Closer closer) throws IOException {
     }
 
     private MongoClient createClient(Closer closer) {
-        MongoClient client = new MongoClient(uri);
+        MongoClient client = MongoClients.create(uri);
         closer.register(client::close);
         return client;
     }
diff --git a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/MongoNodeStoreContainer.java b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/MongoNodeStoreContainer.java
index 2475e6516bc..f6fb1493714 100644
--- a/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/MongoNodeStoreContainer.java
+++ b/oak-upgrade/src/test/java/org/apache/jackrabbit/oak/upgrade/cli/container/MongoNodeStoreContainer.java
@@ -17,18 +17,20 @@
 package org.apache.jackrabbit.oak.upgrade.cli.container;
 
 import java.io.IOException;
+import java.util.Iterator;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.jackrabbit.guava.common.io.Closer;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
 import org.apache.jackrabbit.oak.upgrade.cli.node.MongoFactory;
 import org.junit.Assume;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.jackrabbit.guava.common.io.Closer;
-import com.mongodb.Mongo;
-import com.mongodb.MongoClient;
-import com.mongodb.MongoClientURI;
+import com.mongodb.ConnectionString;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
+import com.mongodb.client.MongoIterable;
 
 public class MongoNodeStoreContainer implements NodeStoreContainer {
 
@@ -71,11 +73,16 @@ public static boolean isMongoAvailable() {
     }
 
     private static boolean testMongoAvailability() {
-        Mongo mongo = null;
+        MongoClient mongo = null;
         try {
-            MongoClientURI uri = new MongoClientURI(MONGO_URI + "?connectTimeoutMS=3000");
-            mongo = new MongoClient(uri);
-            mongo.getDatabaseNames();
+            ConnectionString uri = new ConnectionString(MONGO_URI + "?connectTimeoutMS=3000");
+            mongo = MongoClients.create(uri);
+            MongoIterable<String> listDatabaseNames = mongo.listDatabaseNames();
+            
+            // To do real call to mongo and so test its availability we need to call iterator on just returned result
+            for (Iterator<String> iterator = listDatabaseNames.iterator(); iterator.hasNext();) {
+                // do nothing...
+            }
             return true;
         } catch (Exception e) {
             return false;
@@ -103,9 +110,9 @@ public void close() {
 
     @Override
     public void clean() throws IOException {
-        MongoClientURI uri = new MongoClientURI(mongoUri);
-        MongoClient client = new MongoClient(uri);
-        client.dropDatabase(uri.getDatabase());
+        ConnectionString uri = new ConnectionString(mongoUri);
+        MongoClient client = MongoClients.create(uri);
+        client.getDatabase(uri.getDatabase()).drop();
         blob.clean();
     }