diff --git a/curator-client/pom.xml b/curator-client/pom.xml
index 87bf810..acdeec6 100644
--- a/curator-client/pom.xml
+++ b/curator-client/pom.xml
@@ -72,8 +72,8 @@
         </dependency>
 
         <dependency>
-            <groupId>org.testng</groupId>
-            <artifactId>testng</artifactId>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
             <scope>test</scope>
         </dependency>
 
@@ -119,4 +119,3 @@
         </plugins>
     </build>
 </project>
-
diff --git a/curator-client/src/test/java/org/apache/curator/BasicTests.java b/curator-client/src/test/java/org/apache/curator/BasicTests.java
index afb1c73..c90d4a1 100644
--- a/curator-client/src/test/java/org/apache/curator/BasicTests.java
+++ b/curator-client/src/test/java/org/apache/curator/BasicTests.java
@@ -18,6 +18,12 @@
  */
 package org.apache.curator;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import org.apache.curator.ensemble.fixed.FixedEnsembleProvider;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.BaseClassForTests;
@@ -29,9 +35,8 @@
 import org.apache.zookeeper.Watcher;
 import org.apache.zookeeper.ZooDefs;
 import org.apache.zookeeper.ZooKeeper;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
-import org.testng.Assert;
-import org.testng.annotations.Test;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -52,7 +57,7 @@
         };
         CuratorZookeeperClient  client = new CuratorZookeeperClient(zookeeperFactory, new FixedEnsembleProvider(server.getConnectString()), 10000, 10000, null, new RetryOneTime(1), false);
         client.start();
-        Assert.assertEquals(client.getZooKeeper(), mockZookeeper);
+        assertEquals(client.getZooKeeper(), mockZookeeper);
     }
 
     @Test
@@ -101,11 +106,11 @@
 
                             client.getZooKeeper().getTestable().injectSessionExpiration();
 
-                            Assert.assertTrue(timing.awaitLatch(latch));
+                            assertTrue(timing.awaitLatch(latch));
                         }
                         ZooKeeper zooKeeper = client.getZooKeeper();
                         client.blockUntilConnectedOrTimedOut();
-                        Assert.assertNotNull(zooKeeper.exists("/foo", false));
+                        assertNotNull(zooKeeper.exists("/foo", false));
                         return null;
                     }
                 }
@@ -133,9 +138,9 @@
             Thread.sleep(1000);
 
             server.restart();
-            Assert.assertTrue(client.blockUntilConnectedOrTimedOut());
+            assertTrue(client.blockUntilConnectedOrTimedOut());
             byte[]      readData = client.getZooKeeper().getData("/test", false, null);
-            Assert.assertEquals(readData, writtenData);
+            assertArrayEquals(readData, writtenData);
         }
         finally
         {
@@ -152,7 +157,7 @@
         {
             client.blockUntilConnectedOrTimedOut();
             String              path = client.getZooKeeper().create("/test", new byte[]{1,2,3}, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
-            Assert.assertEquals(path, "/test");
+            assertEquals(path, "/test");
         }
         finally
         {
@@ -168,7 +173,7 @@
         CuratorZookeeperClient client = new CuratorZookeeperClient(server.getConnectString(), 10000, CONNECTION_TIMEOUT_MS, null, new RetryOneTime(1));
         try
         {
-            Assert.assertFalse(client.isConnected());
+            assertFalse(client.isConnected());
             client.start();
 
             outer: do
@@ -183,7 +188,7 @@
                     Thread.sleep(CONNECTION_TIMEOUT_MS);
                 }
 
-                Assert.fail();
+                fail();
             } while ( false );
         }
         finally
diff --git a/curator-client/src/test/java/org/apache/curator/TestEnsurePath.java b/curator-client/src/test/java/org/apache/curator/TestEnsurePath.java
index 5164bac..21d65c9 100644
--- a/curator-client/src/test/java/org/apache/curator/TestEnsurePath.java
+++ b/curator-client/src/test/java/org/apache/curator/TestEnsurePath.java
@@ -18,6 +18,7 @@
  */
 package org.apache.curator;
 
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Matchers.anyBoolean;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
@@ -36,11 +37,10 @@
 import org.apache.curator.utils.EnsurePath;
 import org.apache.zookeeper.ZooKeeper;
 import org.apache.zookeeper.data.Stat;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
-import org.testng.Assert;
-import org.testng.annotations.Test;
 
 public class TestEnsurePath
 {
@@ -117,9 +117,9 @@
             );
         }
 
-        Assert.assertTrue(startedLatch.await(10, TimeUnit.SECONDS));
+        assertTrue(startedLatch.await(10, TimeUnit.SECONDS));
         semaphore.release(3);
-        Assert.assertTrue(finishedLatch.await(10, TimeUnit.SECONDS));
+        assertTrue(finishedLatch.await(10, TimeUnit.SECONDS));
         verify(client, times(3)).exists(Mockito.<String>any(), anyBoolean());
 
         ensurePath.ensure(curator);
diff --git a/curator-client/src/test/java/org/apache/curator/TestIs36.java b/curator-client/src/test/java/org/apache/curator/TestIs36.java
index 6480b6d..e7489a3 100644
--- a/curator-client/src/test/java/org/apache/curator/TestIs36.java
+++ b/curator-client/src/test/java/org/apache/curator/TestIs36.java
@@ -18,19 +18,22 @@
  */
 package org.apache.curator;
 
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.utils.Compatibility;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
 public class TestIs36 extends CuratorTestBase
 {
-    @Test(groups = zk36Group)
+    @Test
+    @Tag(zk36Group)
     public void testIsZk36()
     {
-        Assert.assertTrue(Compatibility.hasGetReachableOrOneMethod());
-        Assert.assertTrue(Compatibility.hasAddrField());
-        Assert.assertTrue(Compatibility.hasPersistentWatchers());
+        assertTrue(Compatibility.hasGetReachableOrOneMethod());
+        assertTrue(Compatibility.hasAddrField());
+        assertTrue(Compatibility.hasPersistentWatchers());
     }
 
     @Override
diff --git a/curator-client/src/test/java/org/apache/curator/TestRetryLoop.java b/curator-client/src/test/java/org/apache/curator/TestRetryLoop.java
index 0922dff..0471a75 100644
--- a/curator-client/src/test/java/org/apache/curator/TestRetryLoop.java
+++ b/curator-client/src/test/java/org/apache/curator/TestRetryLoop.java
@@ -18,6 +18,9 @@
  */
 package org.apache.curator;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import org.apache.curator.retry.ExponentialBackoffRetry;
 import org.apache.curator.retry.RetryForever;
 import org.apache.curator.retry.RetryOneTime;
@@ -26,9 +29,8 @@
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.ZooDefs;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
-import org.testng.Assert;
-import org.testng.annotations.Test;
 
 import java.util.concurrent.TimeUnit;
 
@@ -44,7 +46,7 @@
             @Override
             public void sleepFor(long time, TimeUnit unit) throws InterruptedException
             {
-                Assert.assertTrue(unit.toMillis(time) <= 100);
+                assertTrue(unit.toMillis(time) <= 100);
             }
         };
         ExponentialBackoffRetry         retry = new ExponentialBackoffRetry(1, Integer.MAX_VALUE, 100);
@@ -89,7 +91,7 @@
 
                     default:
                     {
-                        Assert.fail();
+                        fail();
                         break outer;
                     }
                 }
@@ -106,7 +108,7 @@
                 }
             }
 
-            Assert.assertTrue(loopCount >= 2);
+            assertTrue(loopCount >= 2);
         }
         finally
         {
@@ -127,7 +129,7 @@
             {
                 if ( ++loopCount > 2 )
                 {
-                    Assert.fail();
+                    fail();
                     break;
                 }
 
@@ -142,7 +144,7 @@
                 }
             }
 
-            Assert.assertTrue(loopCount > 0);
+            assertTrue(loopCount > 0);
         }
         finally
         {
@@ -160,7 +162,7 @@
         for (int i = 0; i < 10; i++)
         {
             boolean allowed = retryForever.allowRetry(i, 0, sleeper);
-            Assert.assertTrue(allowed);
+            assertTrue(allowed);
             Mockito.verify(sleeper, times(i + 1)).sleepFor(retryIntervalMs, TimeUnit.MILLISECONDS);
         }
     }
@@ -196,14 +198,14 @@
                 }
             }
 
-            Assert.fail("Should failed with SessionExpiredException.");
+            fail("Should failed with SessionExpiredException.");
         }
         catch ( Exception e )
         {
             if ( e instanceof KeeperException )
             {
                 int rc = ((KeeperException) e).code().intValue();
-                Assert.assertEquals(rc, KeeperException.Code.SESSIONEXPIRED.intValue());
+                assertEquals(rc, KeeperException.Code.SESSIONEXPIRED.intValue());
             }
             else
             {
diff --git a/curator-client/src/test/java/org/apache/curator/TestSessionFailRetryLoop.java b/curator-client/src/test/java/org/apache/curator/TestSessionFailRetryLoop.java
index 46657e5..049ee88 100644
--- a/curator-client/src/test/java/org/apache/curator/TestSessionFailRetryLoop.java
+++ b/curator-client/src/test/java/org/apache/curator/TestSessionFailRetryLoop.java
@@ -18,12 +18,16 @@
  */
 package org.apache.curator;
 
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import org.apache.curator.retry.ExponentialBackoffRetry;
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.curator.test.Timing;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.Callable;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -55,13 +59,13 @@
                             {
                                 if ( firstTime.compareAndSet(true, false) )
                                 {
-                                    Assert.assertNull(client.getZooKeeper().exists("/foo/bar", false));
+                                    assertNull(client.getZooKeeper().exists("/foo/bar", false));
                                     client.getZooKeeper().getTestable().injectSessionExpiration();
                                     client.getZooKeeper();
                                     client.blockUntilConnectedOrTimedOut();
                                 }
 
-                                Assert.assertNull(client.getZooKeeper().exists("/foo/bar", false));
+                                assertNull(client.getZooKeeper().exists("/foo/bar", false));
                                 return null;
                             }
                         }
@@ -75,8 +79,8 @@
                             @Override
                             public Void call() throws Exception
                             {
-                                Assert.assertFalse(firstTime.get());
-                                Assert.assertNull(client.getZooKeeper().exists("/foo/bar", false));
+                                assertFalse(firstTime.get());
+                                assertNull(client.getZooKeeper().exists("/foo/bar", false));
                                 secondWasDone.set(true);
                                 return null;
                             }
@@ -89,7 +93,7 @@
                 }
             }
 
-            Assert.assertTrue(secondWasDone.get());
+            assertTrue(secondWasDone.get());
         }
         finally
         {
@@ -129,13 +133,13 @@
                                 {
                                     if ( firstTime.compareAndSet(true, false) )
                                     {
-                                        Assert.assertNull(client.getZooKeeper().exists("/foo/bar", false));
+                                        assertNull(client.getZooKeeper().exists("/foo/bar", false));
                                         client.getZooKeeper().getTestable().injectSessionExpiration();
                                         client.getZooKeeper();
                                         client.blockUntilConnectedOrTimedOut();
                                     }
 
-                                    Assert.assertNull(client.getZooKeeper().exists("/foo/bar", false));
+                                    assertNull(client.getZooKeeper().exists("/foo/bar", false));
                                     return null;
                                 }
                             }
@@ -149,8 +153,8 @@
                                 @Override
                                 public Void call() throws Exception
                                 {
-                                    Assert.assertFalse(firstTime.get());
-                                    Assert.assertNull(client.getZooKeeper().exists("/foo/bar", false));
+                                    assertFalse(firstTime.get());
+                                    assertNull(client.getZooKeeper().exists("/foo/bar", false));
                                     secondWasDone.set(true);
                                     return null;
                                 }
@@ -161,7 +165,7 @@
                 }
             );
 
-            Assert.assertTrue(secondWasDone.get());
+            assertTrue(secondWasDone.get());
         }
         finally
         {
@@ -194,14 +198,14 @@
                                 @Override
                                 public Void call() throws Exception
                                 {
-                                    Assert.assertNull(client.getZooKeeper().exists("/foo/bar", false));
+                                    assertNull(client.getZooKeeper().exists("/foo/bar", false));
                                     client.getZooKeeper().getTestable().injectSessionExpiration();
 
                                     timing.sleepABit();
 
                                     client.getZooKeeper();
                                     client.blockUntilConnectedOrTimedOut();
-                                    Assert.assertNull(client.getZooKeeper().exists("/foo/bar", false));
+                                    assertNull(client.getZooKeeper().exists("/foo/bar", false));
                                     return null;
                                 }
                             }
@@ -213,7 +217,7 @@
                     }
                 }
 
-                Assert.fail();
+                fail();
             }
             catch ( SessionFailRetryLoop.SessionFailedException dummy )
             {
@@ -256,12 +260,12 @@
                                     @Override
                                     public Void call() throws Exception
                                     {
-                                        Assert.assertNull(client.getZooKeeper().exists("/foo/bar", false));
+                                        assertNull(client.getZooKeeper().exists("/foo/bar", false));
                                         client.getZooKeeper().getTestable().injectSessionExpiration();
 
                                         client.getZooKeeper();
                                         client.blockUntilConnectedOrTimedOut();
-                                        Assert.assertNull(client.getZooKeeper().exists("/foo/bar", false));
+                                        assertNull(client.getZooKeeper().exists("/foo/bar", false));
                                         return null;
                                     }
                                 }
diff --git a/curator-client/src/test/java/org/apache/curator/utils/TestCloseableExecutorService.java b/curator-client/src/test/java/org/apache/curator/utils/TestCloseableExecutorService.java
index c083655..497e467 100644
--- a/curator-client/src/test/java/org/apache/curator/utils/TestCloseableExecutorService.java
+++ b/curator-client/src/test/java/org/apache/curator/utils/TestCloseableExecutorService.java
@@ -19,11 +19,13 @@
 
 package org.apache.curator.utils;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Lists;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
 import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CountDownLatch;
@@ -38,13 +40,13 @@
 
     private volatile ExecutorService executorService;
 
-    @BeforeMethod
+    @BeforeEach
     public void setup()
     {
         executorService = Executors.newFixedThreadPool(QTY * 2);
     }
 
-    @AfterMethod
+    @AfterEach
     public void tearDown()
     {
         executorService.shutdownNow();
@@ -63,9 +65,9 @@
                 submitRunnable(service, startLatch, latch);
             }
 
-            Assert.assertTrue(startLatch.await(3, TimeUnit.SECONDS));
+            assertTrue(startLatch.await(3, TimeUnit.SECONDS));
             service.close();
-            Assert.assertTrue(latch.await(3, TimeUnit.SECONDS));
+            assertTrue(latch.await(3, TimeUnit.SECONDS));
         }
         catch ( AssertionError e )
         {
@@ -111,9 +113,9 @@
             );
         }
 
-        Assert.assertTrue(startLatch.await(3, TimeUnit.SECONDS));
+        assertTrue(startLatch.await(3, TimeUnit.SECONDS));
         service.close();
-        Assert.assertTrue(latch.await(3, TimeUnit.SECONDS));
+        assertTrue(latch.await(3, TimeUnit.SECONDS));
     }
 
     @Test
@@ -146,14 +148,14 @@
             futures.add(future);
         }
 
-        Assert.assertTrue(startLatch.await(3, TimeUnit.SECONDS));
+        assertTrue(startLatch.await(3, TimeUnit.SECONDS));
 
         for ( Future<?> future : futures )
         {
             future.cancel(true);
         }
 
-        Assert.assertEquals(service.size(), 0);
+        assertEquals(service.size(), 0);
     }
 
     @Test
@@ -187,13 +189,13 @@
             futures.add(future);
         }
 
-        Assert.assertTrue(startLatch.await(3, TimeUnit.SECONDS));
+        assertTrue(startLatch.await(3, TimeUnit.SECONDS));
         for ( Future<?> future : futures )
         {
             future.cancel(true);
         }
 
-        Assert.assertEquals(service.size(), 0);
+        assertEquals(service.size(), 0);
     }
 
     @Test
@@ -236,10 +238,10 @@
             Thread.sleep(100);
         }
 
-        Assert.assertTrue(startLatch.await(3, TimeUnit.SECONDS));
+        assertTrue(startLatch.await(3, TimeUnit.SECONDS));
         service.close();
-        Assert.assertTrue(latch.await(3, TimeUnit.SECONDS));
-        Assert.assertEquals(outsideLatch.getCount(), 1);
+        assertTrue(latch.await(3, TimeUnit.SECONDS));
+        assertEquals(outsideLatch.getCount(), 1);
     }
 
     private void submitRunnable(CloseableExecutorService service, final CountDownLatch startLatch, final CountDownLatch latch)
diff --git a/curator-client/src/test/java/org/apache/curator/utils/TestCloseableScheduledExecutorService.java b/curator-client/src/test/java/org/apache/curator/utils/TestCloseableScheduledExecutorService.java
index c2510ed..85be3e3 100644
--- a/curator-client/src/test/java/org/apache/curator/utils/TestCloseableScheduledExecutorService.java
+++ b/curator-client/src/test/java/org/apache/curator/utils/TestCloseableScheduledExecutorService.java
@@ -18,17 +18,18 @@
  */
 package org.apache.curator.utils;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
 public class TestCloseableScheduledExecutorService
 {
     private static final int QTY = 10;
@@ -36,13 +37,13 @@
 
     private volatile ScheduledExecutorService executorService;
 
-    @BeforeMethod
+    @BeforeEach
     public void setup()
     {
         executorService = Executors.newScheduledThreadPool(QTY * 2);
     }
 
-    @AfterMethod
+    @AfterEach
     public void tearDown()
     {
         executorService.shutdownNow();
@@ -68,7 +69,7 @@
                 TimeUnit.MILLISECONDS
         );
 
-        Assert.assertTrue(latch.await((QTY * 2) * DELAY_MS, TimeUnit.MILLISECONDS));
+        assertTrue(latch.await((QTY * 2) * DELAY_MS, TimeUnit.MILLISECONDS));
     }
 
     @Test
@@ -103,18 +104,18 @@
         Thread.sleep(DELAY_MS * 2);
 
         int innerValue = innerCounter.get();
-        Assert.assertTrue(innerValue > 0);
+        assertTrue(innerValue > 0);
 
         int value = outerCounter.get();
         Thread.sleep(DELAY_MS * 2);
         int newValue = outerCounter.get();
-        Assert.assertTrue(newValue > value);
-        Assert.assertEquals(innerValue, innerCounter.get());
+        assertTrue(newValue > value);
+        assertEquals(innerValue, innerCounter.get());
 
         value = newValue;
         Thread.sleep(DELAY_MS * 2);
         newValue = outerCounter.get();
-        Assert.assertTrue(newValue > value);
-        Assert.assertEquals(innerValue, innerCounter.get());
+        assertTrue(newValue > value);
+        assertEquals(innerValue, innerCounter.get());
     }
 }
diff --git a/curator-client/src/test/java/org/apache/curator/utils/TestZKPaths.java b/curator-client/src/test/java/org/apache/curator/utils/TestZKPaths.java
index ef05d34..5cfaf7b 100644
--- a/curator-client/src/test/java/org/apache/curator/utils/TestZKPaths.java
+++ b/curator-client/src/test/java/org/apache/curator/utils/TestZKPaths.java
@@ -19,8 +19,8 @@
 
 package org.apache.curator.utils;
 
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import org.junit.jupiter.api.Test;
 import java.util.Arrays;
 import java.util.Collections;
 
@@ -30,58 +30,58 @@
     @Test
     public void testMakePath()
     {
-        Assert.assertEquals(ZKPaths.makePath(null, "/"), "/");
-        Assert.assertEquals(ZKPaths.makePath("", null), "/");
-        Assert.assertEquals(ZKPaths.makePath("/", null), "/");
-        Assert.assertEquals(ZKPaths.makePath(null, null), "/");
+        assertEquals(ZKPaths.makePath(null, "/"), "/");
+        assertEquals(ZKPaths.makePath("", null), "/");
+        assertEquals(ZKPaths.makePath("/", null), "/");
+        assertEquals(ZKPaths.makePath(null, null), "/");
 
-        Assert.assertEquals(ZKPaths.makePath("/", "/"), "/");
-        Assert.assertEquals(ZKPaths.makePath("", "/"), "/");
-        Assert.assertEquals(ZKPaths.makePath("/", ""), "/");
-        Assert.assertEquals(ZKPaths.makePath("", ""), "/");
+        assertEquals(ZKPaths.makePath("/", "/"), "/");
+        assertEquals(ZKPaths.makePath("", "/"), "/");
+        assertEquals(ZKPaths.makePath("/", ""), "/");
+        assertEquals(ZKPaths.makePath("", ""), "/");
 
-        Assert.assertEquals(ZKPaths.makePath("foo", ""), "/foo");
-        Assert.assertEquals(ZKPaths.makePath("foo", "/"), "/foo");
-        Assert.assertEquals(ZKPaths.makePath("/foo", ""), "/foo");
-        Assert.assertEquals(ZKPaths.makePath("/foo", "/"), "/foo");
+        assertEquals(ZKPaths.makePath("foo", ""), "/foo");
+        assertEquals(ZKPaths.makePath("foo", "/"), "/foo");
+        assertEquals(ZKPaths.makePath("/foo", ""), "/foo");
+        assertEquals(ZKPaths.makePath("/foo", "/"), "/foo");
 
-        Assert.assertEquals(ZKPaths.makePath("foo", null), "/foo");
-        Assert.assertEquals(ZKPaths.makePath("foo", null), "/foo");
-        Assert.assertEquals(ZKPaths.makePath("/foo", null), "/foo");
-        Assert.assertEquals(ZKPaths.makePath("/foo", null), "/foo");
+        assertEquals(ZKPaths.makePath("foo", null), "/foo");
+        assertEquals(ZKPaths.makePath("foo", null), "/foo");
+        assertEquals(ZKPaths.makePath("/foo", null), "/foo");
+        assertEquals(ZKPaths.makePath("/foo", null), "/foo");
 
-        Assert.assertEquals(ZKPaths.makePath("", "bar"), "/bar");
-        Assert.assertEquals(ZKPaths.makePath("/", "bar"), "/bar");
-        Assert.assertEquals(ZKPaths.makePath("", "/bar"), "/bar");
-        Assert.assertEquals(ZKPaths.makePath("/", "/bar"), "/bar");
+        assertEquals(ZKPaths.makePath("", "bar"), "/bar");
+        assertEquals(ZKPaths.makePath("/", "bar"), "/bar");
+        assertEquals(ZKPaths.makePath("", "/bar"), "/bar");
+        assertEquals(ZKPaths.makePath("/", "/bar"), "/bar");
 
-        Assert.assertEquals(ZKPaths.makePath(null, "bar"), "/bar");
-        Assert.assertEquals(ZKPaths.makePath(null, "bar"), "/bar");
-        Assert.assertEquals(ZKPaths.makePath(null, "/bar"), "/bar");
-        Assert.assertEquals(ZKPaths.makePath(null, "/bar"), "/bar");
+        assertEquals(ZKPaths.makePath(null, "bar"), "/bar");
+        assertEquals(ZKPaths.makePath(null, "bar"), "/bar");
+        assertEquals(ZKPaths.makePath(null, "/bar"), "/bar");
+        assertEquals(ZKPaths.makePath(null, "/bar"), "/bar");
 
-        Assert.assertEquals(ZKPaths.makePath("foo", "bar"), "/foo/bar");
-        Assert.assertEquals(ZKPaths.makePath("/foo", "bar"), "/foo/bar");
-        Assert.assertEquals(ZKPaths.makePath("foo", "/bar"), "/foo/bar");
-        Assert.assertEquals(ZKPaths.makePath("/foo", "/bar"), "/foo/bar");
-        Assert.assertEquals(ZKPaths.makePath("/foo", "bar/"), "/foo/bar");
-        Assert.assertEquals(ZKPaths.makePath("/foo/", "/bar/"), "/foo/bar");
+        assertEquals(ZKPaths.makePath("foo", "bar"), "/foo/bar");
+        assertEquals(ZKPaths.makePath("/foo", "bar"), "/foo/bar");
+        assertEquals(ZKPaths.makePath("foo", "/bar"), "/foo/bar");
+        assertEquals(ZKPaths.makePath("/foo", "/bar"), "/foo/bar");
+        assertEquals(ZKPaths.makePath("/foo", "bar/"), "/foo/bar");
+        assertEquals(ZKPaths.makePath("/foo/", "/bar/"), "/foo/bar");
 
-        Assert.assertEquals(ZKPaths.makePath("foo", "bar", "baz"), "/foo/bar/baz");
-        Assert.assertEquals(ZKPaths.makePath("foo", "bar", "baz", "qux"), "/foo/bar/baz/qux");
-        Assert.assertEquals(ZKPaths.makePath("/foo", "/bar", "/baz"), "/foo/bar/baz");
-        Assert.assertEquals(ZKPaths.makePath("/foo/", "/bar/", "/baz/"), "/foo/bar/baz");
-        Assert.assertEquals(ZKPaths.makePath("foo", null, null), "/foo");
-        Assert.assertEquals(ZKPaths.makePath("foo", "bar", null), "/foo/bar");
-        Assert.assertEquals(ZKPaths.makePath("foo", null, "baz"), "/foo/baz");
+        assertEquals(ZKPaths.makePath("foo", "bar", "baz"), "/foo/bar/baz");
+        assertEquals(ZKPaths.makePath("foo", "bar", "baz", "qux"), "/foo/bar/baz/qux");
+        assertEquals(ZKPaths.makePath("/foo", "/bar", "/baz"), "/foo/bar/baz");
+        assertEquals(ZKPaths.makePath("/foo/", "/bar/", "/baz/"), "/foo/bar/baz");
+        assertEquals(ZKPaths.makePath("foo", null, null), "/foo");
+        assertEquals(ZKPaths.makePath("foo", "bar", null), "/foo/bar");
+        assertEquals(ZKPaths.makePath("foo", null, "baz"), "/foo/baz");
     }
 
     @Test
     public void testSplit()
     {
-        Assert.assertEquals(ZKPaths.split("/"), Collections.emptyList());
-        Assert.assertEquals(ZKPaths.split("/test"), Collections.singletonList("test"));
-        Assert.assertEquals(ZKPaths.split("/test/one"), Arrays.asList("test", "one"));
-        Assert.assertEquals(ZKPaths.split("/test/one/two"), Arrays.asList("test", "one", "two"));
+        assertEquals(ZKPaths.split("/"), Collections.emptyList());
+        assertEquals(ZKPaths.split("/test"), Collections.singletonList("test"));
+        assertEquals(ZKPaths.split("/test/one"), Arrays.asList("test", "one"));
+        assertEquals(ZKPaths.split("/test/one/two"), Arrays.asList("test", "one", "two"));
     }
 }
diff --git a/curator-framework/pom.xml b/curator-framework/pom.xml
index e88a9c8..b44dcde 100644
--- a/curator-framework/pom.xml
+++ b/curator-framework/pom.xml
@@ -76,8 +76,8 @@
         </dependency>
 
         <dependency>
-            <groupId>org.testng</groupId>
-            <artifactId>testng</artifactId>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
             <scope>test</scope>
         </dependency>
 
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/ensemble/TestEnsembleProvider.java b/curator-framework/src/test/java/org/apache/curator/framework/ensemble/TestEnsembleProvider.java
index 19d65a4..4891714 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/ensemble/TestEnsembleProvider.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/ensemble/TestEnsembleProvider.java
@@ -18,6 +18,8 @@
  */
 package org.apache.curator.framework.ensemble;
 
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.ensemble.EnsembleProvider;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -28,11 +30,10 @@
 import org.apache.curator.test.TestingServer;
 import org.apache.curator.test.Timing;
 import org.apache.curator.utils.CloseableUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
 
 public class TestEnsembleProvider extends BaseClassForTests
 {
@@ -46,7 +47,7 @@
         try
         {
             client.start();
-            Assert.assertTrue(timing.acquireSemaphore(counter));
+            assertTrue(timing.acquireSemaphore(counter));
         }
         finally
         {
@@ -87,20 +88,20 @@
             client.getConnectionStateListenable().addListener(listener);
             client.start();
 
-            Assert.assertTrue(timing.awaitLatch(connectedLatch));
+            assertTrue(timing.awaitLatch(connectedLatch));
 
             server.stop();
 
-            Assert.assertTrue(timing.awaitLatch(lostLatch));
+            assertTrue(timing.awaitLatch(lostLatch));
             counter.drainPermits();
             for ( int i = 0; i < 5; ++i )
             {
                 // the ensemble provider should still be called periodically when the connection is lost
-                Assert.assertTrue(timing.acquireSemaphore(counter), "Failed when i is: " + i);
+                assertTrue(timing.acquireSemaphore(counter), "Failed when i is: " + i);
             }
 
             server = new TestingServer();   // this changes the CountingEnsembleProvider's value for getConnectionString() - connection should notice this and recover
-            Assert.assertTrue(timing.awaitLatch(reconnectedLatch));
+            assertTrue(timing.awaitLatch(reconnectedLatch));
         }
         finally
         {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestBlockUntilConnected.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestBlockUntilConnected.java
index 01646fc..7c5091b 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestBlockUntilConnected.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestBlockUntilConnected.java
@@ -19,6 +19,10 @@
 
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.state.ConnectionState;
@@ -28,8 +32,8 @@
 import org.apache.curator.test.TestingServer;
 import org.apache.curator.test.Timing;
 import org.apache.curator.utils.CloseableUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.Timer;
 import java.util.TimerTask;
 import java.util.concurrent.CountDownLatch;
@@ -66,12 +70,12 @@
 
             client.start();
 
-            Assert.assertTrue(timing.awaitLatch(connectedLatch), "Timed out awaiting latch");
-            Assert.assertTrue(client.blockUntilConnected(1, TimeUnit.SECONDS), "Not connected");
+            assertTrue(timing.awaitLatch(connectedLatch), "Timed out awaiting latch");
+            assertTrue(client.blockUntilConnected(1, TimeUnit.SECONDS), "Not connected");
         }
         catch ( InterruptedException e )
         {
-            Assert.fail("Unexpected interruption");
+            fail("Unexpected interruption");
         }
         finally
         {
@@ -93,11 +97,11 @@
         try
         {
             client.start();
-            Assert.assertTrue(client.blockUntilConnected(5, TimeUnit.SECONDS), "Not connected");
+            assertTrue(client.blockUntilConnected(5, TimeUnit.SECONDS), "Not connected");
         }
         catch ( InterruptedException e )
         {
-            Assert.fail("Unexpected interruption");
+            fail("Unexpected interruption");
         }
         finally
         {
@@ -137,21 +141,21 @@
             client.start();
 
             //Block until we're connected
-            Assert.assertTrue(client.blockUntilConnected(5, TimeUnit.SECONDS), "Failed to connect");
+            assertTrue(client.blockUntilConnected(5, TimeUnit.SECONDS), "Failed to connect");
 
             //Kill the server
             CloseableUtils.closeQuietly(server);
 
             //Wait until we hit the lost state
-            Assert.assertTrue(timing.awaitLatch(lostLatch), "Failed to reach LOST state");
+            assertTrue(timing.awaitLatch(lostLatch), "Failed to reach LOST state");
 
             server = new TestingServer(server.getPort(), server.getTempDirectory());
 
-            Assert.assertTrue(client.blockUntilConnected(5, TimeUnit.SECONDS), "Not connected");
+            assertTrue(client.blockUntilConnected(5, TimeUnit.SECONDS), "Not connected");
         }
         catch ( Exception e )
         {
-            Assert.fail("Unexpected exception " + e);
+            fail("Unexpected exception " + e);
         }
         finally
         {
@@ -177,11 +181,11 @@
         try
         {
             client.start();
-            Assert.assertFalse(client.blockUntilConnected(5, TimeUnit.SECONDS), "Connected");
+            assertFalse(client.blockUntilConnected(5, TimeUnit.SECONDS), "Connected");
         }
         catch ( InterruptedException e )
         {
-            Assert.fail("Unexpected interruption");
+            fail("Unexpected interruption");
         }
         finally
         {
@@ -222,7 +226,7 @@
             }, 3000);
 
             client.blockUntilConnected(5, TimeUnit.SECONDS);
-            Assert.fail("Expected interruption did not occur");
+            fail("Expected interruption did not occur");
         }
         catch ( InterruptedException e )
         {
@@ -249,7 +253,7 @@
                 client.start();
                 client.blockUntilConnected();
 
-                Assert.assertTrue(client.getZookeeperClient().isConnected(), "Not connected after blocking for connection #" + i);
+                assertTrue(client.getZookeeperClient().isConnected(), "Not connected after blocking for connection #" + i);
             }
             finally
             {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCompression.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCompression.java
index 520d0b6..613ba9d 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCompression.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCompression.java
@@ -18,14 +18,18 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.api.CompressionProvider;
 import org.apache.curator.retry.RetryOneTime;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.atomic.AtomicInteger;
 
 public class TestCompression extends BaseClassForTests
@@ -72,16 +76,16 @@
 
             client.create().compressed().creatingParentsIfNeeded().forPath("/a/b/c", data);
 
-            Assert.assertNotEquals(data, client.getData().forPath("/a/b/c"));
-            Assert.assertEquals(data.length, client.getData().decompressed().forPath("/a/b/c").length);
+            assertNotEquals(data, client.getData().forPath("/a/b/c"));
+            assertEquals(data.length, client.getData().decompressed().forPath("/a/b/c").length);
         }
         finally
         {
             CloseableUtils.closeQuietly(client);
         }
 
-        Assert.assertEquals(compressCounter.get(), 1);
-        Assert.assertEquals(decompressCounter.get(), 1);
+        assertEquals(compressCounter.get(), 1);
+        assertEquals(decompressCounter.get(), 1);
     }
 
     @Test
@@ -95,10 +99,10 @@
             client.start();
 
             client.create().creatingParentsIfNeeded().forPath("/a/b/c", data);
-            Assert.assertEquals(data, client.getData().forPath("/a/b/c"));
+            assertArrayEquals(data, client.getData().forPath("/a/b/c"));
 
             client.setData().compressed().forPath("/a/b/c", data);
-            Assert.assertEquals(data.length, client.getData().decompressed().forPath("/a/b/c").length);
+            assertEquals(data.length, client.getData().decompressed().forPath("/a/b/c").length);
         }
         finally
         {
@@ -118,8 +122,8 @@
 
             client.create().compressed().creatingParentsIfNeeded().forPath("/a/b/c", data);
 
-            Assert.assertNotEquals(data, client.getData().forPath("/a/b/c"));
-            Assert.assertEquals(data.length, client.getData().decompressed().forPath("/a/b/c").length);
+            assertNotEquals(data, client.getData().forPath("/a/b/c"));
+            assertEquals(data.length, client.getData().decompressed().forPath("/a/b/c").length);
         }
         finally
         {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCompressionInTransactionNew.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCompressionInTransactionNew.java
index d302119..7fe2823 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCompressionInTransactionNew.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCompressionInTransactionNew.java
@@ -18,14 +18,16 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.api.transaction.CuratorOp;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.utils.CloseableUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
 
 public class TestCompressionInTransactionNew extends BaseClassForTests
 {
@@ -43,12 +45,12 @@
             //Create uncompressed data in a transaction
             CuratorOp op = client.transactionOp().create().forPath(path, data);
             client.transaction().forOperations(op);
-            Assert.assertEquals(data, client.getData().forPath(path));
+            assertArrayEquals(data, client.getData().forPath(path));
 
             //Create compressed data in transaction
             op = client.transactionOp().setData().compressed().forPath(path, data);
             client.transaction().forOperations(op);
-            Assert.assertEquals(data, client.getData().decompressed().forPath(path));
+            assertArrayEquals(data, client.getData().decompressed().forPath(path));
         }
         finally
         {
@@ -76,18 +78,18 @@
             client.transaction().forOperations(op1, op2);
 
             //Check they exist
-            Assert.assertNotNull(client.checkExists().forPath(path1));
-            Assert.assertNotNull(client.checkExists().forPath(path2));
+            assertNotNull(client.checkExists().forPath(path1));
+            assertNotNull(client.checkExists().forPath(path2));
             
             //Set the nodes, path1 compressed, path2 uncompressed.
             op1 = client.transactionOp().setData().compressed().forPath(path1, data1);
             op2 = client.transactionOp().setData().forPath(path2, data2);
             client.transaction().forOperations(op1, op2);
             
-            Assert.assertNotEquals(data1, client.getData().forPath(path1));
-            Assert.assertEquals(data1, client.getData().decompressed().forPath(path1));
+            assertNotEquals(data1, client.getData().forPath(path1));
+            assertArrayEquals(data1, client.getData().decompressed().forPath(path1));
       
-            Assert.assertEquals(data2, client.getData().forPath(path2));            
+            assertArrayEquals(data2, client.getData().forPath(path2));
         }
         finally
         {
@@ -114,11 +116,11 @@
 
             client.transaction().forOperations(op1, op2);
 
-            Assert.assertNotEquals(data1, client.getData().forPath(path1));
-            Assert.assertEquals(data1, client.getData().decompressed().forPath(path1));
+            assertNotEquals(data1, client.getData().forPath(path1));
+            assertArrayEquals(data1, client.getData().decompressed().forPath(path1));
             
-            Assert.assertNotEquals(data2, client.getData().forPath(path2));
-            Assert.assertEquals(data2, client.getData().decompressed().forPath(path2));            
+            assertNotEquals(data2, client.getData().forPath(path2));
+            assertArrayEquals(data2, client.getData().decompressed().forPath(path2));
         }
         finally
         {
@@ -149,10 +151,10 @@
             CuratorOp op2 = client.transactionOp().create().forPath(path2, data2);
             client.transaction().forOperations(op1, op2);
 
-            Assert.assertNotEquals(data1, client.getData().forPath(path1));
-            Assert.assertEquals(data1, client.getData().decompressed().forPath(path1));
+            assertNotEquals(data1, client.getData().forPath(path1));
+            assertArrayEquals(data1, client.getData().decompressed().forPath(path1));
       
-            Assert.assertEquals(data2, client.getData().forPath(path2));            
+            assertArrayEquals(data2, client.getData().forPath(path2));
         }
         finally
         {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCompressionInTransactionOld.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCompressionInTransactionOld.java
index ebf591b..9de1afb 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCompressionInTransactionOld.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCompressionInTransactionOld.java
@@ -18,16 +18,16 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
-import org.apache.curator.framework.api.CompressionProvider;
 import org.apache.curator.retry.RetryOneTime;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import java.util.concurrent.atomic.AtomicInteger;
+import org.junit.jupiter.api.Test;
 
 @SuppressWarnings("deprecation")
 public class TestCompressionInTransactionOld extends BaseClassForTests
@@ -45,11 +45,11 @@
 
             //Create uncompressed data in a transaction
             client.inTransaction().create().forPath(path, data).and().commit();
-            Assert.assertEquals(data, client.getData().forPath(path));
+            assertArrayEquals(data, client.getData().forPath(path));
 
             //Create compressed data in transaction
             client.inTransaction().setData().compressed().forPath(path, data).and().commit();
-            Assert.assertEquals(data, client.getData().decompressed().forPath(path));
+            assertArrayEquals(data, client.getData().decompressed().forPath(path));
         }
         finally
         {
@@ -76,17 +76,17 @@
             create().forPath(path2).and().commit();
 
             //Check they exist
-            Assert.assertNotNull(client.checkExists().forPath(path1));
-            Assert.assertNotNull(client.checkExists().forPath(path2));
+            assertNotNull(client.checkExists().forPath(path1));
+            assertNotNull(client.checkExists().forPath(path2));
             
             //Set the nodes, path1 compressed, path2 uncompressed.
             client.inTransaction().setData().compressed().forPath(path1, data1).and().
             setData().forPath(path2, data2).and().commit();
             
-            Assert.assertNotEquals(data1, client.getData().forPath(path1));
-            Assert.assertEquals(data1, client.getData().decompressed().forPath(path1));
+            assertNotEquals(data1, client.getData().forPath(path1));
+            assertArrayEquals(data1, client.getData().decompressed().forPath(path1));
       
-            Assert.assertEquals(data2, client.getData().forPath(path2));            
+            assertArrayEquals(data2, client.getData().forPath(path2));
         }
         finally
         {
@@ -111,11 +111,11 @@
             client.inTransaction().create().compressed().forPath(path1, data1).and().
             create().compressed().forPath(path2, data2).and().commit();
 
-            Assert.assertNotEquals(data1, client.getData().forPath(path1));
-            Assert.assertEquals(data1, client.getData().decompressed().forPath(path1));
+            assertNotEquals(data1, client.getData().forPath(path1));
+            assertArrayEquals(data1, client.getData().decompressed().forPath(path1));
             
-            Assert.assertNotEquals(data2, client.getData().forPath(path2));
-            Assert.assertEquals(data2, client.getData().decompressed().forPath(path2));            
+            assertNotEquals(data2, client.getData().forPath(path2));
+            assertArrayEquals(data2, client.getData().decompressed().forPath(path2));
         }
         finally
         {
@@ -145,10 +145,10 @@
             client.inTransaction().create().compressed().forPath(path1, data1).and().
             create().forPath(path2, data2).and().commit();
 
-            Assert.assertNotEquals(data1, client.getData().forPath(path1));
-            Assert.assertEquals(data1, client.getData().decompressed().forPath(path1));
+            assertNotEquals(data1, client.getData().forPath(path1));
+            assertArrayEquals(data1, client.getData().decompressed().forPath(path1));
       
-            Assert.assertEquals(data2, client.getData().forPath(path2));            
+            assertArrayEquals(data2, client.getData().forPath(path2));
         }
         finally
         {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCreate.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCreate.java
index 3236574..b8068a6 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCreate.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCreate.java
@@ -18,6 +18,11 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.apache.zookeeper.ZooDefs.Ids.ANYONE_ID_UNSAFE;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.api.ACLProvider;
@@ -30,16 +35,14 @@
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.ZooDefs;
 import org.apache.zookeeper.data.ACL;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
-import static org.apache.zookeeper.ZooDefs.Ids.ANYONE_ID_UNSAFE;
-
 public class TestCreate extends BaseClassForTests
 {
     private static final List<ACL> READ_CREATE = Collections.singletonList(new ACL(ZooDefs.Perms.CREATE | ZooDefs.Perms.READ, ANYONE_ID_UNSAFE));
@@ -91,9 +94,9 @@
             List<ACL> acl = Collections.singletonList(new ACL(ZooDefs.Perms.CREATE | ZooDefs.Perms.READ, ANYONE_ID_UNSAFE));
             client.create().creatingParentsIfNeeded().withACL(acl).forPath(path);
             List<ACL> actual_bar_foo = client.getACL().forPath(path);
-            Assert.assertEquals(actual_bar_foo, acl);
+            assertEquals(actual_bar_foo, acl);
             List<ACL> actual_bar = client.getACL().forPath("/bar");
-            Assert.assertEquals(actual_bar, ZooDefs.Ids.OPEN_ACL_UNSAFE);
+            assertEquals(actual_bar, ZooDefs.Ids.OPEN_ACL_UNSAFE);
         }
         finally
         {
@@ -113,9 +116,9 @@
             List<ACL> acl = Collections.singletonList(new ACL(ZooDefs.Perms.CREATE | ZooDefs.Perms.READ, ANYONE_ID_UNSAFE));
             client.create().creatingParentsIfNeeded().withACL(acl, true).forPath(path);
             List<ACL> actual_bar_foo = client.getACL().forPath(path);
-            Assert.assertEquals(actual_bar_foo, acl);
+            assertEquals(actual_bar_foo, acl);
             List<ACL> actual_bar = client.getACL().forPath("/bar");
-            Assert.assertEquals(actual_bar, acl);
+            assertEquals(actual_bar, acl);
         }
         finally
         {
@@ -145,11 +148,11 @@
                 }
             };
             client.create().creatingParentsIfNeeded().withACL(acl).inBackground(callback).forPath(path);
-            Assert.assertTrue(latch.await(2000, TimeUnit.MILLISECONDS), "Callback not invoked");
+            assertTrue(latch.await(2000, TimeUnit.MILLISECONDS), "Callback not invoked");
             List<ACL> actual_bar_foo = client.getACL().forPath(path);
-            Assert.assertEquals(actual_bar_foo, acl);
+            assertEquals(actual_bar_foo, acl);
             List<ACL> actual_bar = client.getACL().forPath("/bar");
-            Assert.assertEquals(actual_bar, ZooDefs.Ids.OPEN_ACL_UNSAFE);
+            assertEquals(actual_bar, ZooDefs.Ids.OPEN_ACL_UNSAFE);
         }
         finally
         {
@@ -176,11 +179,11 @@
                 }
             };
             client.create().creatingParentsIfNeeded().withACL(acl, true).inBackground(callback).forPath(path);
-            Assert.assertTrue(latch.await(2000, TimeUnit.MILLISECONDS), "Callback not invoked");
+            assertTrue(latch.await(2000, TimeUnit.MILLISECONDS), "Callback not invoked");
             List<ACL> actual_bar_foo = client.getACL().forPath(path);
-            Assert.assertEquals(actual_bar_foo, acl);
+            assertEquals(actual_bar_foo, acl);
             List<ACL> actual_bar = client.getACL().forPath("/bar");
-            Assert.assertEquals(actual_bar, acl);
+            assertEquals(actual_bar, acl);
         }
         finally
         {
@@ -202,11 +205,11 @@
             String path = "/bar/foo/boo";
             client.create().creatingParentsIfNeeded().forPath(path);
             List<ACL> actual_bar_foo_boo = client.getACL().forPath("/bar/foo/boo");
-            Assert.assertEquals(actual_bar_foo_boo, ZooDefs.Ids.OPEN_ACL_UNSAFE);
+            assertEquals(actual_bar_foo_boo, ZooDefs.Ids.OPEN_ACL_UNSAFE);
             List<ACL> actual_bar_foo = client.getACL().forPath("/bar/foo");
-            Assert.assertEquals(actual_bar_foo, READ_CREATE_WRITE);
+            assertEquals(actual_bar_foo, READ_CREATE_WRITE);
             List<ACL> actual_bar = client.getACL().forPath("/bar");
-            Assert.assertEquals(actual_bar, READ_CREATE);
+            assertEquals(actual_bar, READ_CREATE);
         }
         finally
         {
@@ -237,13 +240,13 @@
 
             final String path = "/bar/foo/boo";
             client.create().creatingParentsIfNeeded().inBackground(callback).forPath(path);
-            Assert.assertTrue(latch.await(2000, TimeUnit.MILLISECONDS), "Callback not invoked");
+            assertTrue(latch.await(2000, TimeUnit.MILLISECONDS), "Callback not invoked");
             List<ACL> actual_bar_foo_boo = client.getACL().forPath(path);
-            Assert.assertEquals(actual_bar_foo_boo, ZooDefs.Ids.OPEN_ACL_UNSAFE);
+            assertEquals(actual_bar_foo_boo, ZooDefs.Ids.OPEN_ACL_UNSAFE);
             List<ACL> actual_bar_foo = client.getACL().forPath("/bar/foo");
-            Assert.assertEquals(actual_bar_foo, READ_CREATE_WRITE);
+            assertEquals(actual_bar_foo, READ_CREATE_WRITE);
             List<ACL> actual_bar = client.getACL().forPath("/bar");
-            Assert.assertEquals(actual_bar, READ_CREATE);
+            assertEquals(actual_bar, READ_CREATE);
         }
         finally
         {
@@ -262,18 +265,18 @@
             client.start();
             client.blockUntilConnected();
             client.create().forPath("/parent");
-            Assert.assertEquals(client.getChildren().forPath("/parent").size(), 0);
+            assertEquals(client.getChildren().forPath("/parent").size(), 0);
             client.create().withProtection().withMode(CreateMode.EPHEMERAL).forPath("/parent/test");
             final List<String> children = client.getChildren().forPath("/parent");
-            Assert.assertEquals(1, children.size());
+            assertEquals(1, children.size());
             final String testZNodeName = children.get(0);
-            Assert.assertEquals(testZNodeName.length(), ProtectedUtils.PROTECTED_PREFIX_WITH_UUID_LENGTH + "test".length());
-            Assert.assertTrue(testZNodeName.startsWith(ProtectedUtils.PROTECTED_PREFIX));
-            Assert.assertEquals(testZNodeName.charAt(ProtectedUtils.PROTECTED_PREFIX_WITH_UUID_LENGTH - 1), ProtectedUtils.PROTECTED_SEPARATOR);
-            Assert.assertTrue(ProtectedUtils.isProtectedZNode(testZNodeName));
-            Assert.assertEquals(ProtectedUtils.normalize(testZNodeName), "test");
-            Assert.assertFalse(ProtectedUtils.isProtectedZNode("parent"));
-            Assert.assertEquals(ProtectedUtils.normalize("parent"), "parent");
+            assertEquals(testZNodeName.length(), ProtectedUtils.PROTECTED_PREFIX_WITH_UUID_LENGTH + "test".length());
+            assertTrue(testZNodeName.startsWith(ProtectedUtils.PROTECTED_PREFIX));
+            assertEquals(testZNodeName.charAt(ProtectedUtils.PROTECTED_PREFIX_WITH_UUID_LENGTH - 1), ProtectedUtils.PROTECTED_SEPARATOR);
+            assertTrue(ProtectedUtils.isProtectedZNode(testZNodeName));
+            assertEquals(ProtectedUtils.normalize(testZNodeName), "test");
+            assertFalse(ProtectedUtils.isProtectedZNode("parent"));
+            assertEquals(ProtectedUtils.normalize("parent"), "parent");
         }
     }
 
@@ -281,28 +284,28 @@
     public void testProtectedUtils() throws Exception
     {
         String name = "_c_53345f98-9423-4e0c-a7b5-9f819e3ec2e1-yo";
-        Assert.assertTrue(ProtectedUtils.isProtectedZNode(name));
-        Assert.assertEquals(ProtectedUtils.normalize(name), "yo");
-        Assert.assertEquals(ProtectedUtils.extractProtectedId(name).get(), "53345f98-9423-4e0c-a7b5-9f819e3ec2e1");
+        assertTrue(ProtectedUtils.isProtectedZNode(name));
+        assertEquals(ProtectedUtils.normalize(name), "yo");
+        assertEquals(ProtectedUtils.extractProtectedId(name).get(), "53345f98-9423-4e0c-a7b5-9f819e3ec2e1");
         name = "c_53345f98-9423-4e0c-a7b5-9f819e3ec2e1-yo";
-        Assert.assertFalse(ProtectedUtils.isProtectedZNode(name));
-        Assert.assertEquals(ProtectedUtils.normalize(name), name);
-        Assert.assertEquals(ProtectedUtils.extractProtectedId(name), Optional.<String>empty());
+        assertFalse(ProtectedUtils.isProtectedZNode(name));
+        assertEquals(ProtectedUtils.normalize(name), name);
+        assertEquals(ProtectedUtils.extractProtectedId(name), Optional.<String>empty());
         name = "_c_53345f98-hola-4e0c-a7b5-9f819e3ec2e1-yo";
-        Assert.assertFalse(ProtectedUtils.isProtectedZNode(name));
-        Assert.assertEquals(ProtectedUtils.normalize(name), name);
-        Assert.assertEquals(ProtectedUtils.extractProtectedId(name), Optional.<String>empty());
+        assertFalse(ProtectedUtils.isProtectedZNode(name));
+        assertEquals(ProtectedUtils.normalize(name), name);
+        assertEquals(ProtectedUtils.extractProtectedId(name), Optional.<String>empty());
         name = "_c_53345f98-hola-4e0c-a7b5-9f819e3ec2e1+yo";
-        Assert.assertFalse(ProtectedUtils.isProtectedZNode(name));
-        Assert.assertEquals(ProtectedUtils.normalize(name), name);
-        Assert.assertEquals(ProtectedUtils.extractProtectedId(name), Optional.<String>empty());
+        assertFalse(ProtectedUtils.isProtectedZNode(name));
+        assertEquals(ProtectedUtils.normalize(name), name);
+        assertEquals(ProtectedUtils.extractProtectedId(name), Optional.<String>empty());
         name = "_c_53345f98-9423-4e0c-a7b5-9f819e3ec2e1-yo";
-        Assert.assertEquals(name, ProtectedUtils.toProtectedZNode("yo", "53345f98-9423-4e0c-a7b5-9f819e3ec2e1"));
-        Assert.assertEquals("yo", ProtectedUtils.toProtectedZNode("yo", null));
+        assertEquals(name, ProtectedUtils.toProtectedZNode("yo", "53345f98-9423-4e0c-a7b5-9f819e3ec2e1"));
+        assertEquals("yo", ProtectedUtils.toProtectedZNode("yo", null));
         String path = ZKPaths.makePath("hola", "yo");
-        Assert.assertEquals(ProtectedUtils.toProtectedZNodePath(path, "53345f98-9423-4e0c-a7b5-9f819e3ec2e1"), ZKPaths.makePath("hola", name));
-        Assert.assertEquals(ProtectedUtils.toProtectedZNodePath(path, null), path);
+        assertEquals(ProtectedUtils.toProtectedZNodePath(path, "53345f98-9423-4e0c-a7b5-9f819e3ec2e1"), ZKPaths.makePath("hola", name));
+        assertEquals(ProtectedUtils.toProtectedZNodePath(path, null), path);
         path = ZKPaths.makePath("hola", name);
-        Assert.assertEquals(ProtectedUtils.normalizePath(path), "/hola/yo");
+        assertEquals(ProtectedUtils.normalizePath(path), "/hola/yo");
     }
 }
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCreateReturningStat.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCreateReturningStat.java
index 10b237f..da60ba6 100755
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCreateReturningStat.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestCreateReturningStat.java
@@ -18,6 +18,11 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.api.BackgroundCallback;
@@ -28,8 +33,8 @@
 import org.apache.curator.test.Timing;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.zookeeper.data.Stat;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicReference;
 
@@ -48,7 +53,7 @@
     {
         Stat queriedStat = client.checkExists().forPath(path);
         
-        Assert.assertEquals(queriedStat, expected);
+        assertEquals(queriedStat, expected);
     }
     
     @Test
@@ -62,22 +67,22 @@
 
             final Stat versionZeroStat = new Stat();
             client.create().orSetData().storingStatIn(versionZeroStat).forPath(path);
-            Assert.assertEquals(0, versionZeroStat.getVersion());
+            assertEquals(0, versionZeroStat.getVersion());
 
             final Stat versionOneStat = new Stat();
             client.create().orSetData().storingStatIn(versionOneStat).forPath(path);
             
-            Assert.assertEquals(versionZeroStat.getAversion(), versionOneStat.getAversion());
-            Assert.assertEquals(versionZeroStat.getCtime(), versionOneStat.getCtime());
-            Assert.assertEquals(versionZeroStat.getCversion(), versionOneStat.getCversion());
-            Assert.assertEquals(versionZeroStat.getCzxid(), versionOneStat.getCzxid());
-            Assert.assertEquals(versionZeroStat.getDataLength(), versionOneStat.getDataLength());
-            Assert.assertEquals(versionZeroStat.getEphemeralOwner(), versionOneStat.getEphemeralOwner());
-            Assert.assertTrue(versionZeroStat.getMtime() <= versionOneStat.getMtime());
-            Assert.assertNotEquals(versionZeroStat.getMzxid(), versionOneStat.getMzxid());
-            Assert.assertEquals(versionZeroStat.getNumChildren(), versionOneStat.getNumChildren());
-            Assert.assertEquals(versionZeroStat.getPzxid(), versionOneStat.getPzxid());
-            Assert.assertEquals(1, versionOneStat.getVersion());
+            assertEquals(versionZeroStat.getAversion(), versionOneStat.getAversion());
+            assertEquals(versionZeroStat.getCtime(), versionOneStat.getCtime());
+            assertEquals(versionZeroStat.getCversion(), versionOneStat.getCversion());
+            assertEquals(versionZeroStat.getCzxid(), versionOneStat.getCzxid());
+            assertEquals(versionZeroStat.getDataLength(), versionOneStat.getDataLength());
+            assertEquals(versionZeroStat.getEphemeralOwner(), versionOneStat.getEphemeralOwner());
+            assertTrue(versionZeroStat.getMtime() <= versionOneStat.getMtime());
+            assertNotEquals(versionZeroStat.getMzxid(), versionOneStat.getMzxid());
+            assertEquals(versionZeroStat.getNumChildren(), versionOneStat.getNumChildren());
+            assertEquals(versionZeroStat.getPzxid(), versionOneStat.getPzxid());
+            assertEquals(1, versionOneStat.getVersion());
         }
     }
     
@@ -212,7 +217,7 @@
             
             if(!timing.awaitLatch(latch))
             {
-                Assert.fail("Timed out awaing latch");
+                fail("Timed out awaing latch");
             }
             
             compare(client, path, statRef.get());
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestEnabledSessionExpiredState.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestEnabledSessionExpiredState.java
index 1656351..92f3748 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestEnabledSessionExpiredState.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestEnabledSessionExpiredState.java
@@ -18,6 +18,9 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Queues;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -30,10 +33,10 @@
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.WatchedEvent;
 import org.apache.zookeeper.Watcher;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
@@ -45,7 +48,7 @@
     private CuratorFramework client;
     private BlockingQueue<ConnectionState> states;
 
-    @BeforeMethod
+    @BeforeEach
     @Override
     public void setup() throws Exception
     {
@@ -71,7 +74,7 @@
         client.getConnectionStateListenable().addListener(listener);
     }
 
-    @AfterMethod
+    @AfterEach
     @Override
     public void teardown() throws Exception
     {
@@ -88,18 +91,18 @@
     @Test
     public void testResetCausesLost() throws Exception
     {
-        Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED);
+        assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED);
         client.checkExists().forPath("/");  // establish initial connection
 
         client.getZookeeperClient().reset();
-        Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
-        Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.RECONNECTED);
+        assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
+        assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.RECONNECTED);
     }
 
     @Test
     public void testInjectedWatchedEvent() throws Exception
     {
-        Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED);
+        assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED);
 
         final CountDownLatch latch = new CountDownLatch(1);
         Watcher watcher = new Watcher()
@@ -118,24 +121,24 @@
         };
         client.checkExists().usingWatcher(watcher).forPath("/");
         server.stop();
-        Assert.assertTrue(timing.forSessionSleep().awaitLatch(latch));
+        assertTrue(timing.forSessionSleep().awaitLatch(latch));
     }
 
     @Test
     public void testKillSession() throws Exception
     {
-        Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED);
+        assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED);
 
         client.getZookeeperClient().getZooKeeper().getTestable().injectSessionExpiration();
 
-        Assert.assertEquals(states.poll(timing.forSessionSleep().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
-        Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.RECONNECTED);
+        assertEquals(states.poll(timing.forSessionSleep().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
+        assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.RECONNECTED);
     }
 
     @Test
     public void testReconnectWithoutExpiration() throws Exception
     {
-        Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED);
+        assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED);
         server.stop();
         try
         {
@@ -144,33 +147,33 @@
         catch ( KeeperException.ConnectionLossException ignore )
         {
         }
-        Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED);
+        assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED);
         server.restart();
         client.checkExists().forPath("/");
-        Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.RECONNECTED);
+        assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.RECONNECTED);
     }
 
     @Test
     public void testSessionExpirationFromTimeout() throws Exception
     {
-        Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED);
+        assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED);
         server.stop();
-        Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED);
-        Assert.assertEquals(states.poll(timing.forSessionSleep().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
+        assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED);
+        assertEquals(states.poll(timing.forSessionSleep().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
     }
 
     @Test
     public void testSessionExpirationFromTimeoutWithRestart() throws Exception
     {
-        Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED);
+        assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED);
         server.stop();
         timing.forSessionSleep().sleep();
-        Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED);
-        Assert.assertEquals(states.poll(timing.forSessionSleep().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
+        assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED);
+        assertEquals(states.poll(timing.forSessionSleep().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
         server.restart();
         client.checkExists().forPath("/");
-        Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.RECONNECTED);
+        assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.RECONNECTED);
 
-        Assert.assertNull(states.poll(timing.multiple(.5).milliseconds(), TimeUnit.MILLISECONDS));  // there should be no other events
+        assertNull(states.poll(timing.multiple(.5).milliseconds(), TimeUnit.MILLISECONDS));  // there should be no other events
     }
 }
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestEnsureContainers.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestEnsureContainers.java
index a4397ab..3943efa 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestEnsureContainers.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestEnsureContainers.java
@@ -18,14 +18,16 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.EnsureContainers;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.utils.CloseableUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
 
 public class TestEnsureContainers extends BaseClassForTests
 {
@@ -40,7 +42,7 @@
             EnsureContainers ensureContainers = new EnsureContainers(client, "/one/two/three");
             ensureContainers.ensure();
 
-            Assert.assertNotNull(client.checkExists().forPath("/one/two/three"));
+            assertNotNull(client.checkExists().forPath("/one/two/three"));
         }
         finally
         {
@@ -59,11 +61,11 @@
             EnsureContainers ensureContainers = new EnsureContainers(client, "/one/two/three");
             ensureContainers.ensure();
 
-            Assert.assertNotNull(client.checkExists().forPath("/one/two/three"));
+            assertNotNull(client.checkExists().forPath("/one/two/three"));
 
             client.delete().forPath("/one/two/three");
             ensureContainers.ensure();
-            Assert.assertNull(client.checkExists().forPath("/one/two/three"));
+            assertNull(client.checkExists().forPath("/one/two/three"));
         }
         finally
         {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestExistsBuilder.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestExistsBuilder.java
index 8557e64..54704ab 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestExistsBuilder.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestExistsBuilder.java
@@ -18,6 +18,10 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.apache.zookeeper.ZooDefs.Ids.ANYONE_ID_UNSAFE;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.api.ACLProvider;
@@ -28,17 +32,13 @@
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.zookeeper.ZooDefs;
 import org.apache.zookeeper.data.ACL;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
 
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
-import static org.apache.zookeeper.ZooDefs.Ids.ANYONE_ID_UNSAFE;
-import static org.testng.Assert.assertNull;
-
 public class TestExistsBuilder extends BaseClassForTests {
 
     /**
@@ -57,9 +57,9 @@
             List<ACL> acl = Collections.singletonList(new ACL(ZooDefs.Perms.CREATE | ZooDefs.Perms.READ, ANYONE_ID_UNSAFE));
             assertNull(client.checkExists().creatingParentsIfNeeded().withACL(acl).forPath(path));
             List<ACL> actual_bar = client.getACL().forPath("/bar");
-            Assert.assertEquals(actual_bar, acl);
+            assertEquals(actual_bar, acl);
             List<ACL> actual_bar_foo = client.getACL().forPath("/bar/foo");
-            Assert.assertEquals(actual_bar_foo, acl);
+            assertEquals(actual_bar_foo, acl);
         }
         finally
         {
@@ -86,11 +86,11 @@
                 }
             };
             client.checkExists().creatingParentsIfNeeded().withACL(acl).inBackground(callback).forPath(path);
-            Assert.assertTrue(latch.await(2000, TimeUnit.MILLISECONDS), "Callback not invoked");
+            assertTrue(latch.await(2000, TimeUnit.MILLISECONDS), "Callback not invoked");
             List<ACL> actual_bar = client.getACL().forPath("/bar");
-            Assert.assertEquals(actual_bar, acl);
+            assertEquals(actual_bar, acl);
             List<ACL> actual_bar_foo = client.getACL().forPath("/bar/foo");
-            Assert.assertEquals(actual_bar_foo, acl);
+            assertEquals(actual_bar_foo, acl);
         }
         finally
         {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFailedDeleteManager.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFailedDeleteManager.java
index 50692d2..4ce804a 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFailedDeleteManager.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFailedDeleteManager.java
@@ -18,6 +18,12 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.api.BackgroundCallback;
@@ -31,8 +37,7 @@
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.KeeperException.NoNodeException;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
 
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Semaphore;
@@ -71,26 +76,26 @@
             client.getConnectionStateListenable().addListener(listener);
             server.stop();
 
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
+            assertTrue(timing.acquireSemaphore(semaphore));
             try
             {
                 client.delete().guaranteed().forPath("/test-me");
-                Assert.fail();
+                fail();
             }
             catch ( KeeperException.ConnectionLossException | KeeperException.SessionExpiredException e )
             {
                 // expected
             }
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
+            assertTrue(timing.acquireSemaphore(semaphore));
 
             timing.sleepABit();
 
             server.restart();
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
 
             timing.sleepABit();
 
-            Assert.assertNull(client.checkExists().forPath("/test-me"));
+            assertNull(client.checkExists().forPath("/test-me"));
         }
         finally
         {
@@ -134,26 +139,26 @@
             client.getConnectionStateListenable().addListener(listener);
             server.stop();
 
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
+            assertTrue(timing.acquireSemaphore(semaphore));
             try
             {
                 client.delete().guaranteed().forPath("/test-me");
-                Assert.fail();
+                fail();
             }
             catch ( KeeperException.ConnectionLossException | KeeperException.SessionExpiredException e )
             {
                 // expected
             }
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
+            assertTrue(timing.acquireSemaphore(semaphore));
 
             timing.sleepABit();
 
             server.restart();
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
 
             timing.sleepABit();
 
-            Assert.assertNull(client.checkExists().forPath("/test-me"));
+            assertNull(client.checkExists().forPath("/test-me"));
         }
         finally
         {
@@ -197,26 +202,26 @@
             namespaceClient.getConnectionStateListenable().addListener(listener);
             server.stop();
 
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
+            assertTrue(timing.acquireSemaphore(semaphore));
             try
             {
                 namespaceClient.delete().guaranteed().forPath("/test-me");
-                Assert.fail();
+                fail();
             }
             catch ( KeeperException.ConnectionLossException | KeeperException.SessionExpiredException e )
             {
                 // expected
             }
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
+            assertTrue(timing.acquireSemaphore(semaphore));
 
             timing.sleepABit();
 
             server.restart();
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
 
             timing.sleepABit();
 
-            Assert.assertNull(namespaceClient.checkExists().forPath("/test-me"));
+            assertNull(namespaceClient.checkExists().forPath("/test-me"));
         }
         finally
         {
@@ -237,13 +242,13 @@
         try
         {
             client.create().creatingParentsIfNeeded().forPath(PATH);
-            Assert.assertNotNull(client.checkExists().forPath(PATH));
+            assertNotNull(client.checkExists().forPath(PATH));
 
             server.stop(); // cause the next delete to fail
             try
             {
                 client.delete().forPath(PATH);
-                Assert.fail();
+                fail();
             }
             catch ( KeeperException.ConnectionLossException | KeeperException.SessionExpiredException e )
             {
@@ -251,13 +256,13 @@
             }
             
             server.restart();
-            Assert.assertNotNull(client.checkExists().forPath(PATH));
+            assertNotNull(client.checkExists().forPath(PATH));
 
             server.stop(); // cause the next delete to fail
             try
             {
                 client.delete().guaranteed().forPath(PATH);
-                Assert.fail();
+                fail();
             }
             catch ( KeeperException.ConnectionLossException | KeeperException.SessionExpiredException e )
             {
@@ -274,7 +279,7 @@
                     timing.sleepABit();
                 }
             }
-            Assert.assertNull(client.checkExists().forPath(PATH));
+            assertNull(client.checkExists().forPath(PATH));
         }
         finally
         {
@@ -303,12 +308,12 @@
         try
         {
             client.delete().guaranteed().forPath("/nonexistent");
-            Assert.fail();
+            fail();
         }
         catch(NoNodeException e)
         {
             //Exception is expected, the delete should not be retried
-            Assert.assertFalse(pathAdded.get());
+            assertFalse(pathAdded.get());
         }
         finally
         {
@@ -354,7 +359,7 @@
             backgroundLatch.await();
             
             //Exception is expected, the delete should not be retried
-            Assert.assertFalse(pathAdded.get());
+            assertFalse(pathAdded.get());
         }
         finally
         {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFramework.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFramework.java
index db4a9a5..a1aea52 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFramework.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFramework.java
@@ -18,6 +18,13 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import com.google.common.collect.Lists;
 import org.apache.curator.framework.AuthInfo;
 import org.apache.curator.framework.CuratorFramework;
@@ -45,10 +52,11 @@
 import org.apache.zookeeper.ZooKeeper;
 import org.apache.zookeeper.data.ACL;
 import org.apache.zookeeper.data.Stat;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
@@ -59,10 +67,10 @@
 import java.util.concurrent.TimeUnit;
 
 @SuppressWarnings("deprecation")
-@Test(groups = CuratorTestBase.zk35TestCompatibilityGroup)
+@Tag(CuratorTestBase.zk35TestCompatibilityGroup)
 public class TestFramework extends BaseClassForTests
 {
-    @BeforeMethod(alwaysRun = true)
+    @BeforeEach
     @Override
     public void setup() throws Exception
     {
@@ -70,7 +78,7 @@
         super.setup();
     }
 
-    @AfterMethod(alwaysRun = true)
+    @AfterEach
     @Override
     public void teardown() throws Exception
     {
@@ -115,10 +123,10 @@
         }
 
         Integer polledValue = timeoutQueue.poll(new Timing().milliseconds(), TimeUnit.MILLISECONDS);
-        Assert.assertNotNull(polledValue);
-        Assert.assertEquals(10064, polledValue.intValue());
+        assertNotNull(polledValue);
+        assertEquals(10064, polledValue.intValue());
     }
-    
+
     @Test
     public void testSessionLossWithLongTimeout() throws Exception
     {
@@ -152,15 +160,15 @@
             
             client.start();
             
-            Assert.assertTrue(timing.awaitLatch(connectedLatch));
+            assertTrue(timing.awaitLatch(connectedLatch));
             
             server.stop();
 
             timing.sleepABit();
-            Assert.assertTrue(timing.awaitLatch(lostLatch));
+            assertTrue(timing.awaitLatch(lostLatch));
             
             server.restart();
-            Assert.assertTrue(timing.awaitLatch(restartedLatch));
+            assertTrue(timing.awaitLatch(restartedLatch));
         }
     }
 
@@ -183,10 +191,10 @@
             client.getConnectionStateListenable().addListener(listener);
 
             client.start();
-            Assert.assertEquals(queue.poll(timing.multiple(4).seconds(), TimeUnit.SECONDS), ConnectionState.CONNECTED);
+            assertEquals(queue.poll(timing.multiple(4).seconds(), TimeUnit.SECONDS), ConnectionState.CONNECTED);
             server.stop();
-            Assert.assertEquals(queue.poll(timing.multiple(4).seconds(), TimeUnit.SECONDS), ConnectionState.SUSPENDED);
-            Assert.assertEquals(queue.poll(timing.multiple(4).seconds(), TimeUnit.SECONDS), ConnectionState.LOST);
+            assertEquals(queue.poll(timing.multiple(4).seconds(), TimeUnit.SECONDS), ConnectionState.SUSPENDED);
+            assertEquals(queue.poll(timing.multiple(4).seconds(), TimeUnit.SECONDS), ConnectionState.LOST);
         }
         finally
         {
@@ -203,16 +211,16 @@
             client.start();
 
             String name = client.create().forPath("/hey", "there".getBytes());
-            Assert.assertEquals(name, "/hey");
+            assertEquals(name, "/hey");
             name = client.create().orSetData().forPath("/hey", "other".getBytes());
-            Assert.assertEquals(name, "/hey");
-            Assert.assertEquals(client.getData().forPath("/hey"), "other".getBytes());
+            assertEquals(name, "/hey");
+            assertArrayEquals(client.getData().forPath("/hey"), "other".getBytes());
 
             name = client.create().orSetData().creatingParentsIfNeeded().forPath("/a/b/c", "there".getBytes());
-            Assert.assertEquals(name, "/a/b/c");
+            assertEquals(name, "/a/b/c");
             name = client.create().orSetData().creatingParentsIfNeeded().forPath("/a/b/c", "what".getBytes());
-            Assert.assertEquals(name, "/a/b/c");
-            Assert.assertEquals(client.getData().forPath("/a/b/c"), "what".getBytes());
+            assertEquals(name, "/a/b/c");
+            assertArrayEquals(client.getData().forPath("/a/b/c"), "what".getBytes());
 
             final BlockingQueue<CuratorEvent> queue = new LinkedBlockingQueue<>();
             BackgroundCallback backgroundCallback = new BackgroundCallback()
@@ -226,15 +234,15 @@
             client.create().orSetData().inBackground(backgroundCallback).forPath("/a/b/c", "another".getBytes());
 
             CuratorEvent event = queue.poll(new Timing().milliseconds(), TimeUnit.MILLISECONDS);
-            Assert.assertNotNull(event);
-            Assert.assertEquals(event.getResultCode(), KeeperException.Code.OK.intValue());
-            Assert.assertEquals(event.getType(), CuratorEventType.CREATE);
-            Assert.assertEquals(event.getPath(), "/a/b/c");
-            Assert.assertEquals(event.getName(), "/a/b/c");
+            assertNotNull(event);
+            assertEquals(event.getResultCode(), KeeperException.Code.OK.intValue());
+            assertEquals(event.getType(), CuratorEventType.CREATE);
+            assertEquals(event.getPath(), "/a/b/c");
+            assertEquals(event.getName(), "/a/b/c");
 
             // callback should only be called once
             CuratorEvent unexpectedEvent = queue.poll(new Timing().milliseconds(), TimeUnit.MILLISECONDS);
-            Assert.assertNull(unexpectedEvent);
+            assertNull(unexpectedEvent);
         }
         finally
         {
@@ -264,8 +272,8 @@
             client.delete().quietly().inBackground(backgroundCallback).forPath("/foo/bar/hey");
 
             Integer code = rc.poll(new Timing().milliseconds(), TimeUnit.MILLISECONDS);
-            Assert.assertNotNull(code);
-            Assert.assertEquals(code.intValue(), KeeperException.Code.OK.intValue());
+            assertNotNull(code);
+            assertEquals(code.intValue(), KeeperException.Code.OK.intValue());
         }
         finally
         {
@@ -302,7 +310,7 @@
             client.create().forPath("/base/child");
 
             String path = new Timing2().takeFromQueue(queue);
-            Assert.assertEquals(path, "/base");
+            assertEquals(path, "/base");
         }
         finally
         {
@@ -336,7 +344,7 @@
             client.checkExists().inBackground().forPath("/base");
 
             String path = queue.poll(10, TimeUnit.SECONDS);
-            Assert.assertEquals(path, "/base");
+            assertEquals(path, "/base");
 
             client.getCuratorListenable().removeListener(listener);
 
@@ -350,7 +358,7 @@
             };
             client.getChildren().inBackground(callback).forPath("/base");
             path = queue.poll(10, TimeUnit.SECONDS);
-            Assert.assertEquals(path, "/base");
+            assertEquals(path, "/base");
         }
         finally
         {
@@ -388,7 +396,7 @@
             }
             catch ( KeeperException.NoAuthException e )
             {
-                Assert.fail("Auth failed");
+                fail("Auth failed");
             }
             client.close();
 
@@ -402,7 +410,7 @@
             try
             {
                 client.setData().forPath("/test", "test".getBytes());
-                Assert.fail("Should have failed with auth exception");
+                fail("Should have failed with auth exception");
             }
             catch ( KeeperException.NoAuthException e )
             {
@@ -421,12 +429,12 @@
         CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder()
             .connectString(server.getConnectString())
             .retryPolicy(new RetryOneTime(1));
-        Assert.assertNull(builder.getAuthScheme());
-        Assert.assertNull(builder.getAuthValue());
+        assertNull(builder.getAuthScheme());
+        assertNull(builder.getAuthValue());
 
         builder = builder.authorization("digest", "me1:pass1".getBytes());
-        Assert.assertEquals(builder.getAuthScheme(), "digest");
-        Assert.assertEquals(builder.getAuthValue(), "me1:pass1".getBytes());
+        assertEquals(builder.getAuthScheme(), "digest");
+        assertArrayEquals(builder.getAuthValue(), "me1:pass1".getBytes());
     }
 
     @Test
@@ -464,7 +472,7 @@
             }
             catch ( KeeperException.NoAuthException e )
             {
-                Assert.fail("Auth failed");
+                fail("Auth failed");
             }
             client.close();
 
@@ -481,7 +489,7 @@
             }
             catch ( KeeperException.NoAuthException e )
             {
-                Assert.fail("Auth failed");
+                fail("Auth failed");
             }
             client.close();
 
@@ -495,7 +503,7 @@
             try
             {
                 client.setData().forPath("/test", "test".getBytes());
-                Assert.fail("Should have failed with auth exception");
+                fail("Should have failed with auth exception");
             }
             catch ( KeeperException.NoAuthException e )
             {
@@ -542,11 +550,11 @@
             client.create().withACL(aclList).forPath("/test", "test".getBytes());
 
             server.stop();
-            Assert.assertTrue(timing.awaitLatch(lostLatch));
+            assertTrue(timing.awaitLatch(lostLatch));
             try
             {
                 client.checkExists().forPath("/");
-                Assert.fail("Connection should be down");
+                fail("Connection should be down");
             }
             catch ( KeeperException.ConnectionLossException e )
             {
@@ -560,7 +568,7 @@
             }
             catch ( KeeperException.NoAuthException e )
             {
-                Assert.fail("Auth failed");
+                fail("Auth failed");
             }
         }
         finally
@@ -579,11 +587,11 @@
         {
             client.create().creatingParentsIfNeeded().forPath("/one/two/three", "foo".getBytes());
             byte[] data = client.getData().forPath("/one/two/three");
-            Assert.assertEquals(data, "foo".getBytes());
+            assertArrayEquals(data, "foo".getBytes());
 
             client.create().creatingParentsIfNeeded().forPath("/one/two/another", "bar".getBytes());
             data = client.getData().forPath("/one/two/another");
-            Assert.assertEquals(data, "bar".getBytes());
+            assertArrayEquals(data, "bar".getBytes());
         }
         finally
         {
@@ -609,14 +617,14 @@
             client.start();
             client.create().creatingParentContainersIfNeeded().forPath("/one/two/three", "foo".getBytes());
             byte[] data = client.getData().forPath("/one/two/three");
-            Assert.assertEquals(data, "foo".getBytes());
+            assertArrayEquals(data, "foo".getBytes());
 
             client.delete().forPath("/one/two/three");
             new Timing().sleepABit();
 
-            Assert.assertNotNull(client.checkExists().forPath("/one/two"));
+            assertNotNull(client.checkExists().forPath("/one/two"));
             new Timing().sleepABit();
-            Assert.assertNotNull(client.checkExists().forPath("/one"));
+            assertNotNull(client.checkExists().forPath("/one"));
         }
         finally
         {
@@ -639,14 +647,14 @@
             client.start();
             client.create().creatingParentContainersIfNeeded().forPath("/one/two/three", "foo".getBytes());
             byte[] data = client.getData().forPath("/one/two/three");
-            Assert.assertEquals(data, "foo".getBytes());
+            assertArrayEquals(data, "foo".getBytes());
 
             client.delete().forPath("/one/two/three");
             new Timing().sleepABit();
 
-            Assert.assertNull(client.checkExists().forPath("/one/two"));
+            assertNull(client.checkExists().forPath("/one/two"));
             new Timing().sleepABit();
-            Assert.assertNull(client.checkExists().forPath("/one"));
+            assertNull(client.checkExists().forPath("/one"));
         }
         finally
         {
@@ -672,17 +680,17 @@
         {
             client.start();
 
-            Assert.assertNull(client.checkExists().forPath("/one/two"));
+            assertNull(client.checkExists().forPath("/one/two"));
             client.create().creatingParentContainersIfNeeded().forPath("/one/two/three");
-            Assert.assertNotNull(client.checkExists().forPath("/one/two"));
+            assertNotNull(client.checkExists().forPath("/one/two"));
 
             client.delete().deletingChildrenIfNeeded().forPath("/one");
-            Assert.assertNull(client.checkExists().forPath("/one"));
+            assertNull(client.checkExists().forPath("/one"));
 
-            Assert.assertNull(client.checkExists().forPath("/one/two"));
+            assertNull(client.checkExists().forPath("/one/two"));
             client.checkExists().creatingParentContainersIfNeeded().forPath("/one/two/three");
-            Assert.assertNotNull(client.checkExists().forPath("/one/two"));
-            Assert.assertNull(client.checkExists().forPath("/one/two/three"));
+            assertNotNull(client.checkExists().forPath("/one/two"));
+            assertNull(client.checkExists().forPath("/one/two/three"));
         }
         finally
         {
@@ -698,11 +706,11 @@
         {
             client.start();
 
-            Assert.assertNull(client.checkExists().forPath("/one/two"));
+            assertNull(client.checkExists().forPath("/one/two"));
             client.checkExists().creatingParentContainersIfNeeded().forPath("/one/two/three");
-            Assert.assertNotNull(client.checkExists().forPath("/one/two"));
-            Assert.assertNull(client.checkExists().forPath("/one/two/three"));
-            Assert.assertNull(client.checkExists().creatingParentContainersIfNeeded().forPath("/one/two/three"));
+            assertNotNull(client.checkExists().forPath("/one/two"));
+            assertNull(client.checkExists().forPath("/one/two/three"));
+            assertNull(client.checkExists().creatingParentContainersIfNeeded().forPath("/one/two/three"));
         }
         finally
         {
@@ -718,7 +726,7 @@
         {
             client.start();
 
-            Assert.assertNull(client.checkExists().forPath("/one/two"));
+            assertNull(client.checkExists().forPath("/one/two"));
 
             final CountDownLatch latch = new CountDownLatch(1);
             BackgroundCallback callback = new BackgroundCallback()
@@ -730,10 +738,10 @@
                 }
             };
             client.checkExists().creatingParentContainersIfNeeded().inBackground(callback).forPath("/one/two/three");
-            Assert.assertTrue(new Timing().awaitLatch(latch));
-            Assert.assertNotNull(client.checkExists().forPath("/one/two"));
-            Assert.assertNull(client.checkExists().forPath("/one/two/three"));
-            Assert.assertNull(client.checkExists().creatingParentContainersIfNeeded().forPath("/one/two/three"));
+            assertTrue(new Timing().awaitLatch(latch));
+            assertNotNull(client.checkExists().forPath("/one/two"));
+            assertNull(client.checkExists().forPath("/one/two/three"));
+            assertNull(client.checkExists().creatingParentContainersIfNeeded().forPath("/one/two/three"));
         }
         finally
         {
@@ -753,18 +761,18 @@
         {
             EnsurePath ensurePath = new EnsurePath("/pity/the/fool");
             ensurePath.ensure(client.getZookeeperClient());
-            Assert.assertNull(client.getZookeeperClient().getZooKeeper().exists("/jz/pity/the/fool", false));
+            assertNull(client.getZookeeperClient().getZooKeeper().exists("/jz/pity/the/fool", false));
 
             ensurePath = client.newNamespaceAwareEnsurePath("/pity/the/fool");
             ensurePath.ensure(client.getZookeeperClient());
-            Assert.assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/jz/pity/the/fool", false));
+            assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/jz/pity/the/fool", false));
         }
         finally
         {
             CloseableUtils.closeQuietly(client);
         }
     }
-    
+
     @Test
     public void testCreateContainersWithNamespace() throws Exception
     {
@@ -776,16 +784,16 @@
             client.start();
             String path = "/path1/path2";
             client.createContainers(path);
-            Assert.assertNotNull(client.checkExists().forPath(path));
-            Assert.assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/" + namespace + path, false));
+            assertNotNull(client.checkExists().forPath(path));
+            assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/" + namespace + path, false));
         }
         finally
         {
             CloseableUtils.closeQuietly(client);
         }
     }
-    
-    
+
+
     @Test
     public void testCreateContainersUsingNamespace() throws Exception
     {
@@ -798,8 +806,8 @@
             CuratorFramework nsClient = client.usingNamespace(namespace);
             String path = "/path1/path2";
             nsClient.createContainers(path);
-            Assert.assertNotNull(nsClient.checkExists().forPath(path));
-            Assert.assertNotNull(nsClient.getZookeeperClient().getZooKeeper().exists("/" + namespace + path, false));
+            assertNotNull(nsClient.checkExists().forPath(path));
+            assertNotNull(nsClient.getZookeeperClient().getZooKeeper().exists("/" + namespace + path, false));
         }
         finally
         {
@@ -818,20 +826,20 @@
         try
         {
             String actualPath = client.create().forPath("/test");
-            Assert.assertEquals(actualPath, "/test");
-            Assert.assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/" + namespace + "/test", false));
-            Assert.assertNull(client.getZookeeperClient().getZooKeeper().exists("/test", false));
+            assertEquals(actualPath, "/test");
+            assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/" + namespace + "/test", false));
+            assertNull(client.getZookeeperClient().getZooKeeper().exists("/test", false));
 
             actualPath = client.usingNamespace(null).create().forPath("/non");
-            Assert.assertEquals(actualPath, "/non");
-            Assert.assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/non", false));
+            assertEquals(actualPath, "/non");
+            assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/non", false));
 
             client.create().forPath("/test/child", "hey".getBytes());
             byte[] bytes = client.getData().forPath("/test/child");
-            Assert.assertEquals(bytes, "hey".getBytes());
+            assertArrayEquals(bytes, "hey".getBytes());
 
             bytes = client.usingNamespace(null).getData().forPath("/" + namespace + "/test/child");
-            Assert.assertEquals(bytes, "hey".getBytes());
+            assertArrayEquals(bytes, "hey".getBytes());
         }
         finally
         {
@@ -862,7 +870,7 @@
                 }
             };
             client.create().inBackground(callback).forPath("/head");
-            Assert.assertTrue(latch.await(10, TimeUnit.SECONDS));
+            assertTrue(latch.await(10, TimeUnit.SECONDS));
         }
         finally
         {
@@ -886,7 +894,7 @@
                         {
                             if ( event.getType() == CuratorEventType.SYNC )
                             {
-                                Assert.assertEquals(event.getPath(), "/head");
+                                assertEquals(event.getPath(), "/head");
                                 ((CountDownLatch)event.getContext()).countDown();
                             }
                         }
@@ -894,11 +902,11 @@
                 );
 
             client.create().forPath("/head");
-            Assert.assertNotNull(client.checkExists().forPath("/head"));
+            assertNotNull(client.checkExists().forPath("/head"));
 
             CountDownLatch latch = new CountDownLatch(1);
             client.sync("/head", latch);
-            Assert.assertTrue(latch.await(10, TimeUnit.SECONDS));
+            assertTrue(latch.await(10, TimeUnit.SECONDS));
         }
         finally
         {
@@ -914,7 +922,7 @@
         try
         {
             client.create().forPath("/head");
-            Assert.assertNotNull(client.checkExists().forPath("/head"));
+            assertNotNull(client.checkExists().forPath("/head"));
 
             final CountDownLatch latch = new CountDownLatch(1);
             BackgroundCallback callback = new BackgroundCallback()
@@ -929,7 +937,7 @@
                 }
             };
             client.sync().inBackground(callback).forPath("/head");
-            Assert.assertTrue(latch.await(10, TimeUnit.SECONDS));
+            assertTrue(latch.await(10, TimeUnit.SECONDS));
         }
         finally
         {
@@ -953,7 +961,7 @@
                         {
                             if ( event.getType() == CuratorEventType.DELETE )
                             {
-                                Assert.assertEquals(event.getPath(), "/head");
+                                assertEquals(event.getPath(), "/head");
                                 ((CountDownLatch)event.getContext()).countDown();
                             }
                         }
@@ -961,12 +969,12 @@
                 );
 
             client.create().forPath("/head");
-            Assert.assertNotNull(client.checkExists().forPath("/head"));
+            assertNotNull(client.checkExists().forPath("/head"));
 
             CountDownLatch latch = new CountDownLatch(1);
             client.delete().inBackground(latch).forPath("/head");
-            Assert.assertTrue(latch.await(10, TimeUnit.SECONDS));
-            Assert.assertNull(client.checkExists().forPath("/head"));
+            assertTrue(latch.await(10, TimeUnit.SECONDS));
+            assertNull(client.checkExists().forPath("/head"));
         }
         finally
         {
@@ -990,7 +998,7 @@
                         {
                             if ( event.getType() == CuratorEventType.DELETE )
                             {
-                                Assert.assertEquals(event.getPath(), "/one/two");
+                                assertEquals(event.getPath(), "/one/two");
                                 ((CountDownLatch)event.getContext()).countDown();
                             }
                         }
@@ -998,12 +1006,12 @@
                 );
 
             client.create().creatingParentsIfNeeded().forPath("/one/two/three/four");
-            Assert.assertNotNull(client.checkExists().forPath("/one/two/three/four"));
+            assertNotNull(client.checkExists().forPath("/one/two/three/four"));
 
             CountDownLatch latch = new CountDownLatch(1);
             client.delete().deletingChildrenIfNeeded().inBackground(latch).forPath("/one/two");
-            Assert.assertTrue(latch.await(10, TimeUnit.SECONDS));
-            Assert.assertNull(client.checkExists().forPath("/one/two"));
+            assertTrue(latch.await(10, TimeUnit.SECONDS));
+            assertNull(client.checkExists().forPath("/one/two"));
         }
         finally
         {
@@ -1019,9 +1027,9 @@
         try
         {
             client.create().forPath("/head");
-            Assert.assertNotNull(client.checkExists().forPath("/head"));
+            assertNotNull(client.checkExists().forPath("/head"));
             client.delete().forPath("/head");
-            Assert.assertNull(client.checkExists().forPath("/head"));
+            assertNull(client.checkExists().forPath("/head"));
         }
         finally
         {
@@ -1039,9 +1047,9 @@
         {
             client.create().creatingParentsIfNeeded().forPath("/one/two/three/four/five/six", "foo".getBytes());
             client.delete().deletingChildrenIfNeeded().forPath("/one/two/three/four/five");
-            Assert.assertNull(client.checkExists().forPath("/one/two/three/four/five"));
+            assertNull(client.checkExists().forPath("/one/two/three/four/five"));
             client.delete().deletingChildrenIfNeeded().forPath("/one/two");
-            Assert.assertNull(client.checkExists().forPath("/one/two"));
+            assertNull(client.checkExists().forPath("/one/two"));
         }
         finally
         {
@@ -1059,9 +1067,9 @@
         {
             client.create().creatingParentsIfNeeded().forPath("/one/two/three/four/five/six", "foo".getBytes());
             client.delete().guaranteed().deletingChildrenIfNeeded().forPath("/one/two/three/four/five");
-            Assert.assertNull(client.checkExists().forPath("/one/two/three/four/five"));
+            assertNull(client.checkExists().forPath("/one/two/three/four/five"));
             client.delete().guaranteed().deletingChildrenIfNeeded().forPath("/one/two");
-            Assert.assertNull(client.checkExists().forPath("/one/two"));
+            assertNull(client.checkExists().forPath("/one/two"));
         }
         finally
         {
@@ -1084,7 +1092,7 @@
             }
 
             List<String> children = client.getChildren().forPath("/head");
-            Assert.assertEquals(children.size(), 10);
+            assertEquals(children.size(), 10);
         }
         finally
         {
@@ -1112,15 +1120,15 @@
                         {
                             if ( event.getType() == CuratorEventType.GET_DATA )
                             {
-                                Assert.assertEquals(event.getPath(), "/test");
-                                Assert.assertEquals(event.getData(), data1);
+                                assertEquals(event.getPath(), "/test");
+                                assertArrayEquals(event.getData(), data1);
                                 ((CountDownLatch)event.getContext()).countDown();
                             }
                             else if ( event.getType() == CuratorEventType.WATCHED )
                             {
                                 if ( event.getWatchedEvent().getType() == Watcher.Event.EventType.NodeDataChanged )
                                 {
-                                    Assert.assertEquals(event.getPath(), "/test");
+                                    assertEquals(event.getPath(), "/test");
                                     watchedLatch.countDown();
                                 }
                             }
@@ -1132,12 +1140,12 @@
 
             CountDownLatch backgroundLatch = new CountDownLatch(1);
             client.getData().watched().inBackground(backgroundLatch).forPath("/test");
-            Assert.assertTrue(backgroundLatch.await(10, TimeUnit.SECONDS));
+            assertTrue(backgroundLatch.await(10, TimeUnit.SECONDS));
 
             client.setData().forPath("/test", data2);
-            Assert.assertTrue(watchedLatch.await(10, TimeUnit.SECONDS));
+            assertTrue(watchedLatch.await(10, TimeUnit.SECONDS));
             byte[] checkData = client.getData().forPath("/test");
-            Assert.assertEquals(checkData, data2);
+            assertArrayEquals(checkData, data2);
         }
         finally
         {
@@ -1161,7 +1169,7 @@
                         {
                             if ( event.getType() == CuratorEventType.CREATE )
                             {
-                                Assert.assertEquals(event.getPath(), "/test");
+                                assertEquals(event.getPath(), "/test");
                                 ((CountDownLatch)event.getContext()).countDown();
                             }
                         }
@@ -1170,7 +1178,7 @@
 
             CountDownLatch latch = new CountDownLatch(1);
             client.create().inBackground(latch).forPath("/test", new byte[]{1, 2, 3});
-            Assert.assertTrue(latch.await(10, TimeUnit.SECONDS));
+            assertTrue(latch.await(10, TimeUnit.SECONDS));
         }
         finally
         {
@@ -1193,7 +1201,7 @@
             client.start();
 
             byte[] readBytes = client.getData().forPath("/test");
-            Assert.assertEquals(writtenBytes, readBytes);
+            assertArrayEquals(writtenBytes, readBytes);
 
             client.create().withMode(CreateMode.EPHEMERAL).forPath("/ghost", writtenBytes);
 
@@ -1202,29 +1210,29 @@
             client.start();
 
             readBytes = client.getData().forPath("/test");
-            Assert.assertEquals(writtenBytes, readBytes);
+            assertArrayEquals(writtenBytes, readBytes);
             Stat stat = client.checkExists().forPath("/ghost");
-            Assert.assertNull(stat);
+            assertNull(stat);
 
             String realPath = client.create().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/pseq", writtenBytes);
-            Assert.assertNotSame(realPath, "/pseq");
+            assertNotSame(realPath, "/pseq");
 
             client.close();
             client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1));
             client.start();
 
             readBytes = client.getData().forPath(realPath);
-            Assert.assertEquals(writtenBytes, readBytes);
+            assertArrayEquals(writtenBytes, readBytes);
 
             realPath = client.create().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath("/eseq", writtenBytes);
-            Assert.assertNotSame(realPath, "/eseq");
+            assertNotSame(realPath, "/eseq");
 
             client.close();
             client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1));
             client.start();
 
             stat = client.checkExists().forPath(realPath);
-            Assert.assertNull(stat);
+            assertNull(stat);
         }
         finally
         {
@@ -1240,7 +1248,7 @@
         try
         {
             String path = client.create().withMode(CreateMode.PERSISTENT).forPath("/test", new byte[]{1, 2, 3});
-            Assert.assertEquals(path, "/test");
+            assertEquals(path, "/test");
         }
         finally
         {
@@ -1258,7 +1266,7 @@
             client.create().forPath("/test");
             //This should create a node in the form of "/test/00000001"
             String path = client.create().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/test/");
-            Assert.assertTrue(path.startsWith("/test/"));
+            assertTrue(path.startsWith("/test/"));
         }
         finally
         {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
index c62a299..bbf052e 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
@@ -19,6 +19,9 @@
 
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Queues;
 import org.apache.curator.framework.CuratorFramework;
@@ -36,11 +39,9 @@
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.zookeeper.KeeperException.Code;
 import org.apache.zookeeper.data.ACL;
+import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.BlockingQueue;
@@ -112,7 +113,7 @@
                 }
             };
             client.create().inBackground().withUnhandledErrorListener(listener).forPath("/foo");
-            Assert.assertTrue(new Timing().awaitLatch(errorLatch));
+            assertTrue(new Timing().awaitLatch(errorLatch));
         }
         finally
         {
@@ -157,10 +158,10 @@
 
             server.restart();
 
-            Assert.assertTrue(timing.awaitLatch(connectedLatch));
-            Assert.assertFalse(firstListenerAction.get());
+            assertTrue(timing.awaitLatch(connectedLatch));
+            assertFalse(firstListenerAction.get());
             ConnectionState firstconnectionState = firstListenerState.get();
-            Assert.assertEquals(firstconnectionState, ConnectionState.CONNECTED, "First listener state MUST BE CONNECTED but is " + firstconnectionState);
+            assertEquals(firstconnectionState, ConnectionState.CONNECTED, "First listener state MUST BE CONNECTED but is " + firstconnectionState);
         }
         finally
         {
@@ -206,7 +207,7 @@
 
             for ( long elapsed : times.subList(1, times.size()) )   // first one isn't a retry
             {
-                Assert.assertTrue(elapsed >= SLEEP, elapsed + ": " + times);
+                assertTrue(elapsed >= SLEEP, elapsed + ": " + times);
             }
         }
         finally
@@ -234,11 +235,11 @@
                 }
             };
             client.create().inBackground(callback).forPath("/one");
-            Assert.assertEquals(paths.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), "/one");
+            assertEquals(paths.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), "/one");
             client.create().inBackground(callback).forPath("/one/two");
-            Assert.assertEquals(paths.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), "/one/two");
+            assertEquals(paths.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), "/one/two");
             client.create().inBackground(callback).forPath("/one/two/three");
-            Assert.assertEquals(paths.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), "/one/two/three");
+            assertEquals(paths.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), "/one/two/three");
         }
         finally
         {
@@ -276,7 +277,7 @@
             // Attempt to retrieve children list
             client.getChildren().inBackground(curatorCallback).forPath("/");
             // Check if the callback has been called with a correct return code
-            Assert.assertTrue(timing.awaitLatch(latch), "Callback has not been called by curator !");
+            assertTrue(timing.awaitLatch(latch), "Callback has not been called by curator !");
         }
         finally
         {
@@ -345,7 +346,7 @@
             timing.sleepABit();
 
             // should not generate an exception
-            Assert.assertFalse(hadIllegalStateException.get());
+            assertFalse(hadIllegalStateException.get());
         }
         finally
         {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkEdges.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkEdges.java
index 3e7754a..1fda248 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkEdges.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestFrameworkEdges.java
@@ -19,6 +19,12 @@
 
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import com.google.common.collect.Queues;
 import org.apache.curator.RetryPolicy;
 import org.apache.curator.RetrySleeper;
@@ -47,11 +53,12 @@
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.Watcher;
 import org.apache.zookeeper.data.Stat;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
 import java.util.Collections;
 import java.util.List;
 import java.util.Random;
@@ -65,19 +72,20 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
-@Test(groups = CuratorTestBase.zk35TestCompatibilityGroup)
+@Tag(CuratorTestBase.zk35TestCompatibilityGroup)
 public class TestFrameworkEdges extends BaseClassForTests
 {
     private final Logger log = LoggerFactory.getLogger(getClass());
     private final Timing2 timing = new Timing2();
 
-    @BeforeClass
+    @BeforeAll
     public static void setUpClass()
     {
         System.setProperty("zookeeper.extendedTypesEnabled", "true");
     }
 
-    @Test(description = "test case for CURATOR-525")
+    @Test
+    @DisplayName("test case for CURATOR-525")
     public void testValidateConnectionEventRaces() throws Exception
     {
         // test for CURATOR-525 - there is a race whereby Curator can go to LOST
@@ -95,8 +103,8 @@
             client.getConnectionStateListenable().addListener((__, newState) -> stateQueue.add(newState));
 
             server.stop();
-            Assert.assertEquals(timing.takeFromQueue(stateQueue), ConnectionState.SUSPENDED);
-            Assert.assertEquals(timing.takeFromQueue(stateQueue), ConnectionState.LOST);
+            assertEquals(timing.takeFromQueue(stateQueue), ConnectionState.SUSPENDED);
+            assertEquals(timing.takeFromQueue(stateQueue), ConnectionState.LOST);
 
             clientImpl.debugCheckBackgroundRetryReadyLatch = new CountDownLatch(1);
             clientImpl.debugCheckBackgroundRetryLatch = new CountDownLatch(1);
@@ -104,12 +112,12 @@
             client.delete().guaranteed().inBackground().forPath("/foo");
             timing.awaitLatch(clientImpl.debugCheckBackgroundRetryReadyLatch);
             server.restart();
-            Assert.assertEquals(timing.takeFromQueue(stateQueue), ConnectionState.RECONNECTED);
+            assertEquals(timing.takeFromQueue(stateQueue), ConnectionState.RECONNECTED);
             clientImpl.injectedCode = KeeperException.Code.SESSIONEXPIRED;  // simulate an expiration being handled after the connection is repaired
             clientImpl.debugCheckBackgroundRetryLatch.countDown();
-            Assert.assertEquals(timing.takeFromQueue(stateQueue), ConnectionState.LOST);
+            assertEquals(timing.takeFromQueue(stateQueue), ConnectionState.LOST);
 
-            Assert.assertEquals(timing.takeFromQueue(stateQueue), ConnectionState.RECONNECTED);
+            assertEquals(timing.takeFromQueue(stateQueue), ConnectionState.RECONNECTED);
         }
     }
 
@@ -129,7 +137,7 @@
             };
             client.checkExists().usingWatcher(watcher).forPath("/foobar");
             client.getZookeeperClient().getZooKeeper().getTestable().injectSessionExpiration();
-            Assert.assertTrue(timing.awaitLatch(expiredLatch));
+            assertTrue(timing.awaitLatch(expiredLatch));
         }
     }
 
@@ -192,13 +200,13 @@
 
                 builder.forPath("/test/hey");
 
-                Assert.assertTrue(timing.awaitLatch(serverStoppedLatch));
+                assertTrue(timing.awaitLatch(serverStoppedLatch));
                 timing.forSessionSleep().sleep();   // wait for session to expire
                 cluster.restartServer(instanceSpec0);
 
                 String path = timing.takeFromQueue(createdNode);
                 List<String> children = client.getChildren().forPath("/test");
-                Assert.assertEquals(Collections.singletonList(ZKPaths.getNodeFromPath(path)), children);
+                assertEquals(Collections.singletonList(ZKPaths.getNodeFromPath(path)), children);
             }
         }
     }
@@ -232,7 +240,7 @@
             client.create().inBackground(callback).forPath("/test/two");
             server.restart();
 
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
         }
         finally
         {
@@ -268,7 +276,7 @@
 
             client.start();
             client.createContainers("/this/does/not/exist");
-            Assert.assertNotNull(client.checkExists().forPath("/this/does/not/exist"));
+            assertNotNull(client.checkExists().forPath("/this/does/not/exist"));
         }
         finally
         {
@@ -303,7 +311,7 @@
             {
                 CuratorFramework localClient = (i == 0) ? client : client.usingNamespace("nm");
                 localClient.create().forPath("/parent");
-                Assert.assertEquals(localClient.getChildren().forPath("/parent").size(), 0);
+                assertEquals(localClient.getChildren().forPath("/parent").size(), 0);
 
                 CreateBuilderImpl createBuilder = (CreateBuilderImpl)localClient.create();
                 createBuilder.failNextCreateForTesting = true;
@@ -311,7 +319,7 @@
                 try
                 {
                     createBuilder.withProtection().forPath("/parent/test");
-                    Assert.fail("failNextCreateForTesting should have caused a ConnectionLossException");
+                    fail("failNextCreateForTesting should have caused a ConnectionLossException");
                 }
                 catch ( KeeperException.ConnectionLossException e )
                 {
@@ -320,7 +328,7 @@
 
                 timing.sleepABit();
                 List<String> children = localClient.getChildren().forPath("/parent");
-                Assert.assertEquals(children.size(), 0, children.toString()); // protected mode should have deleted the node
+                assertEquals(children.size(), 0, children.toString()); // protected mode should have deleted the node
 
                 localClient.delete().forPath("/parent");
             }
@@ -391,10 +399,10 @@
             String name2 = timing.takeFromQueue(paths);
             String path2 = timing.takeFromQueue(paths);
 
-            Assert.assertEquals(ZKPaths.getPathAndNode(name1).getPath(), ZKPaths.getPathAndNode(TEST_PATH).getPath());
-            Assert.assertEquals(ZKPaths.getPathAndNode(name2).getPath(), ZKPaths.getPathAndNode(TEST_PATH).getPath());
-            Assert.assertEquals(ZKPaths.getPathAndNode(path1).getPath(), ZKPaths.getPathAndNode(TEST_PATH).getPath());
-            Assert.assertEquals(ZKPaths.getPathAndNode(path2).getPath(), ZKPaths.getPathAndNode(TEST_PATH).getPath());
+            assertEquals(ZKPaths.getPathAndNode(name1).getPath(), ZKPaths.getPathAndNode(TEST_PATH).getPath());
+            assertEquals(ZKPaths.getPathAndNode(name2).getPath(), ZKPaths.getPathAndNode(TEST_PATH).getPath());
+            assertEquals(ZKPaths.getPathAndNode(path1).getPath(), ZKPaths.getPathAndNode(TEST_PATH).getPath());
+            assertEquals(ZKPaths.getPathAndNode(path2).getPath(), ZKPaths.getPathAndNode(TEST_PATH).getPath());
 
             client.delete().deletingChildrenIfNeeded().forPath("/a/b/c");
             client.delete().forPath("/a/b");
@@ -423,7 +431,7 @@
                     latch.countDown();
                 }
             }).forPath("/");
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
         }
         finally
         {
@@ -457,12 +465,12 @@
 
             server.stop();
 
-            Assert.assertTrue(timing.awaitLatch(lostLatch));
+            assertTrue(timing.awaitLatch(lostLatch));
 
             try
             {
                 client.checkExists().forPath("/");
-                Assert.fail();
+                fail();
             }
             catch ( KeeperException.ConnectionLossException e )
             {
@@ -491,7 +499,7 @@
             }
             catch ( NullPointerException e )
             {
-                Assert.fail();
+                fail();
             }
         }
         finally
@@ -521,8 +529,8 @@
             };
             createBuilder.withProtection().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).inBackground(callback).forPath("/");
             String ourPath = queue.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS);
-            Assert.assertTrue(ourPath.startsWith(ZKPaths.makePath("/", ProtectedUtils.PROTECTED_PREFIX)));
-            Assert.assertFalse(createBuilder.failNextCreateForTesting);
+            assertTrue(ourPath.startsWith(ZKPaths.makePath("/", ProtectedUtils.PROTECTED_PREFIX)));
+            assertFalse(createBuilder.failNextCreateForTesting);
         }
         finally
         {
@@ -540,8 +548,8 @@
             CreateBuilderImpl createBuilder = (CreateBuilderImpl)client.create();
             createBuilder.failNextCreateForTesting = true;
             String ourPath = createBuilder.withProtection().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath("/");
-            Assert.assertTrue(ourPath.startsWith(ZKPaths.makePath("/", ProtectedUtils.PROTECTED_PREFIX)));
-            Assert.assertFalse(createBuilder.failNextCreateForTesting);
+            assertTrue(ourPath.startsWith(ZKPaths.makePath("/", ProtectedUtils.PROTECTED_PREFIX)));
+            assertFalse(createBuilder.failNextCreateForTesting);
         }
         finally
         {
@@ -568,8 +576,8 @@
 
             client.checkExists().usingWatcher(watcher).forPath("/sessionTest");
             client.getZookeeperClient().getZooKeeper().getTestable().injectSessionExpiration();
-            Assert.assertTrue(timing.awaitLatch(sessionDiedLatch));
-            Assert.assertNotNull(client.checkExists().forPath("/sessionTest"));
+            assertTrue(timing.awaitLatch(sessionDiedLatch));
+            assertNotNull(client.checkExists().forPath("/sessionTest"));
         }
         finally
         {
@@ -592,7 +600,7 @@
                     if ( event.getType() == CuratorEventType.EXISTS )
                     {
                         Stat stat = client.checkExists().forPath("/yo/yo/yo");
-                        Assert.assertNull(stat);
+                        assertNull(stat);
 
                         client.create().inBackground(event.getContext()).forPath("/what");
                     }
@@ -605,7 +613,7 @@
 
             CountDownLatch latch = new CountDownLatch(1);
             client.checkExists().inBackground(latch).forPath("/hey");
-            Assert.assertTrue(latch.await(10, TimeUnit.SECONDS));
+            assertTrue(latch.await(10, TimeUnit.SECONDS));
         }
         finally
         {
@@ -639,7 +647,7 @@
             server.stop();
 
             client.checkExists().inBackground().forPath("/hey");
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
         }
         finally
         {
@@ -660,7 +668,7 @@
             server.stop();
 
             client.checkExists().forPath("/hey");
-            Assert.fail();
+            fail();
         }
         catch ( KeeperException.ConnectionLossException e )
         {
@@ -717,7 +725,7 @@
 
             // test foreground retry
             client.checkExists().forPath("/hey");
-            Assert.assertTrue(semaphore.tryAcquire(MAX_RETRIES, timing.forWaiting().seconds(), TimeUnit.SECONDS), "Remaining leases: " + semaphore.availablePermits());
+            assertTrue(semaphore.tryAcquire(MAX_RETRIES, timing.forWaiting().seconds(), TimeUnit.SECONDS), "Remaining leases: " + semaphore.availablePermits());
 
             // make sure we're reconnected
             client.getZookeeperClient().setRetryPolicy(new RetryOneTime(100));
@@ -731,7 +739,7 @@
 
             // test background retry
             client.checkExists().inBackground().forPath("/hey");
-            Assert.assertTrue(semaphore.tryAcquire(MAX_RETRIES, timing.forWaiting().seconds(), TimeUnit.SECONDS), "Remaining leases: " + semaphore.availablePermits());
+            assertTrue(semaphore.tryAcquire(MAX_RETRIES, timing.forWaiting().seconds(), TimeUnit.SECONDS), "Remaining leases: " + semaphore.availablePermits());
         }
         finally
         {
@@ -746,7 +754,7 @@
         try
         {
             client.getData();
-            Assert.fail();
+            fail();
         }
         catch ( Exception e )
         {
@@ -754,7 +762,7 @@
         }
         catch ( Throwable e )
         {
-            Assert.fail("", e);
+            fail("", e);
         }
     }
 
@@ -775,7 +783,7 @@
         try
         {
             client.getData();
-            Assert.fail();
+            fail();
         }
         catch ( Exception e )
         {
@@ -814,11 +822,11 @@
                 {
                     if ( e instanceof KeeperException.NoNodeException )
                     {
-                        Assert.fail("client delete failed, shouldn't throw NoNodeException", e);
+                        fail("client delete failed, shouldn't throw NoNodeException", e);
                     }
                     else
                     {
-                        Assert.fail("unexpected exception", e);
+                        fail("unexpected exception", e);
                     }
                 }
                 finally
@@ -858,18 +866,18 @@
                         }
                         catch ( Exception e )
                         {
-                            Assert.fail("unexpected exception", e);
+                            fail("unexpected exception", e);
                         }
                     }
                 }
                 catch ( Exception e )
                 {
-                    Assert.fail("unexpected exception", e);
+                    fail("unexpected exception", e);
                 }
             }
 
-            Assert.assertTrue(timing.awaitLatch(latch));
-            Assert.assertNull(client2.checkExists().forPath("/parent"));
+            assertTrue(timing.awaitLatch(latch));
+            assertNull(client2.checkExists().forPath("/parent"));
         }
         finally
         {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestGzipCompressionProvider.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestGzipCompressionProvider.java
index 2856b4d..78c0bb2 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestGzipCompressionProvider.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestGzipCompressionProvider.java
@@ -18,9 +18,10 @@
  */
 package org.apache.curator.framework.imps;
 
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+import org.junit.jupiter.api.Test;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.util.Arrays;
@@ -36,9 +37,9 @@
         byte[] data = "Hello, world!".getBytes();
         byte[] compressedData = provider.compress(null, data);
         byte[] jdkCompressedData = jdkCompress(data);
-        Assert.assertTrue(Arrays.equals(compressedData, jdkCompressedData));
+        assertTrue(Arrays.equals(compressedData, jdkCompressedData));
         byte[] decompressedData = provider.decompress(null, compressedData);
-        Assert.assertTrue(Arrays.equals(decompressedData, data));
+        assertTrue(Arrays.equals(decompressedData, data));
     }
 
     @Test
@@ -49,10 +50,10 @@
         byte[] compressedData2 = GzipCompressionProvider.doCompress(new byte[0]);
         byte[] jdkCompress = jdkCompress(new byte[0]);
         // Ensures GzipCompressionProvider.COMPRESSED_EMPTY_BYTES value is valid
-        Assert.assertTrue(Arrays.equals(compressedData, compressedData2));
-        Assert.assertTrue(Arrays.equals(compressedData, jdkCompress));
+        assertTrue(Arrays.equals(compressedData, compressedData2));
+        assertTrue(Arrays.equals(compressedData, jdkCompress));
         byte[] decompressedData = provider.decompress(null, compressedData);
-        Assert.assertEquals(0, decompressedData.length);
+        assertEquals(0, decompressedData.length);
     }
 
     /**
@@ -65,7 +66,7 @@
         GzipCompressionProvider provider = new GzipCompressionProvider();
         try {
             provider.decompress(null, new byte[100]);
-            Assert.fail("Expected IOException");
+            fail("Expected IOException");
         } catch (IOException ignore) {
             // expected
         }
@@ -104,9 +105,9 @@
             for (int i = 0; i < 100; i++) {
                 byte[] compressedData = provider.compress(null, data);
                 byte[] jdkCompressedData = jdkCompress(data);
-                Assert.assertTrue(Arrays.equals(compressedData, jdkCompressedData));
+                assertTrue(Arrays.equals(compressedData, jdkCompressedData));
                 byte[] decompressedData = provider.decompress(null, compressedData);
-                Assert.assertTrue(Arrays.equals(decompressedData, data));
+                assertTrue(Arrays.equals(decompressedData, data));
                 // in the end of the iteration to test empty array first
                 random.nextBytes(data);
             }
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestMultiClient.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestMultiClient.java
index de210ab..f4e0fdf 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestMultiClient.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestMultiClient.java
@@ -18,6 +18,8 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.curator.framework.CuratorFramework;
@@ -27,8 +29,8 @@
 import org.apache.curator.framework.api.CuratorListener;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.zookeeper.Watcher;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -89,7 +91,7 @@
 
             client2.sync().forPath("/test");
 
-            Assert.assertTrue(latch.await(10, TimeUnit.SECONDS));
+            assertTrue(latch.await(10, TimeUnit.SECONDS));
         }
         finally
         {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestNamespaceFacade.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestNamespaceFacade.java
index 9c1c99b..cd33cb6 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestNamespaceFacade.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestNamespaceFacade.java
@@ -18,6 +18,11 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.fail;
 import java.util.Collections;
 import java.util.List;
 
@@ -25,13 +30,11 @@
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
-import org.apache.curator.retry.ExponentialBackoffRetry;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.zookeeper.ZooDefs;
 import org.apache.zookeeper.KeeperException.NoAuthException;
 import org.apache.zookeeper.data.ACL;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
 
 public class TestNamespaceFacade extends BaseClassForTests
 {
@@ -41,7 +44,7 @@
         try
         {
             CuratorFrameworkFactory.builder().namespace("/snafu").retryPolicy(new RetryOneTime(1)).connectString("foo").build();
-            Assert.fail();
+            fail();
         }
         catch ( IllegalArgumentException e )
         {
@@ -61,10 +64,10 @@
             CuratorFramework fooClient = client.usingNamespace("foo");
             CuratorFramework barClient = client.usingNamespace("bar");
 
-            Assert.assertEquals(client.getNamespace(), "");
-            Assert.assertEquals(client2.getNamespace(), "snafu");
-            Assert.assertEquals(fooClient.getNamespace(), "foo");
-            Assert.assertEquals(barClient.getNamespace(), "bar");
+            assertEquals(client.getNamespace(), "");
+            assertEquals(client2.getNamespace(), "snafu");
+            assertEquals(fooClient.getNamespace(), "foo");
+            assertEquals(barClient.getNamespace(), "bar");
         }
         finally
         {
@@ -87,8 +90,8 @@
             fooClient.create().forPath("/one");
             barClient.create().forPath("/one");
 
-            Assert.assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/foo/one", false));
-            Assert.assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/bar/one", false));
+            assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/foo/one", false));
+            assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/bar/one", false));
         }
         finally
         {
@@ -104,8 +107,8 @@
         {
             client.start();
 
-            Assert.assertSame(client.usingNamespace("foo"), client.usingNamespace("foo"));
-            Assert.assertNotSame(client.usingNamespace("foo"), client.usingNamespace("bar"));
+            assertSame(client.usingNamespace("foo"), client.usingNamespace("foo"));
+            assertNotSame(client.usingNamespace("foo"), client.usingNamespace("bar"));
         }
         finally
         {
@@ -122,14 +125,14 @@
             client.start();
 
             client.create().forPath("/one");
-            Assert.assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/one", false));
+            assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/one", false));
 
             client.usingNamespace("space").create().forPath("/one");
-            Assert.assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/space", false));
+            assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/space", false));
 
             client.usingNamespace("name").create().forPath("/one");
-            Assert.assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/name", false));
-            Assert.assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/name/one", false));
+            assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/name", false));
+            assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/name/one", false));
         }
         finally
         {
@@ -149,23 +152,23 @@
             client.start();
 
             client.create().forPath("/one");
-            Assert.assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/one", false));
+            assertNotNull(client.getZookeeperClient().getZooKeeper().exists("/one", false));
 
-            Assert.assertNotNull(client.checkExists().forPath("/"));
+            assertNotNull(client.checkExists().forPath("/"));
             try
             {
                 client.checkExists().forPath("");
-                Assert.fail("IllegalArgumentException expected");
+                fail("IllegalArgumentException expected");
             }
             catch ( IllegalArgumentException expected )
             {
             }
 
-            Assert.assertNotNull(client.usingNamespace("one").checkExists().forPath("/"));
+            assertNotNull(client.usingNamespace("one").checkExists().forPath("/"));
             try
             {
                 client.usingNamespace("one").checkExists().forPath("");
-                Assert.fail("IllegalArgumentException expected");
+                fail("IllegalArgumentException expected");
             }
             catch ( IllegalArgumentException expected )
             {
@@ -185,10 +188,10 @@
         client.start();
         CuratorFramework    namespaced = client.usingNamespace(null);
 
-        Assert.assertEquals(client.getState(), namespaced.getState(), "Namespaced state did not match true state after call to start.");
+        assertEquals(client.getState(), namespaced.getState(), "Namespaced state did not match true state after call to start.");
 
         client.close();
-        Assert.assertEquals(client.getState(), namespaced.getState(), "Namespaced state did not match true state after call to close.");
+        assertEquals(client.getState(), namespaced.getState(), "Namespaced state did not match true state after call to close.");
     }
     
     /**
@@ -205,7 +208,7 @@
         client.create().creatingParentsIfNeeded().forPath("/parent/child", "A string".getBytes());
         CuratorFramework client2 = client.usingNamespace("parent");
 
-        Assert.assertNotNull(client2.getData().forPath("/child"));  
+        assertNotNull(client2.getData().forPath("/child"));  
         client.setACL().withACL(Collections.singletonList(
             new ACL(ZooDefs.Perms.WRITE, ZooDefs.Ids.ANYONE_ID_UNSAFE))).
                 forPath("/parent/child");
@@ -215,14 +218,14 @@
         try
         {
             List<ACL> acls = client2.getACL().forPath("/child");
-            Assert.assertNotNull(acls);
-            Assert.assertEquals(acls.size(), 1);
-            Assert.assertEquals(acls.get(0).getId(), ZooDefs.Ids.ANYONE_ID_UNSAFE);
-            Assert.assertEquals(acls.get(0).getPerms(), ZooDefs.Perms.WRITE);
+            assertNotNull(acls);
+            assertEquals(acls.size(), 1);
+            assertEquals(acls.get(0).getId(), ZooDefs.Ids.ANYONE_ID_UNSAFE);
+            assertEquals(acls.get(0).getPerms(), ZooDefs.Perms.WRITE);
             client2.setACL().withACL(Collections.singletonList(
                 new ACL(ZooDefs.Perms.DELETE, ZooDefs.Ids.ANYONE_ID_UNSAFE))).
                     forPath("/child");
-            Assert.fail("Expected auth exception was not thrown");
+            fail("Expected auth exception was not thrown");
         }
         catch(NoAuthException e)
         {
@@ -235,7 +238,7 @@
         CuratorFramework client = CuratorFrameworkFactory.builder().namespace("").retryPolicy(new RetryOneTime(1)).connectString("foo").build();
         CuratorFrameworkImpl clientImpl = (CuratorFrameworkImpl) client;
 
-        Assert.assertEquals(clientImpl.unfixForNamespace("/foo/bar"), "/foo/bar");
+        assertEquals(clientImpl.unfixForNamespace("/foo/bar"), "/foo/bar");
 
         CloseableUtils.closeQuietly(client);
     }
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestNeverConnected.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestNeverConnected.java
index ecfd8b4..64ba576 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestNeverConnected.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestNeverConnected.java
@@ -19,6 +19,7 @@
 
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import com.google.common.collect.Queues;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.curator.framework.CuratorFramework;
@@ -27,8 +28,7 @@
 import org.apache.curator.framework.state.ConnectionStateListener;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.Timing;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.TimeUnit;
 
@@ -58,9 +58,9 @@
             client.create().inBackground().forPath("/");
 
             ConnectionState polled = queue.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS);
-            Assert.assertEquals(polled, ConnectionState.SUSPENDED);
+            assertEquals(polled, ConnectionState.SUSPENDED);
             polled = queue.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS);
-            Assert.assertEquals(polled, ConnectionState.LOST);
+            assertEquals(polled, ConnectionState.LOST);
         }
         finally
         {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReadOnly.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReadOnly.java
index b5f90ae..2af98b2 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReadOnly.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReadOnly.java
@@ -19,6 +19,8 @@
 
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Queues;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -32,10 +34,10 @@
 import org.apache.curator.test.TestingCluster;
 import org.apache.curator.test.Timing;
 import org.apache.curator.utils.CloseableUtils;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
 import java.util.Iterator;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.CountDownLatch;
@@ -43,13 +45,13 @@
 
 public class TestReadOnly extends BaseClassForTests
 {
-    @BeforeMethod
+    @BeforeEach
     public void setup()
     {
         System.setProperty("readonlymode.enabled", "true");
     }
 
-    @AfterMethod
+    @AfterEach
     public void tearDown()
     {
         System.setProperty("readonlymode.enabled", "false");
@@ -100,7 +102,7 @@
             client.checkExists().forPath("/");
 
             ConnectionState state = states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS);
-            Assert.assertEquals(state, ConnectionState.READ_ONLY);
+            assertEquals(state, ConnectionState.READ_ONLY);
         }
         finally
         {
@@ -151,12 +153,12 @@
             }
             cluster.killServer(killInstance);
 
-            Assert.assertEquals(reconnectedLatch.getCount(), 1);
-            Assert.assertTrue(timing.awaitLatch(readOnlyLatch));
+            assertEquals(reconnectedLatch.getCount(), 1);
+            assertTrue(timing.awaitLatch(readOnlyLatch));
 
-            Assert.assertEquals(reconnectedLatch.getCount(), 1);
+            assertEquals(reconnectedLatch.getCount(), 1);
             cluster.restartServer(killInstance);
-            Assert.assertTrue(timing.awaitLatch(reconnectedLatch));
+            assertTrue(timing.awaitLatch(reconnectedLatch));
         }
         finally
         {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReconfiguration.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReconfiguration.java
index 96fa384..435d17a 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReconfiguration.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReconfiguration.java
@@ -41,10 +41,11 @@
 import org.apache.zookeeper.server.quorum.QuorumPeerConfig;
 import org.apache.zookeeper.server.quorum.flexible.QuorumMaj;
 import org.apache.zookeeper.server.quorum.flexible.QuorumVerifier;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.net.InetAddress;
@@ -59,6 +60,11 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 public class TestReconfiguration extends CuratorTestBase
 {
     private final Timing2 timing = new Timing2();
@@ -68,7 +74,7 @@
     private static final String superUserPasswordDigest = "curator-test:zghsj3JfJqK7DbWf0RQ1BgbJH9w=";  // ran from DigestAuthenticationProvider.generateDigest(superUserPassword);
     private static final String superUserPassword = "curator-test";
 
-    @BeforeMethod
+    @BeforeEach
     @Override
     public void setup() throws Exception
     {
@@ -81,7 +87,7 @@
         cluster = createAndStartCluster(3);
     }
 
-    @AfterMethod
+    @AfterEach
     @Override
     public void teardown() throws Exception
     {
@@ -93,7 +99,8 @@
     }
 
     @SuppressWarnings("ConstantConditions")
-    @Test(enabled = false)
+    @Test
+    @Disabled
     public void testApiPermutations() throws Exception
     {
         // not an actual test. Specifies all possible API possibilities
@@ -172,7 +179,7 @@
             QuorumVerifier quorumVerifier = toQuorumVerifier(configData);
             System.out.println(quorumVerifier);
             assertConfig(quorumVerifier, cluster.getInstances());
-            Assert.assertEquals(EnsembleTracker.configToConnectionString(quorumVerifier), ensembleProvider.getConnectionString());
+            assertEquals(EnsembleTracker.configToConnectionString(quorumVerifier), ensembleProvider.getConnectionString());
         }
     }
 
@@ -182,7 +189,7 @@
         final String initialClusterCS = cluster.getConnectString();
         try ( CuratorFramework client = newClient(cluster.getConnectString(), false))
         {
-            Assert.assertEquals(((CuratorFrameworkImpl) client).getEnsembleTracker(), null);
+            assertEquals(((CuratorFrameworkImpl) client).getEnsembleTracker(), null);
             client.start();
 
             QuorumVerifier oldConfig = toQuorumVerifier(client.getConfig().forEnsemble());
@@ -195,16 +202,16 @@
 
                 client.reconfig().joining(toReconfigSpec(newCluster.getInstances())).fromConfig(oldConfig.getVersion()).forEnsemble();
 
-                Assert.assertTrue(timing.awaitLatch(latch));
+                assertTrue(timing.awaitLatch(latch));
 
                 byte[] newConfigData = client.getConfig().forEnsemble();
                 QuorumVerifier newConfig = toQuorumVerifier(newConfigData);
                 List<InstanceSpec> newInstances = Lists.newArrayList(cluster.getInstances());
                 newInstances.addAll(newCluster.getInstances());
                 assertConfig(newConfig, newInstances);
-                Assert.assertEquals(ensembleProvider.getConnectionString(), initialClusterCS);
-                Assert.assertNotEquals(EnsembleTracker.configToConnectionString(newConfig), ensembleProvider.getConnectionString());
-                Assert.assertEquals(client.getZookeeperClient().getCurrentConnectionString(), initialClusterCS);
+                assertEquals(ensembleProvider.getConnectionString(), initialClusterCS);
+                assertNotEquals(EnsembleTracker.configToConnectionString(newConfig), ensembleProvider.getConnectionString());
+                assertEquals(client.getZookeeperClient().getCurrentConnectionString(), initialClusterCS);
                 final CountDownLatch reconnectLatch = new CountDownLatch(1);
                 client.getConnectionStateListenable().addListener(
                     (cfClient, newState) -> {
@@ -212,11 +219,11 @@
                     }
                 );
                 client.getZookeeperClient().getZooKeeper().getTestable().injectSessionExpiration();
-                Assert.assertTrue(reconnectLatch.await(2, TimeUnit.SECONDS));
-                Assert.assertEquals(client.getZookeeperClient().getCurrentConnectionString(), initialClusterCS);
-                Assert.assertEquals(ensembleProvider.getConnectionString(), initialClusterCS);
+                assertTrue(reconnectLatch.await(2, TimeUnit.SECONDS));
+                assertEquals(client.getZookeeperClient().getCurrentConnectionString(), initialClusterCS);
+                assertEquals(ensembleProvider.getConnectionString(), initialClusterCS);
                 newConfigData = client.getConfig().forEnsemble();
-                Assert.assertNotEquals(EnsembleTracker.configToConnectionString(newConfig), ensembleProvider.getConnectionString());
+                assertNotEquals(EnsembleTracker.configToConnectionString(newConfig), ensembleProvider.getConnectionString());
             }
         }
     }
@@ -238,14 +245,14 @@
 
                 client.reconfig().joining(toReconfigSpec(newCluster.getInstances())).fromConfig(oldConfig.getVersion()).forEnsemble();
 
-                Assert.assertTrue(timing.awaitLatch(latch));
+                assertTrue(timing.awaitLatch(latch));
 
                 byte[] newConfigData = client.getConfig().forEnsemble();
                 QuorumVerifier newConfig = toQuorumVerifier(newConfigData);
                 List<InstanceSpec> newInstances = Lists.newArrayList(cluster.getInstances());
                 newInstances.addAll(newCluster.getInstances());
                 assertConfig(newConfig, newInstances);
-                Assert.assertEquals(EnsembleTracker.configToConnectionString(newConfig), ensembleProvider.getConnectionString());
+                assertEquals(EnsembleTracker.configToConnectionString(newConfig), ensembleProvider.getConnectionString());
             }
         }
     }
@@ -279,15 +286,15 @@
                 };
                 client.reconfig().inBackground(callback).joining(toReconfigSpec(newCluster.getInstances())).fromConfig(oldConfig.getVersion()).forEnsemble();
 
-                Assert.assertTrue(timing.awaitLatch(callbackLatch));
-                Assert.assertTrue(timing.awaitLatch(latch));
+                assertTrue(timing.awaitLatch(callbackLatch));
+                assertTrue(timing.awaitLatch(latch));
 
                 byte[] newConfigData = client.getConfig().forEnsemble();
                 QuorumVerifier newConfig = toQuorumVerifier(newConfigData);
                 List<InstanceSpec> newInstances = Lists.newArrayList(cluster.getInstances());
                 newInstances.addAll(newCluster.getInstances());
                 assertConfig(newConfig, newInstances);
-                Assert.assertEquals(EnsembleTracker.configToConnectionString(newConfig), ensembleProvider.getConnectionString());
+                assertEquals(EnsembleTracker.configToConnectionString(newConfig), ensembleProvider.getConnectionString());
             }
         }
     }
@@ -320,7 +327,7 @@
                 Collection<InstanceSpec> instances = newCluster.getInstances();
                 client.reconfig().leaving(Integer.toString(removeSpec.getServerId())).joining(toReconfigSpec(instances)).fromConfig(oldConfig.getVersion()).forEnsemble();
 
-                Assert.assertTrue(timing.awaitLatch(latch));
+                assertTrue(timing.awaitLatch(latch));
 
                 byte[] newConfigData = client.getConfig().forEnsemble();
                 QuorumVerifier newConfig = toQuorumVerifier(newConfigData);
@@ -328,7 +335,7 @@
                 newInstances.addAll(instances);
                 newInstances.remove(removeSpec);
                 assertConfig(newConfig, newInstances);
-                Assert.assertEquals(EnsembleTracker.configToConnectionString(newConfig), ensembleProvider.getConnectionString());
+                assertEquals(EnsembleTracker.configToConnectionString(newConfig), ensembleProvider.getConnectionString());
             }
         }
     }
@@ -348,12 +355,12 @@
             Collection<InstanceSpec> oldInstances = cluster.getInstances();
             client.reconfig().leaving(Collections.emptyList()).joining(Collections.emptyList()).fromConfig(oldConfig.getVersion()).forEnsemble();
 
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
 
             byte[] newConfigData = client.getConfig().forEnsemble();
             QuorumVerifier newConfig = toQuorumVerifier(newConfigData);
             assertConfig(newConfig, oldInstances);
-            Assert.assertEquals(EnsembleTracker.configToConnectionString(newConfig), ensembleProvider.getConnectionString());
+            assertEquals(EnsembleTracker.configToConnectionString(newConfig), ensembleProvider.getConnectionString());
         }
     }
 
@@ -372,16 +379,17 @@
             Collection<InstanceSpec> oldInstances = cluster.getInstances();
             client.reconfig().withNewMembers(Collections.emptyList()).fromConfig(oldConfig.getVersion()).forEnsemble();
 
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
 
             byte[] newConfigData = client.getConfig().forEnsemble();
             QuorumVerifier newConfig = toQuorumVerifier(newConfigData);
             assertConfig(newConfig, oldInstances);
-            Assert.assertEquals(EnsembleTracker.configToConnectionString(newConfig), ensembleProvider.getConnectionString());
+            assertEquals(EnsembleTracker.configToConnectionString(newConfig), ensembleProvider.getConnectionString());
         }
     }
 
-    @Test(enabled = false)  // it's what this test is inteded to do and it keeps failing - disable for now
+    @Test
+    @Disabled // it's what this test is inteded to do and it keeps failing - disable for now
     public void testNewMembers() throws Exception
     {
         cluster.close();
@@ -406,19 +414,19 @@
                 client.start();
 
                 QuorumVerifier oldConfig = toQuorumVerifier(client.getConfig().forEnsemble());
-                Assert.assertEquals(oldConfig.getAllMembers().size(), 5);
+                assertEquals(oldConfig.getAllMembers().size(), 5);
                 assertConfig(oldConfig, localCluster.getInstances());
 
                 CountDownLatch latch = setChangeWaiter(client);
 
                 client.reconfig().withNewMembers(toReconfigSpec(smallClusterInstances)).forEnsemble();
 
-                Assert.assertTrue(timing.awaitLatch(latch));
+                assertTrue(timing.awaitLatch(latch));
                 byte[] newConfigData = client.getConfig().forEnsemble();
                 QuorumVerifier newConfig = toQuorumVerifier(newConfigData);
-                Assert.assertEquals(newConfig.getAllMembers().size(), 3);
+                assertEquals(newConfig.getAllMembers().size(), 3);
                 assertConfig(newConfig, smallClusterInstances);
-                Assert.assertEquals(EnsembleTracker.configToConnectionString(newConfig), ensembleProvider.getConnectionString());
+                assertEquals(EnsembleTracker.configToConnectionString(newConfig), ensembleProvider.getConnectionString());
             }
         }
         finally
@@ -433,7 +441,7 @@
     {
         String config = "server.1=10.1.2.3:2888:3888:participant;10.2.3.4:2181";
         String configString = EnsembleTracker.configToConnectionString(toQuorumVerifier(config.getBytes()));
-        Assert.assertEquals("10.2.3.4:2181", configString);
+        assertEquals("10.2.3.4:2181", configString);
     }
 
     @Test
@@ -441,7 +449,7 @@
     {
         String config = "server.1=[1010:0001:0002:0003:0004:0005:0006:0007]:2888:3888:participant;[2001:db8:85a3:0:0:8a2e:370:7334]:2181";
         String configString = EnsembleTracker.configToConnectionString(toQuorumVerifier(config.getBytes()));
-        Assert.assertEquals("2001:db8:85a3:0:0:8a2e:370:7334:2181", configString);
+        assertEquals("2001:db8:85a3:0:0:8a2e:370:7334:2181", configString);
     }
 
     @Test
@@ -449,7 +457,7 @@
     {
         String config = "server.1=10.1.2.3:2888:3888:participant;2181";
         String configString = EnsembleTracker.configToConnectionString(toQuorumVerifier(config.getBytes()));
-        Assert.assertEquals("10.1.2.3:2181", configString);
+        assertEquals("10.1.2.3:2181", configString);
     }
 
     @Test
@@ -457,7 +465,7 @@
     {
         String config = "server.1=10.1.2.3:2888:3888:participant;0.0.0.0:2181";
         String configString = EnsembleTracker.configToConnectionString(toQuorumVerifier(config.getBytes()));
-        Assert.assertEquals("10.1.2.3:2181", configString);
+        assertEquals("10.1.2.3:2181", configString);
     }
 
     @Test
@@ -465,7 +473,7 @@
     {
         String config = "server.1=10.1.2.3:2888:3888:participant";
         String configString = EnsembleTracker.configToConnectionString(toQuorumVerifier(config.getBytes()));
-        Assert.assertEquals("", configString);
+        assertEquals("", configString);
     }
 
     @Test
@@ -473,7 +481,7 @@
     {
         String config = "server.1=[2001:db8:85a3:0:0:8a2e:370:7334]:2888:3888:participant;[::]:2181";
         String configString = EnsembleTracker.configToConnectionString(toQuorumVerifier(config.getBytes()));
-        Assert.assertEquals("2001:db8:85a3:0:0:8a2e:370:7334:2181", configString);
+        assertEquals("2001:db8:85a3:0:0:8a2e:370:7334:2181", configString);
     }
 
     @Test
@@ -481,7 +489,7 @@
     {
         String config = "server.1=[1010:0001:0002:0003:0004:0005:0006:0007]:2888:3888:participant;[::0]:2181";
         String configString = EnsembleTracker.configToConnectionString(toQuorumVerifier(config.getBytes()));
-        Assert.assertEquals("1010:1:2:3:4:5:6:7:2181", configString);
+        assertEquals("1010:1:2:3:4:5:6:7:2181", configString);
     }
 
     @Test
@@ -489,7 +497,7 @@
     {
         String config = "server.1=10.1.2.3:2888:3888:participant;[::]:2181";
         String configString = EnsembleTracker.configToConnectionString(toQuorumVerifier(config.getBytes()));
-        Assert.assertEquals("10.1.2.3:2181", configString);
+        assertEquals("10.1.2.3:2181", configString);
     }
 
     @Test
@@ -497,7 +505,7 @@
     {
         String config = "server.1=[2001:db8:85a3:0:0:8a2e:370:7334]:2888:3888:participant;127.0.0.1:2181";
         String configString = EnsembleTracker.configToConnectionString(toQuorumVerifier(config.getBytes()));
-        Assert.assertEquals("127.0.0.1:2181", configString);
+        assertEquals("127.0.0.1:2181", configString);
     }
 
     @Override
@@ -581,8 +589,8 @@
         for ( InstanceSpec instance : instances )
         {
             QuorumPeer.QuorumServer quorumServer = config.getAllMembers().get((long)instance.getServerId());
-            Assert.assertNotNull(quorumServer, String.format("Looking for %s - found %s", instance.getServerId(), config.getAllMembers()));
-            Assert.assertEquals(quorumServer.clientAddr.getPort(), instance.getPort());
+            assertNotNull(quorumServer, String.format("Looking for %s - found %s", instance.getServerId(), config.getAllMembers()));
+            assertEquals(quorumServer.clientAddr.getPort(), instance.getPort());
         }
     }
 
@@ -598,7 +606,7 @@
 
     private static QuorumVerifier toQuorumVerifier(byte[] bytes) throws Exception
     {
-        Assert.assertNotNull(bytes);
+        assertNotNull(bytes);
         Properties properties = new Properties();
         properties.load(new ByteArrayInputStream(bytes));
         return new QuorumMaj(properties);
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTempFramework.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTempFramework.java
index d87e138..f17ee7c 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTempFramework.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTempFramework.java
@@ -18,13 +18,16 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.CuratorTempFramework;
 import org.apache.curator.retry.RetryOneTime;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -40,7 +43,7 @@
             client.inTransaction().create().forPath("/foo", "data".getBytes()).and().commit();
 
             byte[] bytes = client.getData().forPath("/foo");
-            Assert.assertEquals(bytes, "data".getBytes());
+            assertArrayEquals(bytes, "data".getBytes());
         }
         finally
         {
@@ -68,8 +71,8 @@
             service.shutdownNow();
             Thread.sleep(2000);
 
-            Assert.assertNull(client.getCleanup());
-            Assert.assertNull(client.getClient());
+            assertNull(client.getCleanup());
+            assertNull(client.getClient());
         }
         finally
         {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTransactionsNew.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTransactionsNew.java
index 4974739..c4144f0 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTransactionsNew.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTransactionsNew.java
@@ -19,6 +19,14 @@
 
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Queues;
 import org.apache.curator.framework.CuratorFramework;
@@ -35,8 +43,8 @@
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.data.Stat;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.Collection;
 import java.util.List;
 import java.util.concurrent.BlockingQueue;
@@ -65,11 +73,11 @@
             };
             client.transaction().inBackground(callback).forOperations(createOp1, createOp2);
             CuratorEvent event = callbackQueue.poll(new Timing().milliseconds(), TimeUnit.MILLISECONDS);
-            Assert.assertNotNull(event);
-            Assert.assertNotNull(event.getOpResults());
-            Assert.assertEquals(event.getOpResults().size(), 2);
-            Assert.assertEquals(event.getOpResults().get(0).getError(), KeeperException.Code.OK.intValue());
-            Assert.assertEquals(event.getOpResults().get(1).getError(), KeeperException.Code.NONODE.intValue());
+            assertNotNull(event);
+            assertNotNull(event.getOpResults());
+            assertEquals(event.getOpResults().size(), 2);
+            assertEquals(event.getOpResults().get(0).getError(), KeeperException.Code.OK.intValue());
+            assertEquals(event.getOpResults().get(1).getError(), KeeperException.Code.NONODE.intValue());
         }
         finally
         {
@@ -92,14 +100,14 @@
             try
             {
                 client.transaction().forOperations(statOp, createOp);
-                Assert.fail();
+                fail();
             }
             catch ( KeeperException.BadVersionException correct )
             {
                 // correct
             }
 
-            Assert.assertNull(client.checkExists().forPath("/bar"));
+            assertNull(client.checkExists().forPath("/bar"));
         }
         finally
         {
@@ -122,15 +130,15 @@
 
             Collection<CuratorTransactionResult> results = client.transaction().forOperations(createOp1, createOp2, setDataOp, createOp3, deleteOp);
 
-            Assert.assertTrue(client.checkExists().forPath("/foo") != null);
-            Assert.assertTrue(client.usingNamespace(null).checkExists().forPath("/galt/foo") != null);
-            Assert.assertEquals(client.getData().forPath("/foo"), "two".getBytes());
-            Assert.assertTrue(client.checkExists().forPath("/foo/bar") == null);
+            assertTrue(client.checkExists().forPath("/foo") != null);
+            assertTrue(client.usingNamespace(null).checkExists().forPath("/galt/foo") != null);
+            assertArrayEquals(client.getData().forPath("/foo"), "two".getBytes());
+            assertTrue(client.checkExists().forPath("/foo/bar") == null);
 
             CuratorTransactionResult ephemeralResult = Iterables.find(results, CuratorTransactionResult.ofTypeAndPath(OperationType.CREATE, "/test-"));
-            Assert.assertNotNull(ephemeralResult);
-            Assert.assertNotEquals(ephemeralResult.getResultPath(), "/test-");
-            Assert.assertTrue(ephemeralResult.getResultPath().startsWith("/test-"));
+            assertNotNull(ephemeralResult);
+            assertNotEquals(ephemeralResult.getResultPath(), "/test-");
+            assertTrue(ephemeralResult.getResultPath().startsWith("/test-"));
         }
         finally
         {
@@ -150,16 +158,16 @@
 
             Collection<CuratorTransactionResult> results = client.transaction().forOperations(createOp1, createOp2);
 
-            Assert.assertTrue(client.checkExists().forPath("/foo/bar") != null);
-            Assert.assertEquals(client.getData().forPath("/foo/bar"), "snafu".getBytes());
+            assertTrue(client.checkExists().forPath("/foo/bar") != null);
+            assertArrayEquals(client.getData().forPath("/foo/bar"), "snafu".getBytes());
 
             CuratorTransactionResult fooResult = Iterables.find(results, CuratorTransactionResult.ofTypeAndPath(OperationType.CREATE, "/foo"));
             CuratorTransactionResult fooBarResult = Iterables.find(results, CuratorTransactionResult.ofTypeAndPath(OperationType.CREATE, "/foo/bar"));
-            Assert.assertNotNull(fooResult);
-            Assert.assertNotNull(fooBarResult);
-            Assert.assertNotSame(fooResult, fooBarResult);
-            Assert.assertEquals(fooResult.getResultPath(), "/foo");
-            Assert.assertEquals(fooBarResult.getResultPath(), "/foo/bar");
+            assertNotNull(fooResult);
+            assertNotNull(fooBarResult);
+            assertNotSame(fooResult, fooBarResult);
+            assertEquals(fooResult.getResultPath(), "/foo");
+            assertEquals(fooBarResult.getResultPath(), "/foo/bar");
         }
         finally
         {
@@ -189,17 +197,17 @@
             client.transaction().inBackground(callback).forOperations(createOp1, createOp2);
             Collection<CuratorTransactionResult> results = queue.poll(5, TimeUnit.SECONDS);
 
-            Assert.assertNotNull(results);
-            Assert.assertTrue(client.checkExists().forPath("/foo/bar") != null);
-            Assert.assertEquals(client.getData().forPath("/foo/bar"), "snafu".getBytes());
+            assertNotNull(results);
+            assertTrue(client.checkExists().forPath("/foo/bar") != null);
+            assertArrayEquals(client.getData().forPath("/foo/bar"), "snafu".getBytes());
 
             CuratorTransactionResult fooResult = Iterables.find(results, CuratorTransactionResult.ofTypeAndPath(OperationType.CREATE, "/foo"));
             CuratorTransactionResult fooBarResult = Iterables.find(results, CuratorTransactionResult.ofTypeAndPath(OperationType.CREATE, "/foo/bar"));
-            Assert.assertNotNull(fooResult);
-            Assert.assertNotNull(fooBarResult);
-            Assert.assertNotSame(fooResult, fooBarResult);
-            Assert.assertEquals(fooResult.getResultPath(), "/foo");
-            Assert.assertEquals(fooBarResult.getResultPath(), "/foo/bar");
+            assertNotNull(fooResult);
+            assertNotNull(fooBarResult);
+            assertNotSame(fooResult, fooBarResult);
+            assertEquals(fooResult.getResultPath(), "/foo");
+            assertEquals(fooBarResult.getResultPath(), "/foo/bar");
         }
         finally
         {
@@ -233,16 +241,16 @@
 
             Collection<CuratorTransactionResult> results = queue.poll(5, TimeUnit.SECONDS);
 
-            Assert.assertNotNull(results);
-            Assert.assertTrue(client.checkExists().forPath("/foo") != null);
-            Assert.assertTrue(client.usingNamespace(null).checkExists().forPath("/galt/foo") != null);
-            Assert.assertEquals(client.getData().forPath("/foo"), "two".getBytes());
-            Assert.assertTrue(client.checkExists().forPath("/foo/bar") == null);
+            assertNotNull(results);
+            assertTrue(client.checkExists().forPath("/foo") != null);
+            assertTrue(client.usingNamespace(null).checkExists().forPath("/galt/foo") != null);
+            assertArrayEquals(client.getData().forPath("/foo"), "two".getBytes());
+            assertTrue(client.checkExists().forPath("/foo/bar") == null);
 
             CuratorTransactionResult ephemeralResult = Iterables.find(results, CuratorTransactionResult.ofTypeAndPath(OperationType.CREATE, "/test-"));
-            Assert.assertNotNull(ephemeralResult);
-            Assert.assertNotEquals(ephemeralResult.getResultPath(), "/test-");
-            Assert.assertTrue(ephemeralResult.getResultPath().startsWith("/test-"));
+            assertNotNull(ephemeralResult);
+            assertNotEquals(ephemeralResult.getResultPath(), "/test-");
+            assertTrue(ephemeralResult.getResultPath().startsWith("/test-"));
         }
         finally
         {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTransactionsOld.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTransactionsOld.java
index 2c42d61..7fd3f53 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTransactionsOld.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTransactionsOld.java
@@ -18,6 +18,14 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import com.google.common.collect.Iterables;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -30,8 +38,8 @@
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.ZooDefs;
 import org.apache.zookeeper.data.Stat;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.Collection;
 
 @SuppressWarnings("deprecation")
@@ -56,14 +64,14 @@
                 .and()
                     .commit();
 
-                Assert.fail();
+                fail();
             }
             catch ( KeeperException.BadVersionException correct )
             {
                 // correct
             }
 
-            Assert.assertNull(client.checkExists().forPath("/bar"));
+            assertNull(client.checkExists().forPath("/bar"));
         }
         finally
         {
@@ -92,15 +100,15 @@
                 .and()
                     .commit();
 
-            Assert.assertTrue(client.checkExists().forPath("/foo") != null);
-            Assert.assertTrue(client.usingNamespace(null).checkExists().forPath("/galt/foo") != null);
-            Assert.assertEquals(client.getData().forPath("/foo"), "two".getBytes());
-            Assert.assertTrue(client.checkExists().forPath("/foo/bar") == null);
+            assertTrue(client.checkExists().forPath("/foo") != null);
+            assertTrue(client.usingNamespace(null).checkExists().forPath("/galt/foo") != null);
+            assertArrayEquals(client.getData().forPath("/foo"), "two".getBytes());
+            assertTrue(client.checkExists().forPath("/foo/bar") == null);
 
             CuratorTransactionResult    ephemeralResult = Iterables.find(results, CuratorTransactionResult.ofTypeAndPath(OperationType.CREATE, "/test-"));
-            Assert.assertNotNull(ephemeralResult);
-            Assert.assertNotEquals(ephemeralResult.getResultPath(), "/test-");
-            Assert.assertTrue(ephemeralResult.getResultPath().startsWith("/test-"));
+            assertNotNull(ephemeralResult);
+            assertNotEquals(ephemeralResult.getResultPath(), "/test-");
+            assertTrue(ephemeralResult.getResultPath().startsWith("/test-"));
         }
         finally
         {
@@ -129,21 +137,21 @@
                     .and()
                         .commit();
 
-            Assert.assertTrue(client.checkExists().forPath("/foo") != null);
-            Assert.assertEquals(client.getData().decompressed().forPath("/foo"), "five".getBytes());
+            assertTrue(client.checkExists().forPath("/foo") != null);
+            assertArrayEquals(client.getData().decompressed().forPath("/foo"), "five".getBytes());
 
-            Assert.assertTrue(client.checkExists().forPath("/bar") != null);
-            Assert.assertEquals(client.getData().decompressed().forPath("/bar"), "two".getBytes());
-            Assert.assertEquals(client.getACL().forPath("/bar"), ZooDefs.Ids.READ_ACL_UNSAFE);
+            assertTrue(client.checkExists().forPath("/bar") != null);
+            assertArrayEquals(client.getData().decompressed().forPath("/bar"), "two".getBytes());
+            assertEquals(client.getACL().forPath("/bar"), ZooDefs.Ids.READ_ACL_UNSAFE);
 
             CuratorTransactionResult    ephemeralResult = Iterables.find(results, CuratorTransactionResult.ofTypeAndPath(OperationType.CREATE, "/test-"));
-            Assert.assertNotNull(ephemeralResult);
-            Assert.assertNotEquals(ephemeralResult.getResultPath(), "/test-");
-            Assert.assertTrue(ephemeralResult.getResultPath().startsWith("/test-"));
+            assertNotNull(ephemeralResult);
+            assertNotEquals(ephemeralResult.getResultPath(), "/test-");
+            assertTrue(ephemeralResult.getResultPath().startsWith("/test-"));
 
-            Assert.assertTrue(client.checkExists().forPath("/baz") != null);
-            Assert.assertEquals(client.getData().decompressed().forPath("/baz"), "four".getBytes());
-            Assert.assertEquals(client.getACL().forPath("/baz"), ZooDefs.Ids.READ_ACL_UNSAFE);
+            assertTrue(client.checkExists().forPath("/baz") != null);
+            assertArrayEquals(client.getData().decompressed().forPath("/baz"), "four".getBytes());
+            assertEquals(client.getACL().forPath("/baz"), ZooDefs.Ids.READ_ACL_UNSAFE);
         }
         finally
         {
@@ -166,16 +174,16 @@
                 .and()
                     .commit();
 
-            Assert.assertTrue(client.checkExists().forPath("/foo/bar") != null);
-            Assert.assertEquals(client.getData().forPath("/foo/bar"), "snafu".getBytes());
+            assertTrue(client.checkExists().forPath("/foo/bar") != null);
+            assertArrayEquals(client.getData().forPath("/foo/bar"), "snafu".getBytes());
 
             CuratorTransactionResult    fooResult = Iterables.find(results, CuratorTransactionResult.ofTypeAndPath(OperationType.CREATE, "/foo"));
             CuratorTransactionResult    fooBarResult = Iterables.find(results, CuratorTransactionResult.ofTypeAndPath(OperationType.CREATE, "/foo/bar"));
-            Assert.assertNotNull(fooResult);
-            Assert.assertNotNull(fooBarResult);
-            Assert.assertNotSame(fooResult, fooBarResult);
-            Assert.assertEquals(fooResult.getResultPath(), "/foo");
-            Assert.assertEquals(fooBarResult.getResultPath(), "/foo/bar");
+            assertNotNull(fooResult);
+            assertNotNull(fooBarResult);
+            assertNotSame(fooResult, fooBarResult);
+            assertEquals(fooResult.getResultPath(), "/foo");
+            assertEquals(fooBarResult.getResultPath(), "/foo/bar");
         }
         finally
         {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTtlNodes.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTtlNodes.java
index fc37e41..c00ab0e 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTtlNodes.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestTtlNodes.java
@@ -18,6 +18,9 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.api.BackgroundCallback;
@@ -26,21 +29,21 @@
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.test.Timing;
 import org.apache.zookeeper.CreateMode;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.CountDownLatch;
 
 public class TestTtlNodes extends CuratorTestBase
 {
-    @BeforeClass
+    @BeforeAll
     public static void setUpClass() {
         System.setProperty("zookeeper.extendedTypesEnabled", "true");
     }
     
-    @BeforeMethod
+    @BeforeEach
     @Override
     public void setup() throws Exception
     {
@@ -48,7 +51,7 @@
         super.setup();
     }
 
-    @AfterMethod
+    @AfterEach
     @Override
     public void teardown() throws Exception
     {
@@ -65,7 +68,7 @@
 
             client.create().withTtl(10).creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT_WITH_TTL).forPath("/a/b/c");
             Thread.sleep(20);
-            Assert.assertNull(client.checkExists().forPath("/a/b/c"));
+            assertNull(client.checkExists().forPath("/a/b/c"));
         }
     }
 
@@ -86,9 +89,9 @@
                 }
             };
             client.create().withTtl(10).creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT_WITH_TTL).inBackground(callback).forPath("/a/b/c");
-            Assert.assertTrue(new Timing().awaitLatch(latch));
+            assertTrue(new Timing().awaitLatch(latch));
             Thread.sleep(20);
-            Assert.assertNull(client.checkExists().forPath("/a/b/c"));
+            assertNull(client.checkExists().forPath("/a/b/c"));
         }
     }
 }
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWatcherIdentity.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWatcherIdentity.java
index 6f91023..1d16450 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWatcherIdentity.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWatcherIdentity.java
@@ -18,6 +18,8 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import com.google.common.collect.Sets;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -28,8 +30,8 @@
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.zookeeper.WatchedEvent;
 import org.apache.zookeeper.Watcher;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -77,13 +79,13 @@
             client.setData().forPath("/test", "foo".getBytes());
             client.delete().forPath("/test");
             timing.sleepABit();
-            Assert.assertEquals(actualWatcher.count.getAndSet(0), 1);
+            assertEquals(actualWatcher.count.getAndSet(0), 1);
 
             client.create().forPath("/test");
             client.checkExists().usingWatcher(actualWatcher).forPath("/test");
             client.delete().forPath("/test");
             timing.sleepABit();
-            Assert.assertEquals(actualWatcher.count.get(), 1);
+            assertEquals(actualWatcher.count.get(), 1);
         }
         finally
         {
@@ -109,13 +111,13 @@
             client.setData().forPath("/test", "foo".getBytes());
             client.delete().forPath("/test");
             timing.sleepABit();
-            Assert.assertEquals(actualWatcher.count.getAndSet(0), 1);
+            assertEquals(actualWatcher.count.getAndSet(0), 1);
 
             client.create().forPath("/test");
             client.checkExists().usingWatcher(actualWatcher).forPath("/test");
             client.delete().forPath("/test");
             timing.sleepABit();
-            Assert.assertEquals(actualWatcher.count.get(), 1);
+            assertEquals(actualWatcher.count.get(), 1);
         }
         finally
         {
@@ -136,13 +138,13 @@
         };
         NamespaceWatcher namespaceWatcher1 = new NamespaceWatcher(null, watcher, "/foo");
         NamespaceWatcher namespaceWatcher2 = new NamespaceWatcher(null, watcher, "/foo");
-        Assert.assertEquals(namespaceWatcher1, namespaceWatcher2);
-        Assert.assertFalse(namespaceWatcher1.equals(watcher));
-        Assert.assertFalse(watcher.equals(namespaceWatcher1));
+        assertEquals(namespaceWatcher1, namespaceWatcher2);
+        assertFalse(namespaceWatcher1.equals(watcher));
+        assertFalse(watcher.equals(namespaceWatcher1));
         Set<Watcher> set = Sets.newHashSet();
         set.add(namespaceWatcher1);
         set.add(namespaceWatcher2);
-        Assert.assertEquals(set.size(), 1);
+        assertEquals(set.size(), 1);
     }
 
     @Test
@@ -161,7 +163,7 @@
             // Ok, let's test it
             client.setData().forPath(PATH, new byte[]{});
             timing.sleepABit();
-            Assert.assertEquals(1, watcher.count.get());
+            assertEquals(1, watcher.count.get());
         }
         finally
         {
@@ -186,7 +188,7 @@
             // Ok, let's test it
             client.setData().forPath(PATH, new byte[]{});
             timing.sleepABit();
-            Assert.assertEquals(1, watcher.count.get());
+            assertEquals(1, watcher.count.get());
         }
         finally
         {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWatcherRemovalManager.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWatcherRemovalManager.java
index 8b17576..c6ac16c 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWatcherRemovalManager.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWatcherRemovalManager.java
@@ -18,6 +18,10 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.WatcherRemoveCuratorFramework;
@@ -30,8 +34,8 @@
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.WatchedEvent;
 import org.apache.zookeeper.Watcher;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CountDownLatch;
@@ -60,7 +64,7 @@
             removerClient.create().creatingParentsIfNeeded().forPath("/d/e/f");
 
             Timing timing = new Timing();
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
             timing.sleepABit();
 
             removerClient.removeWatchers();
@@ -89,7 +93,7 @@
             };
             removerClient.checkExists().usingWatcher(watcher).forPath("/a/b/c");
             removerClient.checkExists().usingWatcher(watcher).forPath("/d/e/f");
-            Assert.assertEquals(removerClient.getWatcherRemovalManager().getEntries().size(), 2);
+            assertEquals(removerClient.getWatcherRemovalManager().getEntries().size(), 2);
             removerClient.removeWatchers();
         }
         finally
@@ -122,7 +126,7 @@
             removerClient.setData().forPath("/a/b/c", "new".getBytes());
 
             Timing timing = new Timing();
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
             timing.sleepABit();
 
             removerClient.removeWatchers();
@@ -181,13 +185,13 @@
             try
             {
                 removerClient.checkExists().usingWatcher(w).forPath("/one/two/three");
-                Assert.fail("Should have thrown ConnectionLossException");
+                fail("Should have thrown ConnectionLossException");
             }
             catch ( KeeperException.ConnectionLossException expected )
             {
                 // expected
             }
-            Assert.assertEquals(removerClient.getWatcherRemovalManager().getEntries().size(), 0);
+            assertEquals(removerClient.getWatcherRemovalManager().getEntries().size(), 0);
         }
         finally
         {
@@ -223,8 +227,8 @@
                 }
             };
             removerClient.checkExists().usingWatcher(w).inBackground(callback).forPath("/one/two/three");
-            Assert.assertTrue(new Timing().awaitLatch(latch));
-            Assert.assertEquals(removerClient.getWatcherRemovalManager().getEntries().size(), 0);
+            assertTrue(new Timing().awaitLatch(latch));
+            assertEquals(removerClient.getWatcherRemovalManager().getEntries().size(), 0);
         }
         finally
         {
@@ -251,7 +255,7 @@
             try
             {
                 removerClient.getData().usingWatcher(w).forPath("/one/two/three");
-                Assert.fail("Should have thrown NoNodeException");
+                fail("Should have thrown NoNodeException");
             }
             catch ( KeeperException.NoNodeException expected )
             {
@@ -294,8 +298,8 @@
                     }
                 };
                 removerClient.getData().usingWatcher(w).inBackground(callback).forPath("/one/two/three");
-                Assert.assertTrue(new Timing().awaitLatch(latch));
-                Assert.assertEquals(removerClient.getWatcherRemovalManager().getEntries().size(), 0);
+                assertTrue(new Timing().awaitLatch(latch));
+                assertEquals(removerClient.getWatcherRemovalManager().getEntries().size(), 0);
                 removerClient.removeWatchers();
                 return null;
             }
@@ -392,9 +396,9 @@
             };
 
             removerClient.getData().usingWatcher(watcher).forPath("/test");
-            Assert.assertEquals(removerClient.getRemovalManager().getEntries().size(), 1);
+            assertEquals(removerClient.getRemovalManager().getEntries().size(), 1);
             removerClient.getData().usingWatcher(watcher).forPath("/test");
-            Assert.assertEquals(removerClient.getRemovalManager().getEntries().size(), 1);
+            assertEquals(removerClient.getRemovalManager().getEntries().size(), 1);
             removerClient.removeWatchers();
         }
         finally
@@ -427,12 +431,12 @@
             };
 
             removerClient.checkExists().usingWatcher(watcher).forPath("/yo");
-            Assert.assertEquals(removerClient.getRemovalManager().getEntries().size(), 1);
+            assertEquals(removerClient.getRemovalManager().getEntries().size(), 1);
             removerClient.create().forPath("/yo");
 
-            Assert.assertTrue(new Timing().awaitLatch(latch));
+            assertTrue(new Timing().awaitLatch(latch));
 
-            Assert.assertEquals(removerClient.getRemovalManager().getEntries().size(), 0);
+            assertEquals(removerClient.getRemovalManager().getEntries().size(), 0);
         }
         finally
         {
@@ -478,17 +482,17 @@
             };
 
             removerClient.checkExists().usingWatcher(watcher).forPath("/yo");
-            Assert.assertEquals(removerClient.getRemovalManager().getEntries().size(), 1);
+            assertEquals(removerClient.getRemovalManager().getEntries().size(), 1);
             removerClient.create().forPath("/yo");
 
-            Assert.assertTrue(timing.awaitLatch(createdLatch));
-            Assert.assertEquals(removerClient.getRemovalManager().getEntries().size(), 1);
+            assertTrue(timing.awaitLatch(createdLatch));
+            assertEquals(removerClient.getRemovalManager().getEntries().size(), 1);
 
             removerClient.delete().forPath("/yo");
 
-            Assert.assertTrue(timing.awaitLatch(deletedLatch));
+            assertTrue(timing.awaitLatch(deletedLatch));
 
-            Assert.assertEquals(removerClient.getRemovalManager().getEntries().size(), 0);
+            assertEquals(removerClient.getRemovalManager().getEntries().size(), 0);
         }
         finally
         {
@@ -515,13 +519,13 @@
         removerClient.checkExists().usingWatcher(watcher).forPath("/hey");
 
         List<String> existWatches = WatchersDebug.getExistWatches(client.getZookeeperClient().getZooKeeper());
-        Assert.assertEquals(existWatches.size(), 1);
+        assertEquals(existWatches.size(), 1);
 
         removerClient.removeWatchers();
 
-        Assert.assertTrue(new Timing().awaitLatch(latch));
+        assertTrue(new Timing().awaitLatch(latch));
 
         existWatches = WatchersDebug.getExistWatches(client.getZookeeperClient().getZooKeeper());
-        Assert.assertEquals(existWatches.size(), 0);
+        assertEquals(existWatches.size(), 0);
     }
 }
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWatchesBuilder.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWatchesBuilder.java
index 260c292..3052650 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWatchesBuilder.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWatchesBuilder.java
@@ -18,6 +18,10 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.api.BackgroundCallback;
@@ -41,8 +45,9 @@
 import org.apache.zookeeper.Watcher.Event.EventType;
 import org.apache.zookeeper.Watcher.WatcherType;
 import org.apache.zookeeper.ZooKeeper;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
@@ -128,7 +133,7 @@
             
             client.watches().removeAll().forPath(path);
             
-            Assert.assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
+            assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
         }
         finally
         {
@@ -167,7 +172,7 @@
 
             client.watches().remove(watcher).forPath(path);
 
-            Assert.assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
+            assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
         }
         finally
         {
@@ -196,7 +201,7 @@
 
             client.watches().remove(watcher).forPath(path);
 
-            Assert.assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
+            assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
         }
         finally
         {
@@ -238,7 +243,7 @@
 
             client.watches().remove(watcher).ofType(WatcherType.Any).inBackground(callback).forPath(path);
 
-            Assert.assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
+            assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
             
         }
         finally
@@ -267,7 +272,7 @@
 
             client.watches().remove(watcher).inBackground().forPath(path);
 
-            Assert.assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
+            assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
             
         }
         finally
@@ -299,7 +304,7 @@
 
             client.watches().removeAll().forPath(path);
 
-            Assert.assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
+            assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
         }
         finally
         {
@@ -331,8 +336,8 @@
             
             client.watches().removeAll().ofType(WatcherType.Data).forPath(path);
             
-            Assert.assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
-            Assert.assertEquals(removedFlag.get(), false);
+            assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
+            assertEquals(removedFlag.get(), false);
         }
         finally
         {
@@ -364,8 +369,8 @@
             
             client.watches().removeAll().ofType(WatcherType.Children).forPath(path);
             
-            Assert.assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
-            Assert.assertEquals(removedFlag.get(), false);
+            assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
+            assertEquals(removedFlag.get(), false);
         }
         finally
         {
@@ -397,11 +402,11 @@
             //Stop the server so we can check if we can remove watches locally when offline
             server.stop();
             
-            Assert.assertTrue(blockUntilDesiredConnectionState(stateRef, timing, ConnectionState.SUSPENDED));
+            assertTrue(blockUntilDesiredConnectionState(stateRef, timing, ConnectionState.SUSPENDED));
                        
             client.watches().removeAll().locally().forPath(path);
 
-            Assert.assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
+            assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
         }
         finally
         {
@@ -433,11 +438,11 @@
             //Stop the server so we can check if we can remove watches locally when offline
             server.stop();
             
-            Assert.assertTrue(blockUntilDesiredConnectionState(stateRef, timing, ConnectionState.SUSPENDED));
+            assertTrue(blockUntilDesiredConnectionState(stateRef, timing, ConnectionState.SUSPENDED));
                        
             client.watches().removeAll().locally().inBackground().forPath(path);
 
-            Assert.assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
+            assertTrue(timing.awaitLatch(removedLatch), "Timed out waiting for watch removal");
         }
         finally
         {
@@ -472,7 +477,7 @@
             try
             {
                 client.watches().remove(watcher).forPath(path);
-                Assert.fail("Expected KeeperException.NoWatcherException");
+                fail("Expected KeeperException.NoWatcherException");
             }
             catch ( KeeperException.NoWatcherException expected )
             {
@@ -484,7 +489,7 @@
             CloseableUtils.closeQuietly(client);
         }
     }
-    
+
     /**
      * Test the case where we try and remove an unregistered watcher but have the quietly flag set. In this case we expect success. 
      * @throws Exception
@@ -511,7 +516,7 @@
             timing.sleepABit();
             
             //There should be no watcher removed as none were registered.
-            Assert.assertEquals(watcherRemoved.get(), false);
+            assertEquals(watcherRemoved.get(), false);
         }
         finally
         {
@@ -541,13 +546,13 @@
             
             server.stop();           
             
-            Assert.assertTrue(blockUntilDesiredConnectionState(stateRef, timing, ConnectionState.SUSPENDED));
+            assertTrue(blockUntilDesiredConnectionState(stateRef, timing, ConnectionState.SUSPENDED));
             
             //Remove the watch while we're not connected
             try 
             {
                 client.watches().remove(watcher).guaranteed().forPath(path);
-                Assert.fail();
+                fail();
             }
             catch(KeeperException.ConnectionLossException e)
             {
@@ -596,7 +601,7 @@
             client.checkExists().usingWatcher(watcher).forPath(path);
             
             server.stop();           
-            Assert.assertTrue(blockUntilDesiredConnectionState(stateRef, timing, ConnectionState.SUSPENDED));
+            assertTrue(blockUntilDesiredConnectionState(stateRef, timing, ConnectionState.SUSPENDED));
             
             //Remove the watch while we're not connected
             client.watches().remove(watcher).guaranteed().inBackground().forPath(path);
@@ -613,7 +618,8 @@
         }
     }
 
-    @Test(groups = CuratorTestBase.zk36Group)
+    @Test
+    @Tag(CuratorTestBase.zk36Group)
     public void testPersistentWatch() throws Exception
     {
         try ( CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)) )
@@ -629,11 +635,12 @@
             client.setData().forPath("/test/foo", "hey".getBytes());
             client.delete().forPath("/test/foo");
 
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
         }
     }
 
-    @Test(groups = CuratorTestBase.zk36Group)
+    @Test
+    @Tag(CuratorTestBase.zk36Group)
     public void testPersistentWatchInBackground() throws Exception
     {
         try ( CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)) )
@@ -651,12 +658,13 @@
             client.setData().forPath("/test/foo", "hey".getBytes());
             client.delete().forPath("/test/foo");
 
-            Assert.assertTrue(timing.awaitLatch(backgroundLatch));
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(backgroundLatch));
+            assertTrue(timing.awaitLatch(latch));
         }
     }
 
-    @Test(groups = CuratorTestBase.zk36Group)
+    @Test
+    @Tag(CuratorTestBase.zk36Group)
     public void testPersistentRecursiveWatch() throws Exception
     {
         try ( CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)) )
@@ -674,11 +682,12 @@
             client.create().forPath("/test/a/b/c");
             client.create().forPath("/test/a/b/c/d");
 
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
         }
     }
 
-    @Test(groups = CuratorTestBase.zk36Group)
+    @Test
+    @Tag(CuratorTestBase.zk36Group)
     public void testPersistentRecursiveWatchInBackground() throws Exception
     {
         try ( CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)) )
@@ -698,12 +707,13 @@
             client.create().forPath("/test/a/b/c");
             client.create().forPath("/test/a/b/c/d");
 
-            Assert.assertTrue(timing.awaitLatch(backgroundLatch));
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(backgroundLatch));
+            assertTrue(timing.awaitLatch(latch));
         }
     }
 
-    @Test(groups = CuratorTestBase.zk36Group)
+    @Test
+    @Tag(CuratorTestBase.zk36Group)
     public void testPersistentRecursiveDefaultWatch() throws Exception
     {
         CountDownLatch latch = new CountDownLatch(6);   // 5 creates plus the initial sync
@@ -727,7 +737,7 @@
             client.create().forPath("/test/a/b/c");
             client.create().forPath("/test/a/b/c/d");
 
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
         }
     }
 
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWithCluster.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWithCluster.java
index 1f1e213..4784af1 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWithCluster.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestWithCluster.java
@@ -18,6 +18,9 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.curator.framework.CuratorFramework;
@@ -30,8 +33,8 @@
 import org.apache.curator.test.TestingCluster;
 import org.apache.curator.test.Timing;
 import org.apache.zookeeper.CreateMode;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.CountDownLatch;
 
 public class TestWithCluster extends CuratorTestBase
@@ -63,7 +66,7 @@
             client.getConnectionStateListenable().addListener(listener);
 
             client.create().withMode(CreateMode.EPHEMERAL).forPath("/temp", "value".getBytes());
-            Assert.assertNotNull(client.checkExists().forPath("/temp"));
+            assertNotNull(client.checkExists().forPath("/temp"));
 
             for ( InstanceSpec spec : cluster.getInstances() )
             {
@@ -73,8 +76,8 @@
                 timing.sleepABit();
             }
 
-            Assert.assertTrue(timing.awaitLatch(reconnectedLatch));
-            Assert.assertNotNull(client.checkExists().forPath("/temp"));
+            assertTrue(timing.awaitLatch(reconnectedLatch));
+            assertNotNull(client.checkExists().forPath("/temp"));
         }
         finally
         {
@@ -127,11 +130,11 @@
             {
                 if ( !instanceSpec.equals(cluster.findConnectionInstance(client.getZookeeperClient().getZooKeeper())) )
                 {
-                    Assert.assertTrue(cluster.killServer(instanceSpec));
+                    assertTrue(cluster.killServer(instanceSpec));
                 }
             }
 
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
         }
         finally
         {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/schema/TestSchema.java b/curator-framework/src/test/java/org/apache/curator/framework/schema/TestSchema.java
index cd8e977..9454ef5 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/schema/TestSchema.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/schema/TestSchema.java
@@ -18,6 +18,9 @@
  */
 package org.apache.curator.framework.schema;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.fail;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
@@ -32,8 +35,8 @@
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.data.ACL;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
@@ -45,11 +48,11 @@
     {
         SchemaSet schemaSet = loadSchemaSet("schema1.json", null);
         Schema schema = schemaSet.getNamedSchema("test");
-        Assert.assertNotNull(schema);
+        assertNotNull(schema);
         Map<String, String> expectedMetadata = Maps.newHashMap();
         expectedMetadata.put("one", "1");
         expectedMetadata.put("two", "2");
-        Assert.assertEquals(schema.getMetadata(), expectedMetadata);
+        assertEquals(schema.getMetadata(), expectedMetadata);
 
         CuratorFramework client = newClient(schemaSet);
         try
@@ -59,9 +62,9 @@
             try
             {
                 String rawPath = schema.getRawPath();
-                Assert.assertEquals(rawPath, "/a/b/c");
+                assertEquals(rawPath, "/a/b/c");
                 client.create().creatingParentsIfNeeded().forPath(rawPath);
-                Assert.fail("Should've violated schema");
+                fail("Should've violated schema");
             }
             catch ( SchemaViolation dummy )
             {
@@ -104,7 +107,7 @@
             try
             {
                 client.create().forPath("/test", new byte[0]);
-                Assert.fail("Should've violated schema");
+                fail("Should've violated schema");
             }
             catch ( SchemaViolation dummy )
             {
@@ -131,7 +134,7 @@
             try
             {
                 client.create().creatingParentsIfNeeded().forPath("/a/b/c");
-                Assert.fail("Should've violated schema: test");
+                fail("Should've violated schema: test");
             }
             catch ( SchemaViolation dummy )
             {
@@ -141,7 +144,7 @@
             try
             {
                 client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/a/b/c/d/e");
-                Assert.fail("Should've violated schema: test2");
+                fail("Should've violated schema: test2");
             }
             catch ( SchemaViolation dummy )
             {
@@ -190,7 +193,7 @@
             try
             {
                 client.transaction().forOperations(createAPersistent, createAEphemeral);
-                Assert.fail("Should've violated schema");
+                fail("Should've violated schema");
             }
             catch ( SchemaViolation dummy )
             {
@@ -201,7 +204,7 @@
             try
             {
                 client.transaction().forOperations(deleteA);
-                Assert.fail("Should've violated schema");
+                fail("Should've violated schema");
             }
             catch ( SchemaViolation dummy )
             {
@@ -211,7 +214,7 @@
             try
             {
                 client.transaction().forOperations(createBEmptyData);
-                Assert.fail("Should've violated schema");
+                fail("Should've violated schema");
             }
             catch ( SchemaViolation dummy )
             {
@@ -222,7 +225,7 @@
             try
             {
                 client.transaction().forOperations(setBEmptyData);
-                Assert.fail("Should've violated schema");
+                fail("Should've violated schema");
             }
             catch ( SchemaViolation dummy )
             {
@@ -242,12 +245,12 @@
         String yaml = Resources.toString(Resources.getResource("schema.yaml"), Charsets.UTF_8);
         JsonNode root = new ObjectMapper(new YAMLFactory()).readTree(yaml);
         List<Schema> schemas = new SchemaSetLoader(root, null).getSchemas();
-        Assert.assertEquals(schemas.size(), 2);
-        Assert.assertEquals(schemas.get(0).getName(), "test");
-        Assert.assertEquals(schemas.get(0).getMetadata().size(), 0);
-        Assert.assertEquals(schemas.get(1).getName(), "test2");
-        Assert.assertEquals(schemas.get(1).getMetadata().size(), 2);
-        Assert.assertEquals(schemas.get(1).getMetadata().get("two"), "2");
+        assertEquals(schemas.size(), 2);
+        assertEquals(schemas.get(0).getName(), "test");
+        assertEquals(schemas.get(0).getMetadata().size(), 0);
+        assertEquals(schemas.get(1).getName(), "test2");
+        assertEquals(schemas.get(1).getMetadata().size(), 2);
+        assertEquals(schemas.get(1).getMetadata().get("two"), "2");
     }
 
     @Test
@@ -262,7 +265,7 @@
             try
             {
                 client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/exact/match");
-                Assert.fail("Should've violated schema");
+                fail("Should've violated schema");
             }
             catch ( SchemaViolation dummy )
             {
@@ -272,7 +275,7 @@
             try
             {
                 client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath("/exact/foo/bar");
-                Assert.fail("Should've violated schema");
+                fail("Should've violated schema");
             }
             catch ( SchemaViolation dummy )
             {
@@ -282,7 +285,7 @@
             try
             {
                 client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/exact/other/bar");
-                Assert.fail("Should've violated schema");
+                fail("Should've violated schema");
             }
             catch ( SchemaViolation dummy )
             {
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/state/TestCircuitBreaker.java b/curator-framework/src/test/java/org/apache/curator/framework/state/TestCircuitBreaker.java
index bee917e..f6cd399 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/state/TestCircuitBreaker.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/state/TestCircuitBreaker.java
@@ -18,13 +18,15 @@
  */
 package org.apache.curator.framework.state;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import org.apache.curator.RetryPolicy;
 import org.apache.curator.retry.RetryForever;
 import org.apache.curator.retry.RetryNTimes;
 import org.apache.curator.retry.RetryUntilElapsed;
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Test;
 import java.time.Duration;
 import java.time.temporal.ChronoUnit;
 import java.util.concurrent.ScheduledFuture;
@@ -34,8 +36,8 @@
 
 public class TestCircuitBreaker
 {
-    private Duration[] lastDelay = new Duration[]{Duration.ZERO};
-    private ScheduledThreadPoolExecutor service = new ScheduledThreadPoolExecutor(1)
+    private static Duration[] lastDelay = new Duration[]{Duration.ZERO};
+    private static ScheduledThreadPoolExecutor service = new ScheduledThreadPoolExecutor(1)
     {
         @Override
         public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)
@@ -46,8 +48,8 @@
         }
     };
 
-    @AfterClass
-    public void tearDown()
+    @AfterAll
+    public static void tearDown()
     {
         service.shutdownNow();
     }
@@ -61,30 +63,30 @@
         CircuitBreaker circuitBreaker = CircuitBreaker.build(new RetryNTimes(retryQty, (int)delay.toMillis()), service);
         AtomicInteger counter = new AtomicInteger(0);
 
-        Assert.assertTrue(circuitBreaker.tryToOpen(counter::incrementAndGet));
-        Assert.assertEquals(lastDelay[0], delay);
+        assertTrue(circuitBreaker.tryToOpen(counter::incrementAndGet));
+        assertEquals(lastDelay[0], delay);
 
-        Assert.assertFalse(circuitBreaker.tryToOpen(counter::incrementAndGet));
-        Assert.assertEquals(circuitBreaker.getRetryCount(), 1);
-        Assert.assertEquals(counter.get(), 1);
-        Assert.assertFalse(circuitBreaker.tryToRetry(counter::incrementAndGet));
-        Assert.assertEquals(circuitBreaker.getRetryCount(), 1);
-        Assert.assertEquals(counter.get(), 1);
+        assertFalse(circuitBreaker.tryToOpen(counter::incrementAndGet));
+        assertEquals(circuitBreaker.getRetryCount(), 1);
+        assertEquals(counter.get(), 1);
+        assertFalse(circuitBreaker.tryToRetry(counter::incrementAndGet));
+        assertEquals(circuitBreaker.getRetryCount(), 1);
+        assertEquals(counter.get(), 1);
 
-        Assert.assertTrue(circuitBreaker.close());
-        Assert.assertEquals(circuitBreaker.getRetryCount(), 0);
-        Assert.assertFalse(circuitBreaker.close());
+        assertTrue(circuitBreaker.close());
+        assertEquals(circuitBreaker.getRetryCount(), 0);
+        assertFalse(circuitBreaker.close());
     }
 
     @Test
     public void testVariousOpenRetryFails()
     {
         CircuitBreaker circuitBreaker = CircuitBreaker.build(new RetryForever(1), service);
-        Assert.assertFalse(circuitBreaker.tryToRetry(() -> {}));
-        Assert.assertTrue(circuitBreaker.tryToOpen(() -> {}));
-        Assert.assertFalse(circuitBreaker.tryToOpen(() -> {}));
-        Assert.assertTrue(circuitBreaker.close());
-        Assert.assertFalse(circuitBreaker.close());
+        assertFalse(circuitBreaker.tryToRetry(() -> {}));
+        assertTrue(circuitBreaker.tryToOpen(() -> {}));
+        assertFalse(circuitBreaker.tryToOpen(() -> {}));
+        assertTrue(circuitBreaker.close());
+        assertFalse(circuitBreaker.close());
     }
 
     @Test
@@ -92,7 +94,7 @@
     {
         RetryPolicy retryPolicy = new RetryUntilElapsed(10000, 10000);
         CircuitBreaker circuitBreaker = CircuitBreaker.build(retryPolicy, service);
-        Assert.assertTrue(circuitBreaker.tryToOpen(() -> {}));
-        Assert.assertEquals(lastDelay[0], Duration.ofMillis(10000));
+        assertTrue(circuitBreaker.tryToOpen(() -> {}));
+        assertEquals(lastDelay[0], Duration.ofMillis(10000));
     }
 }
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/state/TestCircuitBreakingConnectionStateListener.java b/curator-framework/src/test/java/org/apache/curator/framework/state/TestCircuitBreakingConnectionStateListener.java
index 5c80a9a..61c8da8 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/state/TestCircuitBreakingConnectionStateListener.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/state/TestCircuitBreakingConnectionStateListener.java
@@ -18,6 +18,9 @@
  */
 package org.apache.curator.framework.state;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import org.apache.curator.RetryPolicy;
 import org.apache.curator.RetrySleeper;
 import org.apache.curator.framework.CuratorFramework;
@@ -25,10 +28,9 @@
 import org.apache.curator.retry.RetryForever;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.compatibility.Timing2;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
@@ -68,13 +70,13 @@
         }
     }
 
-    @BeforeMethod
+    @BeforeEach
     public void setup()
     {
         service = new ScheduledThreadPoolExecutor(1);
     }
 
-    @AfterMethod
+    @AfterEach
     public void tearDown()
     {
         service.shutdownNow();
@@ -88,14 +90,14 @@
         CircuitBreakingConnectionStateListener listener = new CircuitBreakingConnectionStateListener(dummyClient, recordingListener, retryPolicy, service);
 
         listener.stateChanged(dummyClient, ConnectionState.RECONNECTED);
-        Assert.assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.RECONNECTED);
+        assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.RECONNECTED);
 
         listener.stateChanged(dummyClient, ConnectionState.SUSPENDED);
-        Assert.assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.SUSPENDED);
+        assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.SUSPENDED);
         listener.stateChanged(dummyClient, ConnectionState.SUSPENDED);  // 2nd suspended is ignored
-        Assert.assertTrue(recordingListener.stateChanges.isEmpty());
+        assertTrue(recordingListener.stateChanges.isEmpty());
         listener.stateChanged(dummyClient, ConnectionState.LOST);
-        Assert.assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.LOST);
+        assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.LOST);
 
         synchronized(listener)  // don't let retry policy run while we're pushing state changes
         {
@@ -106,10 +108,10 @@
             listener.stateChanged(dummyClient, ConnectionState.SUSPENDED);   // all further events are ignored - this will be the last event
         }
         retryTiming.multiple(2).sleep();
-        Assert.assertTrue(recordingListener.stateChanges.isEmpty());
+        assertTrue(recordingListener.stateChanges.isEmpty());
 
         retryPolicy.isRetrying = false; // retry policy will return false
-        Assert.assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.SUSPENDED);
+        assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.SUSPENDED);
     }
 
     @Test
@@ -124,11 +126,11 @@
             listener.stateChanged(dummyClient, ConnectionState.LOST);
             listener.stateChanged(dummyClient, ConnectionState.LOST);   // second LOST ignored
         }
-        Assert.assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.LOST);
-        Assert.assertTrue(recordingListener.stateChanges.isEmpty());
+        assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.LOST);
+        assertTrue(recordingListener.stateChanges.isEmpty());
 
         listener.stateChanged(dummyClient, ConnectionState.RECONNECTED);   // causes circuit to close on next retry
-        Assert.assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.RECONNECTED);
+        assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.RECONNECTED);
     }
 
     @Test
@@ -139,11 +141,11 @@
         CircuitBreakingConnectionStateListener listener = new CircuitBreakingConnectionStateListener(dummyClient, recordingListener, retryNever, service);
 
         listener.stateChanged(dummyClient, ConnectionState.LOST);
-        Assert.assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.LOST);
-        Assert.assertFalse(listener.isOpen());
+        assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.LOST);
+        assertFalse(listener.isOpen());
         listener.stateChanged(dummyClient, ConnectionState.LOST);
-        Assert.assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.LOST);
-        Assert.assertFalse(listener.isOpen());
+        assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.LOST);
+        assertFalse(listener.isOpen());
     }
 
     @Test
@@ -157,11 +159,11 @@
         {
             listener.stateChanged(dummyClient, ConnectionState.LOST);
             listener.stateChanged(dummyClient, ConnectionState.SUSPENDED);
-            Assert.assertTrue(listener.isOpen());
+            assertTrue(listener.isOpen());
         }
-        Assert.assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.LOST);
-        Assert.assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.SUSPENDED);
-        Assert.assertFalse(listener.isOpen());
+        assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.LOST);
+        assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.SUSPENDED);
+        assertFalse(listener.isOpen());
     }
 
     @Test
@@ -172,12 +174,12 @@
         CircuitBreakingConnectionStateListener listener = new CircuitBreakingConnectionStateListener(dummyClient, recordingListener, retryInfinite, service);
 
         listener.stateChanged(dummyClient, ConnectionState.RECONNECTED);
-        Assert.assertFalse(listener.isOpen());
-        Assert.assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.RECONNECTED);
+        assertFalse(listener.isOpen());
+        assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.RECONNECTED);
 
         listener.stateChanged(dummyClient, ConnectionState.SUSPENDED);
-        Assert.assertTrue(listener.isOpen());
-        Assert.assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.SUSPENDED);
+        assertTrue(listener.isOpen());
+        assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.SUSPENDED);
 
         listener.stateChanged(dummyClient, ConnectionState.RECONNECTED);
         listener.stateChanged(dummyClient, ConnectionState.READ_ONLY);
@@ -188,12 +190,12 @@
         listener.stateChanged(dummyClient, ConnectionState.RECONNECTED);
         listener.stateChanged(dummyClient, ConnectionState.READ_ONLY);
         listener.stateChanged(dummyClient, ConnectionState.SUSPENDED);
-        Assert.assertTrue(recordingListener.stateChanges.isEmpty());
-        Assert.assertTrue(listener.isOpen());
+        assertTrue(recordingListener.stateChanges.isEmpty());
+        assertTrue(listener.isOpen());
 
         listener.stateChanged(dummyClient, ConnectionState.LOST);
-        Assert.assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.LOST);
-        Assert.assertTrue(listener.isOpen());
+        assertEquals(timing.takeFromQueue(recordingListener.stateChanges), ConnectionState.LOST);
+        assertTrue(listener.isOpen());
 
         listener.stateChanged(dummyClient, ConnectionState.RECONNECTED);
         listener.stateChanged(dummyClient, ConnectionState.READ_ONLY);
@@ -204,8 +206,8 @@
         listener.stateChanged(dummyClient, ConnectionState.RECONNECTED);
         listener.stateChanged(dummyClient, ConnectionState.READ_ONLY);
         listener.stateChanged(dummyClient, ConnectionState.SUSPENDED);
-        Assert.assertTrue(recordingListener.stateChanges.isEmpty());
-        Assert.assertTrue(listener.isOpen());
+        assertTrue(recordingListener.stateChanges.isEmpty());
+        assertTrue(listener.isOpen());
 
         listener.stateChanged(dummyClient, ConnectionState.RECONNECTED);
         listener.stateChanged(dummyClient, ConnectionState.READ_ONLY);
@@ -221,7 +223,7 @@
         listener.stateChanged(dummyClient, ConnectionState.LOST);
         listener.stateChanged(dummyClient, ConnectionState.SUSPENDED);
         listener.stateChanged(dummyClient, ConnectionState.LOST);
-        Assert.assertTrue(recordingListener.stateChanges.isEmpty());
-        Assert.assertTrue(listener.isOpen());
+        assertTrue(recordingListener.stateChanges.isEmpty());
+        assertTrue(listener.isOpen());
     }
 }
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/state/TestConnectionStateManager.java b/curator-framework/src/test/java/org/apache/curator/framework/state/TestConnectionStateManager.java
index 1dbb5e7..4bd94e2 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/state/TestConnectionStateManager.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/state/TestConnectionStateManager.java
@@ -18,6 +18,8 @@
  */
 package org.apache.curator.framework.state;
 
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.RetryOneTime;
@@ -25,12 +27,13 @@
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.test.compatibility.Timing2;
 import org.apache.curator.utils.CloseableUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
-@Test(groups = CuratorTestBase.zk35TestCompatibilityGroup)
+@Tag(CuratorTestBase.zk35TestCompatibilityGroup)
 public class TestConnectionStateManager extends BaseClassForTests {
 
     @Test
@@ -71,10 +74,10 @@
 
             client.getConnectionStateListenable().addListener(stateListener);
             client.start();
-            Assert.assertTrue(timing.awaitLatch(connectedLatch));
+            assertTrue(timing.awaitLatch(connectedLatch));
             server.close();
 
-            Assert.assertTrue(lostLatch.await(lostStateExpectedMs, TimeUnit.MILLISECONDS));
+            assertTrue(lostLatch.await(lostStateExpectedMs, TimeUnit.MILLISECONDS));
         }
         finally {
             CloseableUtils.closeQuietly(client);
diff --git a/curator-recipes/pom.xml b/curator-recipes/pom.xml
index 9a0acaf..8cd2e51 100644
--- a/curator-recipes/pom.xml
+++ b/curator-recipes/pom.xml
@@ -70,8 +70,8 @@
         </dependency>
 
         <dependency>
-            <groupId>org.testng</groupId>
-            <artifactId>testng</artifactId>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
             <scope>test</scope>
         </dependency>
 
diff --git a/curator-recipes/src/test/java/org/apache/curator/connection/TestThreadLocalRetryLoop.java b/curator-recipes/src/test/java/org/apache/curator/connection/TestThreadLocalRetryLoop.java
index d1cc243..11a5af5 100644
--- a/curator-recipes/src/test/java/org/apache/curator/connection/TestThreadLocalRetryLoop.java
+++ b/curator-recipes/src/test/java/org/apache/curator/connection/TestThreadLocalRetryLoop.java
@@ -18,6 +18,10 @@
  */
 package org.apache.curator.connection;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import org.apache.curator.RetryLoop;
 import org.apache.curator.RetryPolicy;
 import org.apache.curator.RetrySleeper;
@@ -28,8 +32,9 @@
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.utils.ThreadUtils;
 import org.apache.zookeeper.KeeperException;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -41,7 +46,8 @@
     private static final int retryCount = 4;
     private static final String backgroundThreadNameBase = "ignore-curator-background-thread";
 
-    @Test(description = "Check for fix for CURATOR-559")
+    @Test
+    @DisplayName("Check for fix for CURATOR-559")
     public void testRecursingRetry() throws Exception
     {
         AtomicInteger count = new AtomicInteger();
@@ -49,11 +55,12 @@
         {
             prep(client, count);
             doOperation(client);
-            Assert.assertEquals(count.get(), retryCount + 1);    // Curator's retry policy has been off by 1 since inception - we might consider fixing it someday
+            assertEquals(count.get(), retryCount + 1);    // Curator's retry policy has been off by 1 since inception - we might consider fixing it someday
         }
     }
 
-    @Test(description = "Check for fix for CURATOR-559 with multiple threads")
+    @Test
+    @DisplayName("Check for fix for CURATOR-559 with multiple threads")
     public void testThreadedRecursingRetry() throws Exception
     {
         final int threadQty = 4;
@@ -67,16 +74,18 @@
                 executorService.submit(() -> doOperation(client));
             }
             executorService.shutdown();
-            Assert.assertTrue(executorService.awaitTermination(timing.milliseconds(), TimeUnit.MILLISECONDS));
-            Assert.assertEquals(count.get(), threadQty * (retryCount + 1));    // Curator's retry policy has been off by 1 since inception - we might consider fixing it someday
+            assertTrue(executorService.awaitTermination(timing.milliseconds(), TimeUnit.MILLISECONDS));
+            assertEquals(count.get(), threadQty * (retryCount + 1));    // Curator's retry policy has been off by 1 since inception - we might consider fixing it someday
         }
     }
 
-    @Test(expectedExceptions = NullPointerException.class)
+    @Test
     public void testBadReleaseWithNoGet()
     {
-        ThreadLocalRetryLoop retryLoopStack = new ThreadLocalRetryLoop();
-        retryLoopStack.release();
+        assertThrows(NullPointerException.class, ()-> {
+                    ThreadLocalRetryLoop retryLoopStack = new ThreadLocalRetryLoop();
+                    retryLoopStack.release();
+                });
     }
 
     private CuratorFramework newClient(AtomicInteger count)
@@ -97,7 +106,7 @@
             }
         });
         server.stop();
-        Assert.assertTrue(timing.awaitLatch(lostLatch));
+        assertTrue(timing.awaitLatch(lostLatch));
         count.set(0);   // in case the server shutdown incremented the count
     }
 
@@ -109,7 +118,7 @@
                 client.checkExists().forPath("/hey");
                 return null;
             });
-            Assert.fail("Should have thrown an exception");
+            fail("Should have thrown an exception");
         }
         catch ( KeeperException dummy )
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/client/TestBackgroundStates.java b/curator-recipes/src/test/java/org/apache/curator/framework/client/TestBackgroundStates.java
index f264615..cf90a67 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/client/TestBackgroundStates.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/client/TestBackgroundStates.java
@@ -19,6 +19,8 @@
 
 package org.apache.curator.framework.client;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Queues;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -30,8 +32,8 @@
 import org.apache.curator.test.TestingServer;
 import org.apache.curator.test.Timing;
 import org.apache.curator.utils.CloseableUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
@@ -77,14 +79,14 @@
             client.getConnectionStateListenable().addListener(listener);
             timing.sleepABit();
             server = new TestingServer(server.getPort());
-            Assert.assertTrue(timing.awaitLatch(connectedLatch));
+            assertTrue(timing.awaitLatch(connectedLatch));
             timing.sleepABit();
-            Assert.assertTrue(node.waitForInitialCreate(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS));
+            assertTrue(node.waitForInitialCreate(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS));
             server.restart();
             timing.sleepABit();
-            Assert.assertTrue(timing.awaitLatch(reconnectedLatch));
+            assertTrue(timing.awaitLatch(reconnectedLatch));
             timing.sleepABit();
-            Assert.assertEquals(lastState.get(), ConnectionState.RECONNECTED);
+            assertEquals(lastState.get(), ConnectionState.RECONNECTED);
         }
         finally
         {
@@ -118,15 +120,15 @@
 
             client.getConnectionStateListenable().addListener(listener);
             server = new TestingServer(server.getPort());
-            Assert.assertEquals(stateVector.poll(waitingTiming.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED);
+            assertEquals(stateVector.poll(waitingTiming.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED);
             server.stop();
-            Assert.assertEquals(stateVector.poll(waitingTiming.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED);
-            Assert.assertEquals(stateVector.poll(waitingTiming.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
+            assertEquals(stateVector.poll(waitingTiming.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED);
+            assertEquals(stateVector.poll(waitingTiming.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
             server.restart();
-            Assert.assertEquals(stateVector.poll(waitingTiming.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.RECONNECTED);
+            assertEquals(stateVector.poll(waitingTiming.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.RECONNECTED);
             server.close();
-            Assert.assertEquals(stateVector.poll(waitingTiming.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED);
-            Assert.assertEquals(stateVector.poll(waitingTiming.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
+            assertEquals(stateVector.poll(waitingTiming.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED);
+            assertEquals(stateVector.poll(waitingTiming.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/client/TestResetConnectionWithBackgroundFailure.java b/curator-recipes/src/test/java/org/apache/curator/framework/client/TestResetConnectionWithBackgroundFailure.java
index 852d9aa..7bcd93a 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/client/TestResetConnectionWithBackgroundFailure.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/client/TestResetConnectionWithBackgroundFailure.java
@@ -19,26 +19,22 @@
 
 package org.apache.curator.framework.client;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import com.google.common.collect.Queues;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
-import org.apache.curator.framework.imps.CuratorFrameworkImpl;
 import org.apache.curator.framework.recipes.leader.LeaderSelector;
 import org.apache.curator.framework.recipes.leader.LeaderSelectorListener;
 import org.apache.curator.framework.recipes.leader.LeaderSelectorListenerAdapter;
 import org.apache.curator.framework.state.ConnectionState;
 import org.apache.curator.framework.state.ConnectionStateListener;
-import org.apache.curator.retry.ExponentialBackoffRetry;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.test.Timing;
 import org.apache.curator.utils.CloseableUtils;
-import org.apache.zookeeper.CreateMode;
-import org.apache.zookeeper.ZooDefs;
+import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.Test;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.TimeUnit;
 
@@ -86,21 +82,21 @@
             client.getConnectionStateListenable().addListener(listener1);
             log.debug("Starting ZK server");
             server.restart();
-            Assert.assertEquals(listenerSequence.poll(forWaiting.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED);
+            assertEquals(listenerSequence.poll(forWaiting.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED);
 
             log.debug("Stopping ZK server");
             server.stop();
-            Assert.assertEquals(listenerSequence.poll(forWaiting.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED);
-            Assert.assertEquals(listenerSequence.poll(forWaiting.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
+            assertEquals(listenerSequence.poll(forWaiting.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED);
+            assertEquals(listenerSequence.poll(forWaiting.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
 
             log.debug("Starting ZK server");
             server.restart();
-            Assert.assertEquals(listenerSequence.poll(forWaiting.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.RECONNECTED);
+            assertEquals(listenerSequence.poll(forWaiting.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.RECONNECTED);
 
             log.debug("Stopping ZK server");
             server.close();
-            Assert.assertEquals(listenerSequence.poll(forWaiting.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED);
-            Assert.assertEquals(listenerSequence.poll(forWaiting.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
+            assertEquals(listenerSequence.poll(forWaiting.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED);
+            assertEquals(listenerSequence.poll(forWaiting.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/atomic/TestCachedAtomicCounter.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/atomic/TestCachedAtomicCounter.java
index bdc03c2..28813fe 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/atomic/TestCachedAtomicCounter.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/atomic/TestCachedAtomicCounter.java
@@ -18,12 +18,16 @@
  */
 package org.apache.curator.framework.recipes.atomic;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.BaseClassForTests;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.atomic.AtomicReference;
 
 public class TestCachedAtomicCounter extends BaseClassForTests
@@ -92,9 +96,9 @@
             for ( int i = 0; i < FACTOR; ++i )
             {
                 value = cachedLong.next();
-                Assert.assertTrue(value.succeeded());
-                Assert.assertEquals(value.preValue().longValue(), i);
-                Assert.assertEquals(value.postValue().longValue(), i + 1);
+                assertTrue(value.succeeded());
+                assertEquals(value.preValue().longValue(), i);
+                assertEquals(value.postValue().longValue(), i + 1);
 
                 if ( i == 0 )
                 {
@@ -105,7 +109,7 @@
             }
 
             value = cachedLong.next();
-            Assert.assertFalse(value.succeeded());
+            assertFalse(value.succeeded());
         }
         finally
         {
@@ -125,9 +129,9 @@
             for ( long i = 0; i < 200; ++i )
             {
                 AtomicValue<Long>       value = cachedLong.next();
-                Assert.assertTrue(value.succeeded());
-                Assert.assertEquals(value.preValue().longValue(), i);
-                Assert.assertEquals(value.postValue().longValue(), i + 1);
+                assertTrue(value.succeeded());
+                assertEquals(value.preValue().longValue(), i);
+                assertEquals(value.postValue().longValue(), i + 1);
             }
         }
         finally
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/atomic/TestDistributedAtomicLong.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/atomic/TestDistributedAtomicLong.java
index 9d9fe03..1cd0f96 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/atomic/TestDistributedAtomicLong.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/atomic/TestDistributedAtomicLong.java
@@ -18,6 +18,12 @@
  */
 package org.apache.curator.framework.recipes.atomic;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import com.google.common.collect.Lists;
 import org.apache.curator.RetryPolicy;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -27,9 +33,8 @@
 import org.apache.commons.math.stat.descriptive.SynchronizedSummaryStatistics;
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.utils.CloseableUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-import org.testng.collections.Lists;
+import org.junit.jupiter.api.Test;
+
 import java.nio.BufferOverflowException;
 import java.nio.BufferUnderflowException;
 import java.util.List;
@@ -58,11 +63,11 @@
             }
             catch ( BufferUnderflowException e )
             {
-                Assert.fail("", e);
+                fail("", e);
             }
             catch ( BufferOverflowException e )
             {
-                Assert.fail("", e);
+                fail("", e);
             }
             catch ( RuntimeException e )
             {
@@ -84,13 +89,13 @@
             client.start();
             DistributedAtomicLong dal = new DistributedAtomicLong(client, "/counter", new RetryOneTime(1));
             AtomicValue<Long> result = dal.compareAndSet(0L, 1L);
-            Assert.assertFalse(result.succeeded());
+            assertFalse(result.succeeded());
 
-            Assert.assertTrue(dal.initialize(0L));
+            assertTrue(dal.initialize(0L));
             result = dal.compareAndSet(0L, 1L);
-            Assert.assertTrue(result.succeeded());
+            assertTrue(result.succeeded());
 
-            Assert.assertFalse(dal.initialize(0L));
+            assertFalse(dal.initialize(0L));
         }
         finally
         {
@@ -130,11 +135,11 @@
             };
             dal.forceSet(1L);
 
-            Assert.assertTrue(dal.compareAndSet(1L, 5L).succeeded());
-            Assert.assertFalse(dal.compareAndSet(1L, 5L).succeeded());
+            assertTrue(dal.compareAndSet(1L, 5L).succeeded());
+            assertFalse(dal.compareAndSet(1L, 5L).succeeded());
 
             doIncrement.set(true);
-            Assert.assertFalse(dal.compareAndSet(5L, 10L).succeeded());
+            assertFalse(dal.compareAndSet(5L, 10L).succeeded());
         }
         finally
         {
@@ -185,7 +190,7 @@
                 }
             );
 
-            Assert.assertTrue(dal.get().preValue() < 10);
+            assertTrue(dal.get().preValue() < 10);
         }
         finally
         {
@@ -237,9 +242,9 @@
         System.out.println("Min time: " + timingStats.getMin());
         System.out.println("Qty: " + timingStats.getN());
 
-        Assert.assertEquals(errors.get(), 0);
-        Assert.assertTrue(optimisticTries.get() > 0);
-        Assert.assertTrue(promotedLockTries.get() > 0);
+        assertEquals(errors.get(), 0);
+        assertTrue(optimisticTries.get() > 0);
+        assertTrue(promotedLockTries.get() > 0);
     }
 
     @Test
@@ -252,32 +257,32 @@
             DistributedAtomicLong dal = new DistributedAtomicLong(client, "/foo/bar/counter", new RetryOneTime(1));
 
             AtomicValue<Long>           value = dal.increment();
-            Assert.assertTrue(value.succeeded());
-            Assert.assertEquals(value.getStats().getOptimisticTries(), 1);
-            Assert.assertEquals(value.getStats().getPromotedLockTries(), 0);
-            Assert.assertEquals(value.preValue().longValue(), 0L);
-            Assert.assertEquals(value.postValue().longValue(), 1L);
+            assertTrue(value.succeeded());
+            assertEquals(value.getStats().getOptimisticTries(), 1);
+            assertEquals(value.getStats().getPromotedLockTries(), 0);
+            assertEquals(value.preValue().longValue(), 0L);
+            assertEquals(value.postValue().longValue(), 1L);
 
             value = dal.decrement();
-            Assert.assertTrue(value.succeeded());
-            Assert.assertEquals(value.getStats().getOptimisticTries(), 1);
-            Assert.assertEquals(value.getStats().getPromotedLockTries(), 0);
-            Assert.assertEquals(value.preValue().longValue(), 1L);
-            Assert.assertEquals(value.postValue().longValue(), 0L);
+            assertTrue(value.succeeded());
+            assertEquals(value.getStats().getOptimisticTries(), 1);
+            assertEquals(value.getStats().getPromotedLockTries(), 0);
+            assertEquals(value.preValue().longValue(), 1L);
+            assertEquals(value.postValue().longValue(), 0L);
 
             value = dal.add(10L);
-            Assert.assertTrue(value.succeeded());
-            Assert.assertEquals(value.getStats().getOptimisticTries(), 1);
-            Assert.assertEquals(value.getStats().getPromotedLockTries(), 0);
-            Assert.assertEquals(value.preValue().longValue(), 0L);
-            Assert.assertEquals(value.postValue().longValue(), 10L);
+            assertTrue(value.succeeded());
+            assertEquals(value.getStats().getOptimisticTries(), 1);
+            assertEquals(value.getStats().getPromotedLockTries(), 0);
+            assertEquals(value.preValue().longValue(), 0L);
+            assertEquals(value.postValue().longValue(), 10L);
 
             value = dal.subtract(5L);
-            Assert.assertTrue(value.succeeded());
-            Assert.assertEquals(value.getStats().getOptimisticTries(), 1);
-            Assert.assertEquals(value.getStats().getPromotedLockTries(), 0);
-            Assert.assertEquals(value.preValue().longValue(), 10L);
-            Assert.assertEquals(value.postValue().longValue(), 5L);
+            assertTrue(value.succeeded());
+            assertEquals(value.getStats().getOptimisticTries(), 1);
+            assertEquals(value.getStats().getPromotedLockTries(), 0);
+            assertEquals(value.preValue().longValue(), 10L);
+            assertEquals(value.postValue().longValue(), 5L);
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/barriers/TestDistributedBarrier.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/barriers/TestDistributedBarrier.java
index a870367..f43a943 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/barriers/TestDistributedBarrier.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/barriers/TestDistributedBarrier.java
@@ -18,6 +18,8 @@
  */
 package org.apache.curator.framework.recipes.barriers;
 
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import com.google.common.collect.Lists;
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.utils.CloseableUtils;
@@ -25,8 +27,8 @@
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.zookeeper.KeeperException;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
@@ -66,7 +68,7 @@
 
             barrier.waitOnBarrier(TIMEOUT * 2, TimeUnit.SECONDS);
             future.get();
-            Assert.fail();
+            fail();
         }
         catch ( KeeperException.ConnectionLossException expected )
         {
@@ -159,7 +161,7 @@
             client.start();
 
             final DistributedBarrier      barrier = new DistributedBarrier(client, "/barrier");
-            Assert.assertTrue(barrier.waitOnBarrier(10, TimeUnit.SECONDS));
+            assertTrue(barrier.waitOnBarrier(10, TimeUnit.SECONDS));
 
             // just for grins, test the infinite wait
             ExecutorService         service = Executors.newSingleThreadExecutor();
@@ -175,7 +177,7 @@
                     }
                 }
             );
-            Assert.assertTrue(future.get(10, TimeUnit.SECONDS) != null);
+            assertTrue(future.get(10, TimeUnit.SECONDS) != null);
         }
         finally
         {
@@ -209,7 +211,7 @@
                 }
             );
 
-            Assert.assertTrue(barrier.waitOnBarrier(10, TimeUnit.SECONDS));
+            assertTrue(barrier.waitOnBarrier(10, TimeUnit.SECONDS));
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/barriers/TestDistributedDoubleBarrier.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/barriers/TestDistributedDoubleBarrier.java
index 24fd3cb..aa4aaa6 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/barriers/TestDistributedDoubleBarrier.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/barriers/TestDistributedDoubleBarrier.java
@@ -18,6 +18,8 @@
  */
 package org.apache.curator.framework.recipes.barriers;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Lists;
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.utils.CloseableUtils;
@@ -25,8 +27,8 @@
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.Timing;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.io.Closeable;
 import java.util.List;
 import java.util.concurrent.Callable;
@@ -68,7 +70,7 @@
                             client.start();
                             DistributedDoubleBarrier        barrier = new DistributedDoubleBarrier(client, "/barrier", QTY);
 
-                            Assert.assertTrue(barrier.enter(timing.seconds(), TimeUnit.SECONDS));
+                            assertTrue(barrier.enter(timing.seconds(), TimeUnit.SECONDS));
 
                             synchronized(TestDistributedDoubleBarrier.this)
                             {
@@ -80,15 +82,15 @@
                             }
 
                             postEnterLatch.countDown();
-                            Assert.assertTrue(timing.awaitLatch(postEnterLatch));
+                            assertTrue(timing.awaitLatch(postEnterLatch));
 
-                            Assert.assertEquals(count.get(), QTY);
+                            assertEquals(count.get(), QTY);
 
-                            Assert.assertTrue(barrier.leave(timing.seconds(), TimeUnit.SECONDS));
+                            assertTrue(barrier.leave(timing.seconds(), TimeUnit.SECONDS));
                             count.decrementAndGet();
 
                             postLeaveLatch.countDown();
-                            Assert.assertTrue(timing.awaitLatch(postEnterLatch));
+                            assertTrue(timing.awaitLatch(postEnterLatch));
                         }
                         finally
                         {
@@ -106,8 +108,8 @@
         {
             f.get();
         }
-        Assert.assertEquals(count.get(), 0);
-        Assert.assertEquals(max.get(), QTY);
+        assertEquals(count.get(), 0);
+        assertEquals(max.get(), QTY);
     }
 
     @Test
@@ -138,19 +140,19 @@
                                 protected List<String> getChildrenForEntering() throws Exception
                                 {
                                     semaphore.release();
-                                    Assert.assertTrue(timing.awaitLatch(latch));
+                                    assertTrue(timing.awaitLatch(latch));
                                     return super.getChildrenForEntering();
                                 }
                             };
-                            Assert.assertTrue(barrier.enter(timing.seconds(), TimeUnit.SECONDS));
-                            Assert.assertTrue(barrier.leave(timing.seconds(), TimeUnit.SECONDS));
+                            assertTrue(barrier.enter(timing.seconds(), TimeUnit.SECONDS));
+                            assertTrue(barrier.leave(timing.seconds(), TimeUnit.SECONDS));
                             return null;
                         }
                     }
                 );
             }
 
-            Assert.assertTrue(semaphore.tryAcquire(QTY + 1, timing.seconds(), TimeUnit.SECONDS));   // wait until all QTY+1 barriers are trying to enter
+            assertTrue(semaphore.tryAcquire(QTY + 1, timing.seconds(), TimeUnit.SECONDS));   // wait until all QTY+1 barriers are trying to enter
             latch.countDown();
 
             for ( int i = 0; i < (QTY + 1); ++i )
@@ -193,7 +195,7 @@
                         {
                             DistributedDoubleBarrier        barrier = new DistributedDoubleBarrier(client, "/barrier", QTY);
 
-                            Assert.assertTrue(barrier.enter(timing.seconds(), TimeUnit.SECONDS));
+                            assertTrue(barrier.enter(timing.seconds(), TimeUnit.SECONDS));
 
                             synchronized(TestDistributedDoubleBarrier.this)
                             {
@@ -205,15 +207,15 @@
                             }
 
                             postEnterLatch.countDown();
-                            Assert.assertTrue(timing.awaitLatch(postEnterLatch));
+                            assertTrue(timing.awaitLatch(postEnterLatch));
 
-                            Assert.assertEquals(count.get(), QTY);
+                            assertEquals(count.get(), QTY);
 
-                            Assert.assertTrue(barrier.leave(10, TimeUnit.SECONDS));
+                            assertTrue(barrier.leave(10, TimeUnit.SECONDS));
                             count.decrementAndGet();
 
                             postLeaveLatch.countDown();
-                            Assert.assertTrue(timing.awaitLatch(postLeaveLatch));
+                            assertTrue(timing.awaitLatch(postLeaveLatch));
 
                             return null;
                         }
@@ -226,8 +228,8 @@
             {
                 f.get();
             }
-            Assert.assertEquals(count.get(), 0);
-            Assert.assertEquals(max.get(), QTY);
+            assertEquals(count.get(), 0);
+            assertEquals(max.get(), QTY);
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/BaseTestTreeCache.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/BaseTestTreeCache.java
index dfeb2ff..2a5adf6 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/BaseTestTreeCache.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/BaseTestTreeCache.java
@@ -27,14 +27,21 @@
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.test.Timing;
 import org.apache.curator.utils.CloseableUtils;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 public class BaseTestTreeCache extends BaseClassForTests
 {
     CuratorFramework client;
@@ -96,7 +103,7 @@
     }
 
     @Override
-    @BeforeMethod(alwaysRun = true)
+    @BeforeEach
     public void setup() throws Exception
     {
         super.setup();
@@ -111,14 +118,14 @@
     }
 
     @Override
-    @AfterMethod(alwaysRun = true)
+    @AfterEach
     public void teardown() throws Exception
     {
         try
         {
             try
             {
-                Assert.assertFalse(hadBackgroundException.get(), "Background exceptions were thrown, see stderr for details");
+                assertFalse(hadBackgroundException.get(), "Background exceptions were thrown, see stderr for details");
                 assertNoMoreEvents();
             }
             finally
@@ -139,7 +146,7 @@
     void assertNoMoreEvents() throws InterruptedException
     {
         timing.sleepABit();
-        Assert.assertTrue(events.isEmpty(), String.format("Expected no events, found %d; first event: %s", events.size(), events.peek()));
+        assertTrue(events.isEmpty(), String.format("Expected no events, found %d; first event: %s", events.size(), events.peek()));
     }
 
     /**
@@ -169,7 +176,7 @@
     TreeCacheEvent assertEvent(TreeCacheEvent.Type expectedType, String expectedPath, byte[] expectedData, boolean ignoreConnectionEvents) throws InterruptedException
     {
         TreeCacheEvent event = events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS);
-        Assert.assertNotNull(event, String.format("Expected type: %s, path: %s", expectedType, expectedPath));
+        assertNotNull(event, String.format("Expected type: %s, path: %s", expectedType, expectedPath));
         if ( ignoreConnectionEvents )
         {
             if ( (event.getType() == TreeCacheEvent.Type.CONNECTION_SUSPENDED) || (event.getType() == TreeCacheEvent.Type.CONNECTION_LOST) || (event.getType() == TreeCacheEvent.Type.CONNECTION_RECONNECTED) )
@@ -179,28 +186,28 @@
         }
 
         String message = event.toString();
-        Assert.assertEquals(event.getType(), expectedType, message);
+        assertEquals(event.getType(), expectedType, message);
         if ( expectedPath == null )
         {
-            Assert.assertNull(event.getData(), message);
+            assertNull(event.getData(), message);
         }
         else
         {
-            Assert.assertNotNull(event.getData(), message);
-            Assert.assertEquals(event.getData().getPath(), expectedPath, message);
+            assertNotNull(event.getData(), message);
+            assertEquals(event.getData().getPath(), expectedPath, message);
         }
         if ( expectedData != null )
         {
-            Assert.assertEquals(event.getData().getData(), expectedData, message);
+            assertArrayEquals(event.getData().getData(), expectedData, message);
         }
 
         if ( event.getType() == TreeCacheEvent.Type.NODE_UPDATED)
         {
-            Assert.assertNotNull(event.getOldData());
+            assertNotNull(event.getOldData());
         }
         else
         {
-            Assert.assertNull(event.getOldData());
+            assertNull(event.getOldData());
         }
 
         return event;
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCache.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCache.java
index 993a4c9..2667213 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCache.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCache.java
@@ -19,20 +19,23 @@
 
 package org.apache.curator.framework.recipes.cache;
 
+import static org.apache.curator.framework.recipes.cache.CuratorCache.Options.DO_NOT_CLEAR_ON_CLOSE;
+import static org.apache.curator.framework.recipes.cache.CuratorCacheListener.builder;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.compatibility.CuratorTestBase;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import static org.apache.curator.framework.recipes.cache.CuratorCache.Options.DO_NOT_CLEAR_ON_CLOSE;
-import static org.apache.curator.framework.recipes.cache.CuratorCacheListener.builder;
-
-@Test(groups = CuratorTestBase.zk36Group)
+@Tag(CuratorTestBase.zk36Group)
 public class TestCuratorCache extends CuratorTestBase
 {
     @Test
@@ -52,10 +55,10 @@
                 cache.start();
 
                 client.create().forPath("/test/foo", "first".getBytes());
-                Assert.assertTrue(timing.awaitLatch(addedLatch));
+                assertTrue(timing.awaitLatch(addedLatch));
 
                 client.setData().forPath("/test/foo", "something new".getBytes());
-                Assert.assertTrue(timing.awaitLatch(updatedLatch));
+                assertTrue(timing.awaitLatch(updatedLatch));
             }
         }
     }
@@ -90,14 +93,14 @@
                 };
                 cache.listenable().addListener(builder().forAll(listener).afterInitialized().build());
                 cache.start();
-                Assert.assertTrue(timing.awaitLatch(initializedLatch));
+                assertTrue(timing.awaitLatch(initializedLatch));
 
-                Assert.assertEquals(initializedLatch.getCount(), 0);
-                Assert.assertEquals(cache.size(), 4);
-                Assert.assertTrue(cache.get("/test").isPresent());
-                Assert.assertTrue(cache.get("/test/one").isPresent());
-                Assert.assertTrue(cache.get("/test/one/two").isPresent());
-                Assert.assertTrue(cache.get("/test/one/two/three").isPresent());
+                assertEquals(initializedLatch.getCount(), 0);
+                assertEquals(cache.size(), 4);
+                assertTrue(cache.get("/test").isPresent());
+                assertTrue(cache.get("/test/one").isPresent());
+                assertTrue(cache.get("/test/one/two").isPresent());
+                assertTrue(cache.get("/test/one/two/three").isPresent());
             }
         }
     }
@@ -121,25 +124,25 @@
                 cache.start();
 
                 client.create().forPath("/test");
-                Assert.assertTrue(timing.acquireSemaphore(all, 1));
-                Assert.assertTrue(timing.acquireSemaphore(creates, 1));
-                Assert.assertTrue(timing.acquireSemaphore(createsAndChanges, 1));
-                Assert.assertEquals(changes.availablePermits(), 0);
-                Assert.assertEquals(deletes.availablePermits(), 0);
+                assertTrue(timing.acquireSemaphore(all, 1));
+                assertTrue(timing.acquireSemaphore(creates, 1));
+                assertTrue(timing.acquireSemaphore(createsAndChanges, 1));
+                assertEquals(changes.availablePermits(), 0);
+                assertEquals(deletes.availablePermits(), 0);
 
                 client.setData().forPath("/test", "new".getBytes());
-                Assert.assertTrue(timing.acquireSemaphore(all, 1));
-                Assert.assertTrue(timing.acquireSemaphore(changes, 1));
-                Assert.assertTrue(timing.acquireSemaphore(createsAndChanges, 1));
-                Assert.assertEquals(creates.availablePermits(), 0);
-                Assert.assertEquals(deletes.availablePermits(), 0);
+                assertTrue(timing.acquireSemaphore(all, 1));
+                assertTrue(timing.acquireSemaphore(changes, 1));
+                assertTrue(timing.acquireSemaphore(createsAndChanges, 1));
+                assertEquals(creates.availablePermits(), 0);
+                assertEquals(deletes.availablePermits(), 0);
 
                 client.delete().forPath("/test");
-                Assert.assertTrue(timing.acquireSemaphore(all, 1));
-                Assert.assertTrue(timing.acquireSemaphore(deletes, 1));
-                Assert.assertEquals(creates.availablePermits(), 0);
-                Assert.assertEquals(changes.availablePermits(), 0);
-                Assert.assertEquals(createsAndChanges.availablePermits(), 0);
+                assertTrue(timing.acquireSemaphore(all, 1));
+                assertTrue(timing.acquireSemaphore(deletes, 1));
+                assertEquals(creates.availablePermits(), 0);
+                assertEquals(changes.availablePermits(), 0);
+                assertEquals(createsAndChanges.availablePermits(), 0);
             }
         }
     }
@@ -161,7 +164,7 @@
                 client.create().forPath("/test/bar", "bar".getBytes());
                 timing.sleepABit();
             }
-            Assert.assertEquals(storage.size(), 2);
+            assertEquals(storage.size(), 2);
 
             try ( CuratorCache cache = CuratorCache.build(client, "/test") )
             {
@@ -170,7 +173,7 @@
 
                 timing.sleepABit();
             }
-            Assert.assertEquals(storage.size(), 0);
+            assertEquals(storage.size(), 0);
         }
     }
 }
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheBridge.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheBridge.java
index b663ff2..1c0f8cd 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheBridge.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheBridge.java
@@ -19,13 +19,15 @@
 
 package org.apache.curator.framework.recipes.cache;
 
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.utils.Compatibility;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
 
 public class TestCuratorCacheBridge extends CuratorTestBase
 {
@@ -37,13 +39,13 @@
             CuratorCacheBridge cache = CuratorCache.bridgeBuilder(client, "/foo").build();
             if ( Compatibility.hasPersistentWatchers() )
             {
-                Assert.assertTrue(cache instanceof CuratorCacheImpl);
-                Assert.assertTrue(cache.isCuratorCache());
+                assertTrue(cache instanceof CuratorCacheImpl);
+                assertTrue(cache.isCuratorCache());
             }
             else
             {
-                Assert.assertTrue(cache instanceof CompatibleCuratorCacheBridge);
-                Assert.assertFalse(cache.isCuratorCache());
+                assertTrue(cache instanceof CompatibleCuratorCacheBridge);
+                assertFalse(cache.isCuratorCache());
             }
         }
     }
@@ -55,8 +57,8 @@
         try (CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)))
         {
             CuratorCacheBridge cache = CuratorCache.bridgeBuilder(client, "/foo").build();
-            Assert.assertTrue(cache instanceof CompatibleCuratorCacheBridge);
-            Assert.assertFalse(cache.isCuratorCache());
+            assertTrue(cache instanceof CompatibleCuratorCacheBridge);
+            assertFalse(cache.isCuratorCache());
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheConsistency.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheConsistency.java
index 6cf51d8..2f9eb52 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheConsistency.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheConsistency.java
@@ -19,6 +19,10 @@
 
 package org.apache.curator.framework.recipes.cache;
 
+import static org.apache.curator.framework.recipes.cache.CuratorCache.Options.DO_NOT_CLEAR_ON_CLOSE;
+import static org.apache.curator.framework.recipes.cache.CuratorCacheListener.builder;
+import static org.junit.jupiter.api.Assertions.fail;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.ExponentialBackoffRetry;
@@ -26,10 +30,10 @@
 import org.apache.curator.test.TestingCluster;
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.utils.ZKPaths;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.Test;
 import java.io.Closeable;
 import java.time.Duration;
 import java.time.Instant;
@@ -45,14 +49,11 @@
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
-import static org.apache.curator.framework.recipes.cache.CuratorCache.Options.DO_NOT_CLEAR_ON_CLOSE;
-import static org.apache.curator.framework.recipes.cache.CuratorCacheListener.builder;
-
 /**
  * Randomly create nodes in a tree while a set of CuratorCaches listens. Afterwards, validate
  * that the caches contain the same values as ZK itself
  */
-@Test(groups = CuratorTestBase.zk36Group)
+@Tag(CuratorTestBase.zk36Group)
 public class TestCuratorCacheConsistency extends CuratorTestBase
 {
     private final Logger log = LoggerFactory.getLogger(getClass());
@@ -166,7 +167,7 @@
                 log.error("");
             });
 
-            Assert.fail("Errors found");
+            fail("Errors found");
         }
     }
 
@@ -192,7 +193,7 @@
         }
         catch ( Exception e )
         {
-            Assert.fail("", e);
+            fail("", e);
         }
     }
 
@@ -229,7 +230,7 @@
             Exception errorSignalException = errorSignal.get();
             if ( errorSignalException != null )
             {
-                Assert.fail("A client's error handler was called", errorSignalException);
+                fail("A client's error handler was called", errorSignalException);
             }
 
             Duration elapsedFromLastServerKill = Duration.between(lastServerKill, Instant.now());
@@ -267,7 +268,7 @@
         }
         catch ( Exception e )
         {
-            Assert.fail("Could not create/set: " + thisPath);
+            fail("Could not create/set: " + thisPath);
         }
     }
 
@@ -283,7 +284,7 @@
         }
         catch ( Exception e )
         {
-            Assert.fail("Could not delete: " + thisPath);
+            fail("Could not delete: " + thisPath);
         }
     }
 
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheEdges.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheEdges.java
index 2573bf6..ba588af 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheEdges.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheEdges.java
@@ -19,6 +19,11 @@
 
 package org.apache.curator.framework.recipes.cache;
 
+import static org.apache.curator.framework.recipes.cache.CuratorCache.Options.DO_NOT_CLEAR_ON_CLOSE;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.state.ConnectionState;
@@ -26,13 +31,12 @@
 import org.apache.curator.test.InstanceSpec;
 import org.apache.curator.test.TestingCluster;
 import org.apache.curator.test.compatibility.CuratorTestBase;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.CountDownLatch;
 
-import static org.apache.curator.framework.recipes.cache.CuratorCache.Options.DO_NOT_CLEAR_ON_CLOSE;
-
-@Test(groups = CuratorTestBase.zk36Group)
+@Tag(CuratorTestBase.zk36Group)
 public class TestCuratorCacheEdges extends CuratorTestBase
 {
     @Test
@@ -59,7 +63,7 @@
                 CountDownLatch latch = new CountDownLatch(1);
                 cache.listenable().addListener(CuratorCacheListener.builder().forInitialized(latch::countDown).build());
                 cache.start();
-                Assert.assertTrue(timing.awaitLatch(latch));
+                assertTrue(timing.awaitLatch(latch));
             }
 
             // we now have a storage loaded with the initial nodes created
@@ -83,21 +87,21 @@
                 CountDownLatch latch = new CountDownLatch(1);
                 cache.listenable().addListener(CuratorCacheListener.builder().forInitialized(latch::countDown).build());
                 cache.start();
-                Assert.assertTrue(timing.awaitLatch(latch));
+                assertTrue(timing.awaitLatch(latch));
             }
 
-            Assert.assertEquals(storage.size(), 11);
-            Assert.assertEquals(storage.get("/root").map(ChildData::getData).orElse(null), second);
-            Assert.assertEquals(storage.get("/root/1").map(ChildData::getData).orElse(null), first);
-            Assert.assertEquals(storage.get("/root/1/11").map(ChildData::getData).orElse(null), first);
-            Assert.assertEquals(storage.get("/root/1/11/111").map(ChildData::getData).orElse(null), second);
-            Assert.assertEquals(storage.get("/root/1/11/111/1111").map(ChildData::getData).orElse(null), second);
-            Assert.assertEquals(storage.get("/root/1/11/111/1112").map(ChildData::getData).orElse(null), second);
-            Assert.assertEquals(storage.get("/root/1/12").map(ChildData::getData).orElse(null), first);
-            Assert.assertEquals(storage.get("/root/1/13").map(ChildData::getData).orElse(null), first);
-            Assert.assertEquals(storage.get("/root/1/13/131").map(ChildData::getData).orElse(null), second);
-            Assert.assertEquals(storage.get("/root/1/13/132").map(ChildData::getData).orElse(null), second);
-            Assert.assertEquals(storage.get("/root/1/13/132/1321").map(ChildData::getData).orElse(null), second);
+            assertEquals(storage.size(), 11);
+            assertArrayEquals(storage.get("/root").map(ChildData::getData).orElse(null), second);
+            assertArrayEquals(storage.get("/root/1").map(ChildData::getData).orElse(null), first);
+            assertArrayEquals(storage.get("/root/1/11").map(ChildData::getData).orElse(null), first);
+            assertArrayEquals(storage.get("/root/1/11/111").map(ChildData::getData).orElse(null), second);
+            assertArrayEquals(storage.get("/root/1/11/111/1111").map(ChildData::getData).orElse(null), second);
+            assertArrayEquals(storage.get("/root/1/11/111/1112").map(ChildData::getData).orElse(null), second);
+            assertArrayEquals(storage.get("/root/1/12").map(ChildData::getData).orElse(null), first);
+            assertArrayEquals(storage.get("/root/1/13").map(ChildData::getData).orElse(null), first);
+            assertArrayEquals(storage.get("/root/1/13/131").map(ChildData::getData).orElse(null), second);
+            assertArrayEquals(storage.get("/root/1/13/132").map(ChildData::getData).orElse(null), second);
+            assertArrayEquals(storage.get("/root/1/13/132/1321").map(ChildData::getData).orElse(null), second);
         }
     }
 
@@ -131,16 +135,16 @@
                     client.create().forPath("/test/two");
                     client.create().forPath("/test/three");
 
-                    Assert.assertTrue(timing.awaitLatch(latch));
+                    assertTrue(timing.awaitLatch(latch));
 
                     InstanceSpec connectionInstance = cluster.findConnectionInstance(client.getZookeeperClient().getZooKeeper());
                     cluster.killServer(connectionInstance);
 
-                    Assert.assertTrue(timing.awaitLatch(reconnectLatch));
+                    assertTrue(timing.awaitLatch(reconnectLatch));
 
                     timing.sleepABit();
 
-                    Assert.assertEquals(cache.stream().count(), 4);
+                    assertEquals(cache.stream().count(), 4);
                 }
             }
         }
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheEventOrdering.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheEventOrdering.java
index 2f86040..d212116 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheEventOrdering.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheEventOrdering.java
@@ -20,10 +20,10 @@
 
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.test.compatibility.CuratorTestBase;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
 import java.util.concurrent.BlockingQueue;
 
-@Test(groups = CuratorTestBase.zk36Group)
+@Tag(CuratorTestBase.zk36Group)
 public class TestCuratorCacheEventOrdering extends TestEventOrdering<CuratorCache>
 {
     @Override
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheWrappers.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheWrappers.java
index a757054..056e9cc 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheWrappers.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestCuratorCacheWrappers.java
@@ -19,13 +19,22 @@
 
 package org.apache.curator.framework.recipes.cache;
 
+import static org.apache.curator.framework.recipes.cache.CuratorCache.Options.SINGLE_NODE_CACHE;
+import static org.apache.curator.framework.recipes.cache.CuratorCacheAccessor.parentPathFilter;
+import static org.apache.curator.framework.recipes.cache.CuratorCacheListener.builder;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import com.google.common.collect.ImmutableSet;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.compatibility.CuratorTestBase;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.util.AbstractMap;
 import java.util.Map;
 import java.util.concurrent.BlockingQueue;
@@ -35,13 +44,9 @@
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-
-import static org.apache.curator.framework.recipes.cache.CuratorCache.Options.SINGLE_NODE_CACHE;
-import static org.apache.curator.framework.recipes.cache.CuratorCacheAccessor.parentPathFilter;
-import static org.apache.curator.framework.recipes.cache.CuratorCacheListener.builder;
 import java.util.concurrent.CopyOnWriteArrayList;
 
-@Test(groups = CuratorTestBase.zk36Group)
+@Tag(CuratorTestBase.zk36Group)
 public class TestCuratorCacheWrappers extends CuratorTestBase
 {
     @Test
@@ -67,14 +72,14 @@
                 cache.start();
 
                 client.create().forPath("/test/one", "hey there".getBytes());
-                Assert.assertEquals(events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_ADDED);
+                assertEquals(events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_ADDED);
 
                 client.setData().forPath("/test/one", "sup!".getBytes());
-                Assert.assertEquals(events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_UPDATED);
-                Assert.assertEquals(new String(cache.get("/test/one").orElseThrow(AssertionError::new).getData()), "sup!");
+                assertEquals(events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_UPDATED);
+                assertEquals(new String(cache.get("/test/one").orElseThrow(AssertionError::new).getData()), "sup!");
 
                 client.delete().forPath("/test/one");
-                Assert.assertEquals(events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_REMOVED);
+                assertEquals(events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_REMOVED);
 
                 // Please note that there is not guarantee on the order of events
                 // For instance INITIALIZED event can appear in the middle of the observed sequence.
@@ -83,16 +88,16 @@
                         case CHILD_ADDED:
                         case CHILD_REMOVED:
                         case CHILD_UPDATED:
-                            Assert.assertEquals("/test/one", event.getData().getPath());
+                            assertEquals("/test/one", event.getData().getPath());
                             break;
                         case INITIALIZED:
-                            Assert.assertNull(event.getData());
+                            assertNull(event.getData());
                             break;
                         default:
-                            Assert.fail();
+                            fail();
                     }
                 }
-                Assert.assertEquals(eventsTrace.size(), 4);
+                assertEquals(eventsTrace.size(), 4);
             }
         }
     }
@@ -113,26 +118,26 @@
 
                 treeCacheBase.assertEvent(TreeCacheEvent.Type.NODE_ADDED, "/test");
                 treeCacheBase.assertEvent(TreeCacheEvent.Type.INITIALIZED);
-                Assert.assertEquals(toMap(cache.stream().filter(parentPathFilter("/test"))).keySet(), ImmutableSet.of());
-                Assert.assertEquals(cache.stream().filter(parentPathFilter("/t")).count(), 0);
-                Assert.assertEquals(cache.stream().filter(parentPathFilter("/testing")).count(), 0);
+                assertEquals(toMap(cache.stream().filter(parentPathFilter("/test"))).keySet(), ImmutableSet.of());
+                assertEquals(cache.stream().filter(parentPathFilter("/t")).count(), 0);
+                assertEquals(cache.stream().filter(parentPathFilter("/testing")).count(), 0);
 
                 client.create().forPath("/test/one", "hey there".getBytes());
                 treeCacheBase.assertEvent(TreeCacheEvent.Type.NODE_ADDED, "/test/one");
-                Assert.assertEquals(toMap(cache.stream().filter(parentPathFilter("/test"))).keySet(), ImmutableSet.of("/test/one"));
-                Assert.assertEquals(new String(cache.get("/test/one").orElseThrow(AssertionError::new).getData()), "hey there");
-                Assert.assertEquals(toMap(cache.stream().filter(parentPathFilter("/test/one"))).keySet(), ImmutableSet.of());
-                Assert.assertEquals(cache.stream().filter(parentPathFilter("/test/o")).count(), 0);
-                Assert.assertEquals(cache.stream().filter(parentPathFilter("/test/onely")).count(), 0);
+                assertEquals(toMap(cache.stream().filter(parentPathFilter("/test"))).keySet(), ImmutableSet.of("/test/one"));
+                assertEquals(new String(cache.get("/test/one").orElseThrow(AssertionError::new).getData()), "hey there");
+                assertEquals(toMap(cache.stream().filter(parentPathFilter("/test/one"))).keySet(), ImmutableSet.of());
+                assertEquals(cache.stream().filter(parentPathFilter("/test/o")).count(), 0);
+                assertEquals(cache.stream().filter(parentPathFilter("/test/onely")).count(), 0);
 
                 client.setData().forPath("/test/one", "sup!".getBytes());
                 treeCacheBase.assertEvent(TreeCacheEvent.Type.NODE_UPDATED, "/test/one");
-                Assert.assertEquals(toMap(cache.stream().filter(parentPathFilter("/test"))).keySet(), ImmutableSet.of("/test/one"));
-                Assert.assertEquals(new String(cache.get("/test/one").orElseThrow(AssertionError::new).getData()), "sup!");
+                assertEquals(toMap(cache.stream().filter(parentPathFilter("/test"))).keySet(), ImmutableSet.of("/test/one"));
+                assertEquals(new String(cache.get("/test/one").orElseThrow(AssertionError::new).getData()), "sup!");
 
                 client.delete().forPath("/test/one");
                 treeCacheBase.assertEvent(TreeCacheEvent.Type.NODE_REMOVED, "/test/one", "sup!".getBytes());
-                Assert.assertEquals(toMap(cache.stream().filter(parentPathFilter("/test"))).keySet(), ImmutableSet.of());
+                assertEquals(toMap(cache.stream().filter(parentPathFilter("/test"))).keySet(), ImmutableSet.of());
             }
         }
     }
@@ -155,7 +160,7 @@
                 try
                 {
                     getRootData.get();
-                    Assert.fail("Should have thrown");
+                    fail("Should have thrown");
                 }
                 catch ( AssertionError expected )
                 {
@@ -163,19 +168,19 @@
                 }
 
                 client.create().forPath("/test/node", "a".getBytes());
-                Assert.assertTrue(timing.acquireSemaphore(semaphore));
-                Assert.assertEquals(getRootData.get().getData(), "a".getBytes());
+                assertTrue(timing.acquireSemaphore(semaphore));
+                assertArrayEquals(getRootData.get().getData(), "a".getBytes());
 
                 client.setData().forPath("/test/node", "b".getBytes());
-                Assert.assertTrue(timing.acquireSemaphore(semaphore));
-                Assert.assertEquals(getRootData.get().getData(), "b".getBytes());
+                assertTrue(timing.acquireSemaphore(semaphore));
+                assertArrayEquals(getRootData.get().getData(), "b".getBytes());
 
                 client.delete().forPath("/test/node");
-                Assert.assertTrue(timing.acquireSemaphore(semaphore));
+                assertTrue(timing.acquireSemaphore(semaphore));
                 try
                 {
                     getRootData.get();
-                    Assert.fail("Should have thrown");
+                    fail("Should have thrown");
                 }
                 catch ( AssertionError expected )
                 {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestEventOrdering.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestEventOrdering.java
index 3d369e1..d039fa1 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestEventOrdering.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestEventOrdering.java
@@ -18,6 +18,8 @@
  */
 package org.apache.curator.framework.recipes.cache;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Queues;
 import org.apache.curator.framework.CuratorFramework;
@@ -27,8 +29,8 @@
 import org.apache.curator.test.compatibility.Timing2;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.zookeeper.KeeperException;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.io.Closeable;
 import java.util.List;
 import java.util.Random;
@@ -135,7 +137,7 @@
                 };
                 executorService.submit(wrapped);
             }
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
 
             timing.sleepABit();
 
@@ -148,7 +150,7 @@
                 eventSuggestedQty += (event.eventType == EventType.ADDED) ? 1 : -1;
             }
             int actualQty = getActualQty(cache);
-            Assert.assertEquals(actualQty, eventSuggestedQty, String.format("actual %s expected %s:\n %s", actualQty, eventSuggestedQty, asString(localEvents)));
+            assertEquals(actualQty, eventSuggestedQty, String.format("actual %s expected %s:\n %s", actualQty, eventSuggestedQty, asString(localEvents)));
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestNodeCache.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestNodeCache.java
index bed4606..28a53da 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestNodeCache.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestNodeCache.java
@@ -18,6 +18,13 @@
  */
 package org.apache.curator.framework.recipes.cache;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
 import org.apache.curator.framework.imps.TestCleanState;
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.test.compatibility.CuratorTestBase;
@@ -28,8 +35,9 @@
 import org.apache.curator.framework.api.UnhandledErrorListener;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.Timing;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.Callable;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Exchanger;
@@ -40,7 +48,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 
-@Test(groups = CuratorTestBase.zk35TestCompatibilityGroup)
+@Tag(CuratorTestBase.zk35TestCompatibilityGroup)
 public class TestNodeCache extends BaseClassForTests
 {
     @Test
@@ -81,20 +89,20 @@
             );
             cache.start(true);
 
-            Assert.assertEquals(cache.getCurrentData().getData(), "one".getBytes());
+            assertArrayEquals(cache.getCurrentData().getData(), "one".getBytes());
 
             client.delete().forPath("/test/foo");
-            Assert.assertTrue(semaphore.tryAcquire(1, 10, TimeUnit.SECONDS));
+            assertTrue(semaphore.tryAcquire(1, 10, TimeUnit.SECONDS));
             client.create().forPath("/test/foo", "two".getBytes());
-            Assert.assertTrue(semaphore.tryAcquire(1, 10, TimeUnit.SECONDS));
+            assertTrue(semaphore.tryAcquire(1, 10, TimeUnit.SECONDS));
 
             Throwable t = error.get();
             if ( t != null )
             {
-                Assert.fail("Assert", t);
+                fail("Assert", t);
             }
 
-            Assert.assertEquals(cache.getCurrentData().getData(), "two".getBytes());
+            assertArrayEquals(cache.getCurrentData().getData(), "two".getBytes());
 
             cache.close();
         }
@@ -147,7 +155,7 @@
                         client.setData().forPath("/test/snafu", "other".getBytes());
 
                         ChildData       currentData = finalCache.getCurrentData();
-                        Assert.assertNotNull(currentData);
+                        assertNotNull(currentData);
 
                         finalCache.rebuildTestExchanger.exchange(new Object(), timing2.forWaiting().seconds(), TimeUnit.SECONDS);
 
@@ -158,9 +166,9 @@
             cache.start(false);
             future.get();
 
-            Assert.assertTrue(timing2.awaitLatch(latch));
-            Assert.assertNotNull(cache.getCurrentData());
-            Assert.assertEquals(cache.getCurrentData().getData(), "other".getBytes());
+            assertTrue(timing2.awaitLatch(latch));
+            assertNotNull(cache.getCurrentData());
+            assertArrayEquals(cache.getCurrentData().getData(), "other".getBytes());
         }
         finally
         {
@@ -200,10 +208,10 @@
             client.getZookeeperClient().getZooKeeper().getTestable().injectSessionExpiration();
             Thread.sleep(timing.multiple(1.5).session());
 
-            Assert.assertEquals(cache.getCurrentData().getData(), "start".getBytes());
+            assertArrayEquals(cache.getCurrentData().getData(), "start".getBytes());
 
             client.setData().forPath("/test/node", "new data".getBytes());
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
         }
         finally
         {
@@ -239,19 +247,19 @@
                 }
             );
 
-            Assert.assertNull(cache.getCurrentData());
+            assertNull(cache.getCurrentData());
 
             client.create().forPath("/test/node", "a".getBytes());
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
-            Assert.assertEquals(cache.getCurrentData().getData(), "a".getBytes());
+            assertTrue(timing.acquireSemaphore(semaphore));
+            assertArrayEquals(cache.getCurrentData().getData(), "a".getBytes());
 
             client.setData().forPath("/test/node", "b".getBytes());
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
-            Assert.assertEquals(cache.getCurrentData().getData(), "b".getBytes());
+            assertTrue(timing.acquireSemaphore(semaphore));
+            assertArrayEquals(cache.getCurrentData().getData(), "b".getBytes());
 
             client.delete().forPath("/test/node");
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
-            Assert.assertNull(cache.getCurrentData());
+            assertTrue(timing.acquireSemaphore(semaphore));
+            assertNull(cache.getCurrentData());
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestPathChildrenCache.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestPathChildrenCache.java
index 11a25fe..3790b34 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestPathChildrenCache.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestPathChildrenCache.java
@@ -19,6 +19,14 @@
 
 package org.apache.curator.framework.recipes.cache;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Queues;
 import org.apache.curator.framework.CuratorFramework;
@@ -36,16 +44,15 @@
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.util.List;
 import java.util.concurrent.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 
-import static org.testng.AssertJUnit.assertNotNull;
-
-@Test(groups = CuratorTestBase.zk35TestCompatibilityGroup)
+@Tag(CuratorTestBase.zk35TestCompatibilityGroup)
 public class TestPathChildrenCache extends BaseClassForTests
 {
     @Test
@@ -64,7 +71,7 @@
                     startedLatch.countDown();
                 }
             });
-            Assert.assertTrue(timing.awaitLatch(startedLatch));
+            assertTrue(timing.awaitLatch(startedLatch));
 
             final BlockingQueue<PathChildrenCacheEvent.Type> events = Queues.newLinkedBlockingQueue();
             PathChildrenCacheListener listener = new PathChildrenCacheListener()
@@ -77,23 +84,23 @@
             };
             cache.getListenable().addListener(listener);
             cache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);
-            Assert.assertEquals(events.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.INITIALIZED);
+            assertEquals(events.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.INITIALIZED);
 
             client.create().forPath("/a/b/test/one");
             client.create().forPath("/a/b/test/two");
-            Assert.assertEquals(events.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CHILD_ADDED);
-            Assert.assertEquals(events.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CHILD_ADDED);
+            assertEquals(events.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CHILD_ADDED);
+            assertEquals(events.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CHILD_ADDED);
 
             client.delete().forPath("/a/b/test/one");
             client.delete().forPath("/a/b/test/two");
             client.delete().forPath("/a/b/test");
-            Assert.assertEquals(events.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CHILD_REMOVED);
-            Assert.assertEquals(events.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CHILD_REMOVED);
+            assertEquals(events.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CHILD_REMOVED);
+            assertEquals(events.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CHILD_REMOVED);
 
             timing.sleepABit();
 
             client.create().creatingParentContainersIfNeeded().forPath("/a/b/test/new");
-            Assert.assertEquals(events.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CHILD_ADDED);
+            assertEquals(events.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CHILD_ADDED);
         }
         finally
         {
@@ -143,8 +150,8 @@
 
             cache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);
 
-            Assert.assertTrue(timing.awaitLatch(cacheInitialized));
-            Assert.assertEquals(cache.getCurrentData().size(), 0);
+            assertTrue(timing.awaitLatch(cacheInitialized));
+            assertEquals(cache.getCurrentData().size(), 0);
         }
         finally
         {
@@ -197,7 +204,7 @@
             };
             cache.getListenable().addListener(listener);
             cache.start();
-            Assert.assertTrue(timing.awaitLatch(ensurePathLatch));
+            assertTrue(timing.awaitLatch(ensurePathLatch));
 
             final CountDownLatch connectedLatch = new CountDownLatch(1);
             client.getConnectionStateListenable().addListener(new ConnectionStateListener()
@@ -215,15 +222,15 @@
 
             server = new TestingServer(serverPort, true);
 
-            Assert.assertTrue(timing.awaitLatch(connectedLatch));
+            assertTrue(timing.awaitLatch(connectedLatch));
 
             client.create().creatingParentContainersIfNeeded().forPath("/baz", new byte[]{1, 2, 3});
 
-            assertNotNull("/baz does not exist", client.checkExists().forPath("/baz"));
+            assertNotNull(client.checkExists().forPath("/baz"), "/baz does not exist");
 
-            Assert.assertTrue(timing.awaitLatch(addedLatch));
+            assertTrue(timing.awaitLatch(addedLatch));
 
-            assertNotNull("cache doesn't see /baz", cache.getCurrentData("/baz"));
+            assertNotNull(cache.getCurrentData("/baz"), "cache doesn't see /baz");
         }
         finally
         {
@@ -258,7 +265,7 @@
                     }
                 );
             cache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
         }
         finally
         {
@@ -296,11 +303,11 @@
             cache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);
 
             PathChildrenCacheEvent event = events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS);
-            Assert.assertEquals(event.getType(), PathChildrenCacheEvent.Type.CHILD_ADDED);
+            assertEquals(event.getType(), PathChildrenCacheEvent.Type.CHILD_ADDED);
 
             event = events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS);
-            Assert.assertEquals(event.getType(), PathChildrenCacheEvent.Type.INITIALIZED);
-            Assert.assertEquals(event.getInitialData().size(), 1);
+            assertEquals(event.getType(), PathChildrenCacheEvent.Type.INITIALIZED);
+            assertEquals(event.getInitialData().size(), 1);
         }
         finally
         {
@@ -349,12 +356,12 @@
 
             cache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);
 
-            Assert.assertTrue(timing.awaitLatch(addedLatch));
-            Assert.assertTrue(timing.awaitLatch(initLatch));
-            Assert.assertEquals(cache.getCurrentData().size(), 3);
-            Assert.assertEquals(cache.getCurrentData().get(0).getData(), "1".getBytes());
-            Assert.assertEquals(cache.getCurrentData().get(1).getData(), "2".getBytes());
-            Assert.assertEquals(cache.getCurrentData().get(2).getData(), "3".getBytes());
+            assertTrue(timing.awaitLatch(addedLatch));
+            assertTrue(timing.awaitLatch(initLatch));
+            assertEquals(cache.getCurrentData().size(), 3);
+            assertArrayEquals(cache.getCurrentData().get(0).getData(), "1".getBytes());
+            assertArrayEquals(cache.getCurrentData().get(1).getData(), "2".getBytes());
+            assertArrayEquals(cache.getCurrentData().get(2).getData(), "3".getBytes());
         }
         finally
         {
@@ -384,7 +391,7 @@
                         @Override
                         public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception
                         {
-                            Assert.assertNotEquals(event.getType(), PathChildrenCacheEvent.Type.INITIALIZED);
+                            assertNotEquals(event.getType(), PathChildrenCacheEvent.Type.INITIALIZED);
                             if ( event.getType() == PathChildrenCacheEvent.Type.CHILD_ADDED )
                             {
                                 addedLatch.countDown();
@@ -399,11 +406,11 @@
 
             cache.start(PathChildrenCache.StartMode.NORMAL);
 
-            Assert.assertTrue(timing.awaitLatch(addedLatch));
-            Assert.assertEquals(cache.getCurrentData().size(), 3);
-            Assert.assertEquals(cache.getCurrentData().get(0).getData(), "1".getBytes());
-            Assert.assertEquals(cache.getCurrentData().get(1).getData(), "2".getBytes());
-            Assert.assertEquals(cache.getCurrentData().get(2).getData(), "3".getBytes());
+            assertTrue(timing.awaitLatch(addedLatch));
+            assertEquals(cache.getCurrentData().size(), 3);
+            assertArrayEquals(cache.getCurrentData().get(0).getData(), "1".getBytes());
+            assertArrayEquals(cache.getCurrentData().get(1).getData(), "2".getBytes());
+            assertArrayEquals(cache.getCurrentData().get(2).getData(), "3".getBytes());
         }
         finally
         {
@@ -447,10 +454,10 @@
             cache.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE);
 
             client.create().forPath("/test/foo", "first".getBytes());
-            Assert.assertTrue(timing.awaitLatch(addedLatch));
+            assertTrue(timing.awaitLatch(addedLatch));
 
             client.setData().forPath("/test/foo", "something new".getBytes());
-            Assert.assertTrue(timing.awaitLatch(updatedLatch));
+            assertTrue(timing.awaitLatch(updatedLatch));
         }
         finally
         {
@@ -479,7 +486,7 @@
                 }
                 catch ( KeeperException.NoNodeException e )
                 {
-                    Assert.fail("Path should exist", e);
+                    fail("Path should exist", e);
                 }
             }
             timing.sleepABit();
@@ -529,13 +536,13 @@
                                 if ( event.getType() == PathChildrenCacheEvent.Type.CHILD_REMOVED )
                                 {
                                     removedLatch.countDown();
-                                    Assert.assertTrue(postRemovedLatch.await(10, TimeUnit.SECONDS));
+                                    assertTrue(postRemovedLatch.await(10, TimeUnit.SECONDS));
                                 }
                                 else
                                 {
                                     try
                                     {
-                                        Assert.assertEquals(event.getData().getData(), "two".getBytes());
+                                        assertArrayEquals(event.getData().getData(), "two".getBytes());
                                     }
                                     finally
                                     {
@@ -548,15 +555,15 @@
                 cache.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE);
 
                 client.delete().forPath("/test/foo");
-                Assert.assertTrue(timing.awaitLatch(removedLatch));
+                assertTrue(timing.awaitLatch(removedLatch));
                 client.create().forPath("/test/foo", "two".getBytes());
                 postRemovedLatch.countDown();
-                Assert.assertTrue(timing.awaitLatch(dataLatch));
+                assertTrue(timing.awaitLatch(dataLatch));
 
                 Throwable t = error.get();
                 if ( t != null )
                 {
-                    Assert.fail("Assert", t);
+                    fail("Assert", t);
                 }
             }
         }
@@ -622,7 +629,7 @@
                                 client.create().forPath("/test/test");
 
                                 List<ChildData> currentData = cache.getCurrentData();
-                                Assert.assertTrue(currentData.size() > 0);
+                                assertTrue(currentData.size() > 0);
 
                                 // simulate another process removing a node while we're rebuilding
                                 client.delete().forPath(currentData.get(0).getPath());
@@ -636,7 +643,7 @@
                                     childData = cache.getCurrentData("/test/snafu");
                                     Thread.sleep(1000);
                                 }
-                                Assert.assertEquals(childData.getData(), "original".getBytes());
+                                assertArrayEquals(childData.getData(), "original".getBytes());
                                 client.setData().forPath("/test/snafu", "grilled".getBytes());
 
                                 cache.rebuildTestExchanger.exchange(new Object());
@@ -648,10 +655,10 @@
                 cache.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE);
                 future.get();
 
-                Assert.assertTrue(timing.awaitLatch(addedLatch));
-                Assert.assertNotNull(cache.getCurrentData("/test/test"));
-                Assert.assertNull(cache.getCurrentData(deletedPath.get()));
-                Assert.assertEquals(cache.getCurrentData("/test/snafu").getData(), "grilled".getBytes());
+                assertTrue(timing.awaitLatch(addedLatch));
+                assertNotNull(cache.getCurrentData("/test/test"));
+                assertNull(cache.getCurrentData(deletedPath.get()));
+                assertArrayEquals(cache.getCurrentData("/test/snafu").getData(), "grilled".getBytes());
             }
         }
         finally
@@ -694,13 +701,13 @@
                 );
             cache.start();
 
-            Assert.assertTrue(timing.acquireSemaphore(semaphore, 3));
+            assertTrue(timing.acquireSemaphore(semaphore, 3));
 
             client.delete().forPath("/base/a");
-            Assert.assertTrue(timing.acquireSemaphore(semaphore, 1));
+            assertTrue(timing.acquireSemaphore(semaphore, 1));
 
             client.create().forPath("/base/a");
-            Assert.assertTrue(timing.acquireSemaphore(semaphore, 1));
+            assertTrue(timing.acquireSemaphore(semaphore, 1));
 
             List<PathChildrenCacheEvent.Type> expected = Lists.newArrayList
                 (
@@ -710,7 +717,7 @@
                     PathChildrenCacheEvent.Type.CHILD_REMOVED,
                     PathChildrenCacheEvent.Type.CHILD_ADDED
                 );
-            Assert.assertEquals(expected, events);
+            assertEquals(expected, events);
         }
         finally
         {
@@ -754,17 +761,17 @@
             cache.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE);
 
             client.delete().forPath("/base/a");
-            Assert.assertTrue(timing.acquireSemaphore(semaphore, 1));
+            assertTrue(timing.acquireSemaphore(semaphore, 1));
 
             client.create().forPath("/base/a");
-            Assert.assertTrue(timing.acquireSemaphore(semaphore, 1));
+            assertTrue(timing.acquireSemaphore(semaphore, 1));
 
             List<PathChildrenCacheEvent.Type> expected = Lists.newArrayList
                 (
                     PathChildrenCacheEvent.Type.CHILD_REMOVED,
                     PathChildrenCacheEvent.Type.CHILD_ADDED
                 );
-            Assert.assertEquals(expected, events);
+            assertEquals(expected, events);
         }
         finally
         {
@@ -820,12 +827,12 @@
                 );
 
             client.create().withMode(CreateMode.EPHEMERAL).forPath("/test/me", "data".getBytes());
-            Assert.assertTrue(timing.awaitLatch(childAddedLatch));
+            assertTrue(timing.awaitLatch(childAddedLatch));
 
             client.getZookeeperClient().getZooKeeper().getTestable().injectSessionExpiration();
-            Assert.assertTrue(timing.awaitLatch(lostLatch));
-            Assert.assertTrue(timing.awaitLatch(reconnectedLatch));
-            Assert.assertTrue(timing.awaitLatch(removedLatch));
+            assertTrue(timing.awaitLatch(lostLatch));
+            assertTrue(timing.awaitLatch(reconnectedLatch));
+            assertTrue(timing.awaitLatch(removedLatch));
         }
         finally
         {
@@ -885,13 +892,13 @@
             };
             cache.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE);
 
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
 
             int saveCounter = counter.get();
             client.setData().forPath("/test/one", "alt".getBytes());
             cache.rebuildNode("/test/one");
-            Assert.assertEquals(cache.getCurrentData("/test/one").getData(), "alt".getBytes());
-            Assert.assertEquals(saveCounter, counter.get());
+            assertArrayEquals(cache.getCurrentData("/test/one").getData(), "alt".getBytes());
+            assertEquals(saveCounter, counter.get());
 
             semaphore.release(1000);
             timing.sleepABit();
@@ -926,19 +933,19 @@
 
             client.create().forPath("/test/one", "one".getBytes());
             client.create().forPath("/test/two", "two".getBytes());
-            Assert.assertTrue(latch.await(10, TimeUnit.SECONDS));
+            assertTrue(latch.await(10, TimeUnit.SECONDS));
 
             for ( ChildData data : cache.getCurrentData() )
             {
                 if ( cacheData )
                 {
-                    Assert.assertNotNull(data.getData());
-                    Assert.assertNotNull(data.getStat());
+                    assertNotNull(data.getData());
+                    assertNotNull(data.getStat());
                 }
                 else
                 {
-                    Assert.assertNull(data.getData());
-                    Assert.assertNotNull(data.getStat());
+                    assertNull(data.getData());
+                    assertNotNull(data.getStat());
                 }
             }
         }
@@ -974,14 +981,14 @@
                 cache.start();
 
                 client.create().forPath("/test/one", "hey there".getBytes());
-                Assert.assertEquals(events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_ADDED);
+                assertEquals(events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_ADDED);
 
                 client.setData().forPath("/test/one", "sup!".getBytes());
-                Assert.assertEquals(events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_UPDATED);
-                Assert.assertEquals(new String(cache.getCurrentData("/test/one").getData()), "sup!");
+                assertEquals(events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_UPDATED);
+                assertEquals(new String(cache.getCurrentData("/test/one").getData()), "sup!");
 
                 client.delete().forPath("/test/one");
-                Assert.assertEquals(events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_REMOVED);
+                assertEquals(events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_REMOVED);
             }
         }
         finally
@@ -1040,18 +1047,18 @@
                     cache2.start();
 
                     client.create().forPath("/test/one", "hey there".getBytes());
-                    Assert.assertEquals(events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_ADDED);
-                    Assert.assertEquals(events2.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_ADDED);
+                    assertEquals(events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_ADDED);
+                    assertEquals(events2.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_ADDED);
 
                     client.setData().forPath("/test/one", "sup!".getBytes());
-                    Assert.assertEquals(events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_UPDATED);
-                    Assert.assertEquals(events2.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_UPDATED);
-                    Assert.assertEquals(new String(cache.getCurrentData("/test/one").getData()), "sup!");
-                    Assert.assertEquals(new String(cache2.getCurrentData("/test/one").getData()), "sup!");
+                    assertEquals(events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_UPDATED);
+                    assertEquals(events2.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_UPDATED);
+                    assertEquals(new String(cache.getCurrentData("/test/one").getData()), "sup!");
+                    assertEquals(new String(cache2.getCurrentData("/test/one").getData()), "sup!");
 
                     client.delete().forPath("/test/one");
-                    Assert.assertEquals(events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_REMOVED);
-                    Assert.assertEquals(events2.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_REMOVED);
+                    assertEquals(events.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_REMOVED);
+                    assertEquals(events2.poll(timing.forWaiting().seconds(), TimeUnit.SECONDS), PathChildrenCacheEvent.Type.CHILD_REMOVED);
                 }
             }
         }
@@ -1079,16 +1086,16 @@
                 client.create().forPath("/test/one", "hey there".getBytes());
 
                 cache.rebuild();
-                Assert.assertEquals(new String(cache.getCurrentData("/test/one").getData()), "hey there");
-                Assert.assertTrue(exec.isExecuteCalled());
+                assertEquals(new String(cache.getCurrentData("/test/one").getData()), "hey there");
+                assertTrue(exec.isExecuteCalled());
 
                 exec.setExecuteCalled(false);
             }
-            Assert.assertFalse(exec.isExecuteCalled());
+            assertFalse(exec.isExecuteCalled());
 
             client.delete().forPath("/test/one");
             timing.sleepABit();
-            Assert.assertFalse(exec.isExecuteCalled());
+            assertFalse(exec.isExecuteCalled());
         }
         finally
         {
@@ -1137,7 +1144,7 @@
 
             latch.await(5, TimeUnit.SECONDS);
 
-            Assert.assertTrue(latch.getCount() == 1, "Unexpected exception occurred");
+            assertTrue(latch.getCount() == 1, "Unexpected exception occurred");
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestPathChildrenCacheInCluster.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestPathChildrenCacheInCluster.java
index a8a93a8..3b90254 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestPathChildrenCacheInCluster.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestPathChildrenCacheInCluster.java
@@ -18,6 +18,8 @@
  */
 package org.apache.curator.framework.recipes.cache;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Queues;
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.test.compatibility.CuratorTestBase;
@@ -28,17 +30,20 @@
 import org.apache.curator.test.InstanceSpec;
 import org.apache.curator.test.TestingCluster;
 import org.apache.curator.test.Timing;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
 
-@Test(groups = CuratorTestBase.zk35TestCompatibilityGroup)
+@Tag(CuratorTestBase.zk35TestCompatibilityGroup)
 public class TestPathChildrenCacheInCluster extends BaseClassForTests
 {
-    @Test(enabled = false)  // this test is very flakey - it needs to be re-written at some point
+    @Test
+    @Disabled  // this test is very flakey - it needs to be re-written at some point
     public void testMissedDelete() throws Exception
     {
         Timing timing = new Timing();
@@ -68,22 +73,22 @@
             client1.start();
             client2.start();
             cache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);
-            Assert.assertEquals(events.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CONNECTION_RECONNECTED);
-            Assert.assertEquals(events.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.INITIALIZED);
+            assertEquals(events.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CONNECTION_RECONNECTED);
+            assertEquals(events.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.INITIALIZED);
 
             client2.create().creatingParentsIfNeeded().forPath("/test/node", "first".getBytes());
-            Assert.assertEquals(events.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CHILD_ADDED);
+            assertEquals(events.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CHILD_ADDED);
 
             cluster.killServer(client1Instance);
-            Assert.assertEquals(events.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CONNECTION_SUSPENDED);
-            Assert.assertEquals(events.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CONNECTION_LOST);
+            assertEquals(events.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CONNECTION_SUSPENDED);
+            assertEquals(events.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CONNECTION_LOST);
 
             client2.delete().forPath("/test/node");
             client2.create().forPath("/test/node", "second".getBytes());
             cluster.restartServer(client1Instance);
 
-            Assert.assertEquals(events.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CONNECTION_RECONNECTED);
-            Assert.assertEquals(events.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CHILD_UPDATED);  // "/test/node" is different - should register as updated
+            assertEquals(events.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CONNECTION_RECONNECTED);
+            assertEquals(events.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), PathChildrenCacheEvent.Type.CHILD_UPDATED);  // "/test/node" is different - should register as updated
         }
         finally
         {
@@ -141,14 +146,14 @@
             client.create().forPath("/test/two");
             client.create().forPath("/test/three");
 
-            Assert.assertTrue(latch.get().await(10, TimeUnit.SECONDS));
+            assertTrue(latch.get().await(10, TimeUnit.SECONDS));
 
             InstanceSpec connectionInstance = cluster.findConnectionInstance(client.getZookeeperClient().getZooKeeper());
             cluster.killServer(connectionInstance);
 
-            Assert.assertTrue(timing.awaitLatch(reconnectLatch));
+            assertTrue(timing.awaitLatch(reconnectLatch));
 
-            Assert.assertEquals(cache.getCurrentData().size(), 3);
+            assertEquals(cache.getCurrentData().size(), 3);
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java
index 22b0369..2b9e491 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCache.java
@@ -19,6 +19,11 @@
 
 package org.apache.curator.framework.recipes.cache;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.ImmutableSet;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.api.UnhandledErrorListener;
@@ -26,12 +31,13 @@
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.zookeeper.CreateMode;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.atomic.AtomicBoolean;
 
-@Test(groups = CuratorTestBase.zk35TestCompatibilityGroup)
+@Tag(CuratorTestBase.zk35TestCompatibilityGroup)
 public class TestTreeCache extends BaseTestTreeCache
 {
     @Test
@@ -92,10 +98,10 @@
         assertEvent(TreeCacheEvent.Type.INITIALIZED);
         assertNoMoreEvents();
 
-        Assert.assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of("1", "2", "3"));
-        Assert.assertEquals(cache.getCurrentChildren("/test/1").keySet(), ImmutableSet.of());
-        Assert.assertEquals(cache.getCurrentChildren("/test/2").keySet(), ImmutableSet.of("sub"));
-        Assert.assertNull(cache.getCurrentChildren("/test/non_exist"));
+        assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of("1", "2", "3"));
+        assertEquals(cache.getCurrentChildren("/test/1").keySet(), ImmutableSet.of());
+        assertEquals(cache.getCurrentChildren("/test/2").keySet(), ImmutableSet.of("sub"));
+        assertNull(cache.getCurrentChildren("/test/non_exist"));
     }
 
     @Test
@@ -105,7 +111,7 @@
         cache.start();
         assertEvent(TreeCacheEvent.Type.INITIALIZED);
         assertNoMoreEvents();
-        Assert.assertNull(client.checkExists().forPath("/one/two/three"));
+        assertNull(client.checkExists().forPath("/one/two/three"));
         cache.close();
 
         cache = buildWithListeners(TreeCache.newBuilder(client, "/one/two/three").setCreateParentNodes(true));
@@ -113,7 +119,7 @@
         assertEvent(TreeCacheEvent.Type.NODE_ADDED, "/one/two/three");
         assertEvent(TreeCacheEvent.Type.INITIALIZED);
         assertNoMoreEvents();
-        Assert.assertNotNull(client.checkExists().forPath("/one/two/three"));
+        assertNotNull(client.checkExists().forPath("/one/two/three"));
     }
 
     @Test
@@ -157,10 +163,10 @@
         assertEvent(TreeCacheEvent.Type.INITIALIZED);
         assertNoMoreEvents();
 
-        Assert.assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of());
-        Assert.assertNull(cache.getCurrentData("/test/1"));
-        Assert.assertNull(cache.getCurrentChildren("/test/1"));
-        Assert.assertNull(cache.getCurrentData("/test/non_exist"));
+        assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of());
+        assertNull(cache.getCurrentData("/test/1"));
+        assertNull(cache.getCurrentChildren("/test/1"));
+        assertNull(cache.getCurrentData("/test/non_exist"));
     }
 
     @Test
@@ -181,12 +187,12 @@
         assertEvent(TreeCacheEvent.Type.INITIALIZED);
         assertNoMoreEvents();
 
-        Assert.assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of("1", "2", "3"));
-        Assert.assertEquals(cache.getCurrentChildren("/test/1").keySet(), ImmutableSet.of());
-        Assert.assertEquals(cache.getCurrentChildren("/test/2").keySet(), ImmutableSet.of());
-        Assert.assertNull(cache.getCurrentData("/test/2/sub"));
-        Assert.assertNull(cache.getCurrentChildren("/test/2/sub"));
-        Assert.assertNull(cache.getCurrentChildren("/test/non_exist"));
+        assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of("1", "2", "3"));
+        assertEquals(cache.getCurrentChildren("/test/1").keySet(), ImmutableSet.of());
+        assertEquals(cache.getCurrentChildren("/test/2").keySet(), ImmutableSet.of());
+        assertNull(cache.getCurrentData("/test/2/sub"));
+        assertNull(cache.getCurrentChildren("/test/2/sub"));
+        assertNull(cache.getCurrentChildren("/test/non_exist"));
     }
 
     @Test
@@ -238,10 +244,10 @@
         assertEvent(TreeCacheEvent.Type.INITIALIZED);
         assertNoMoreEvents();
 
-        Assert.assertTrue(cache.getCurrentChildren("/").keySet().contains("test"));
-        Assert.assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of("one"));
-        Assert.assertEquals(cache.getCurrentChildren("/test/one").keySet(), ImmutableSet.of());
-        Assert.assertEquals(new String(cache.getCurrentData("/test/one").getData()), "hey there");
+        assertTrue(cache.getCurrentChildren("/").keySet().contains("test"));
+        assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of("one"));
+        assertEquals(cache.getCurrentChildren("/test/one").keySet(), ImmutableSet.of());
+        assertEquals(new String(cache.getCurrentData("/test/one").getData()), "hey there");
     }
 
     @Test
@@ -257,10 +263,10 @@
         assertEvent(TreeCacheEvent.Type.INITIALIZED);
         assertNoMoreEvents();
 
-        Assert.assertTrue(cache.getCurrentChildren("/").keySet().contains("test"));
-        Assert.assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of());
-        Assert.assertNull(cache.getCurrentData("/test/one"));
-        Assert.assertNull(cache.getCurrentChildren("/test/one"));
+        assertTrue(cache.getCurrentChildren("/").keySet().contains("test"));
+        assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of());
+        assertNull(cache.getCurrentData("/test/one"));
+        assertNull(cache.getCurrentChildren("/test/one"));
     }
 
     @Test
@@ -278,9 +284,9 @@
         assertEvent(TreeCacheEvent.Type.INITIALIZED);
         assertNoMoreEvents();
 
-        Assert.assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of("one"));
-        Assert.assertEquals(cache.getCurrentChildren("/test/one").keySet(), ImmutableSet.of());
-        Assert.assertEquals(new String(cache.getCurrentData("/test/one").getData()), "hey there");
+        assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of("one"));
+        assertEquals(cache.getCurrentChildren("/test/one").keySet(), ImmutableSet.of());
+        assertEquals(new String(cache.getCurrentData("/test/one").getData()), "hey there");
     }
 
     @Test
@@ -299,11 +305,11 @@
         assertEvent(TreeCacheEvent.Type.NODE_ADDED, "/test/one");
         assertEvent(TreeCacheEvent.Type.INITIALIZED);
         assertNoMoreEvents();
-        Assert.assertEquals(cache.getCurrentChildren("/").keySet(), ImmutableSet.of("foo", "test"));
-        Assert.assertEquals(cache.getCurrentChildren("/foo").keySet(), ImmutableSet.of());
-        Assert.assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of("one"));
-        Assert.assertEquals(cache.getCurrentChildren("/test/one").keySet(), ImmutableSet.of());
-        Assert.assertEquals(new String(cache.getCurrentData("/test/one").getData()), "hey there");
+        assertEquals(cache.getCurrentChildren("/").keySet(), ImmutableSet.of("foo", "test"));
+        assertEquals(cache.getCurrentChildren("/foo").keySet(), ImmutableSet.of());
+        assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of("one"));
+        assertEquals(cache.getCurrentChildren("/test/one").keySet(), ImmutableSet.of());
+        assertEquals(new String(cache.getCurrentData("/test/one").getData()), "hey there");
     }
 
     @Test
@@ -355,9 +361,9 @@
         assertEvent(TreeCacheEvent.Type.NODE_UPDATED, "/test/foo");
         assertNoMoreEvents();
 
-        Assert.assertNotNull(cache.getCurrentData("/test/foo"));
+        assertNotNull(cache.getCurrentData("/test/foo"));
         // No byte data querying the tree because we're not caching data.
-        Assert.assertNull(cache.getCurrentData("/test/foo").getData());
+        assertNull(cache.getCurrentData("/test/foo").getData());
     }
 
     @Test
@@ -440,26 +446,26 @@
         cache.start();
         assertEvent(TreeCacheEvent.Type.NODE_ADDED, "/test");
         assertEvent(TreeCacheEvent.Type.INITIALIZED);
-        Assert.assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of());
-        Assert.assertNull(cache.getCurrentChildren("/t"));
-        Assert.assertNull(cache.getCurrentChildren("/testing"));
+        assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of());
+        assertNull(cache.getCurrentChildren("/t"));
+        assertNull(cache.getCurrentChildren("/testing"));
 
         client.create().forPath("/test/one", "hey there".getBytes());
         assertEvent(TreeCacheEvent.Type.NODE_ADDED, "/test/one");
-        Assert.assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of("one"));
-        Assert.assertEquals(new String(cache.getCurrentData("/test/one").getData()), "hey there");
-        Assert.assertEquals(cache.getCurrentChildren("/test/one").keySet(), ImmutableSet.of());
-        Assert.assertNull(cache.getCurrentChildren("/test/o"));
-        Assert.assertNull(cache.getCurrentChildren("/test/onely"));
+        assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of("one"));
+        assertEquals(new String(cache.getCurrentData("/test/one").getData()), "hey there");
+        assertEquals(cache.getCurrentChildren("/test/one").keySet(), ImmutableSet.of());
+        assertNull(cache.getCurrentChildren("/test/o"));
+        assertNull(cache.getCurrentChildren("/test/onely"));
 
         client.setData().forPath("/test/one", "sup!".getBytes());
         assertEvent(TreeCacheEvent.Type.NODE_UPDATED, "/test/one");
-        Assert.assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of("one"));
-        Assert.assertEquals(new String(cache.getCurrentData("/test/one").getData()), "sup!");
+        assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of("one"));
+        assertEquals(new String(cache.getCurrentData("/test/one").getData()), "sup!");
 
         client.delete().forPath("/test/one");
         assertEvent(TreeCacheEvent.Type.NODE_REMOVED, "/test/one", "sup!".getBytes());
-        Assert.assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of());
+        assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of());
 
         assertNoMoreEvents();
     }
@@ -477,13 +483,13 @@
         assertEvent(TreeCacheEvent.Type.NODE_ADDED, "/test/one");
 
         assertEvent(TreeCacheEvent.Type.INITIALIZED);
-        Assert.assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of("one"));
-        Assert.assertEquals(new String(cache.getCurrentData("/test/one").getData()), "hey there");
-        Assert.assertEquals(cache.getCurrentChildren("/test/one").keySet(), ImmutableSet.of());
-        Assert.assertNull(cache.getCurrentChildren("/test/o"));
-        Assert.assertNull(cache.getCurrentChildren("/test/onely"));
-        Assert.assertNull(cache.getCurrentChildren("/t"));
-        Assert.assertNull(cache.getCurrentChildren("/testing"));
+        assertEquals(cache.getCurrentChildren("/test").keySet(), ImmutableSet.of("one"));
+        assertEquals(new String(cache.getCurrentData("/test/one").getData()), "hey there");
+        assertEquals(cache.getCurrentChildren("/test/one").keySet(), ImmutableSet.of());
+        assertNull(cache.getCurrentChildren("/test/o"));
+        assertNull(cache.getCurrentChildren("/test/onely"));
+        assertNull(cache.getCurrentChildren("/t"));
+        assertNull(cache.getCurrentChildren("/testing"));
 
         assertNoMoreEvents();
     }
@@ -519,24 +525,24 @@
 
             client.create().forPath("/test/one", "hey there".getBytes());
             assertEvent(TreeCacheEvent.Type.NODE_ADDED, "/test/one");
-            Assert.assertEquals(new String(cache.getCurrentData("/test/one").getData()), "hey there");
+            assertEquals(new String(cache.getCurrentData("/test/one").getData()), "hey there");
             semaphore.acquire();
-            Assert.assertEquals(new String(cache2.getCurrentData("/test/one").getData()), "hey there");
+            assertEquals(new String(cache2.getCurrentData("/test/one").getData()), "hey there");
 
             client.setData().forPath("/test/one", "sup!".getBytes());
             assertEvent(TreeCacheEvent.Type.NODE_UPDATED, "/test/one");
-            Assert.assertEquals(new String(cache.getCurrentData("/test/one").getData()), "sup!");
+            assertEquals(new String(cache.getCurrentData("/test/one").getData()), "sup!");
             semaphore.acquire();
-            Assert.assertEquals(new String(cache2.getCurrentData("/test/one").getData()), "sup!");
+            assertEquals(new String(cache2.getCurrentData("/test/one").getData()), "sup!");
 
             client.delete().forPath("/test/one");
             assertEvent(TreeCacheEvent.Type.NODE_REMOVED, "/test/one", "sup!".getBytes());
-            Assert.assertNull(cache.getCurrentData("/test/one"));
+            assertNull(cache.getCurrentData("/test/one"));
             semaphore.acquire();
-            Assert.assertNull(cache2.getCurrentData("/test/one"));
+            assertNull(cache2.getCurrentData("/test/one"));
 
             assertNoMoreEvents();
-            Assert.assertEquals(semaphore.availablePermits(), 0);
+            assertEquals(semaphore.availablePermits(), 0);
         }
         finally
         {
@@ -556,7 +562,7 @@
 
         client.create().forPath("/test/one", "hey there".getBytes());
         assertEvent(TreeCacheEvent.Type.NODE_ADDED, "/test/one");
-        Assert.assertEquals(new String(cache.getCurrentData("/test/one").getData()), "hey there");
+        assertEquals(new String(cache.getCurrentData("/test/one").getData()), "hey there");
 
         cache.close();
         assertNoMoreEvents();
@@ -620,7 +626,7 @@
             @Override
             public void unhandledError(String message, Throwable e)
             {
-                Assert.assertFalse(isProcessed.compareAndSet(false, true));
+                assertFalse(isProcessed.compareAndSet(false, true));
             }
         });
 
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCacheIteratorAndSize.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCacheIteratorAndSize.java
index 2d8dbb3..a0daae3 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCacheIteratorAndSize.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCacheIteratorAndSize.java
@@ -18,13 +18,17 @@
  */
 package org.apache.curator.framework.recipes.cache;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Sets;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.compatibility.CuratorTestBase;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -79,13 +83,13 @@
                     iteratorValues.put(next.getPath(), next.getData());
                 }
 
-                Assert.assertEquals(iteratorValues.size(), nodes.length);
+                assertEquals(iteratorValues.size(), nodes.length);
                 for ( String node : nodes )
                 {
-                    Assert.assertEquals(iteratorValues.get(node), node.getBytes());
+                    assertArrayEquals(iteratorValues.get(node), node.getBytes());
                 }
 
-                Assert.assertEquals(treeCache.size(), nodes.length);
+                assertEquals(treeCache.size(), nodes.length);
             }
         }
     }
@@ -125,19 +129,19 @@
 
                 timing.sleepABit(); // let the cache settle
 
-                Assert.assertEquals(treeCache.size(), pathAndData.size());
+                assertEquals(treeCache.size(), pathAndData.size());
 
                 // at this point we have a cached graph of random nodes with random values
                 Iterator<ChildData> iterator = treeCache.iterator();
                 while ( iterator.hasNext() )
                 {
                     ChildData next = iterator.next();
-                    Assert.assertTrue(pathAndData.containsKey(next.getPath()));
-                    Assert.assertEquals(pathAndData.get(next.getPath()).getBytes(), next.getData());
+                    assertTrue(pathAndData.containsKey(next.getPath()));
+                    assertArrayEquals(pathAndData.get(next.getPath()).getBytes(), next.getData());
                     pathAndData.remove(next.getPath());
                 }
 
-                Assert.assertEquals(pathAndData.size(), 0); // above loop should have removed all nodes
+                assertEquals(pathAndData.size(), 0); // above loop should have removed all nodes
             }
         }
     }
@@ -154,8 +158,8 @@
                 treeCache.start();
 
                 Iterator<ChildData> iterator = treeCache.iterator();
-                Assert.assertFalse(iterator.hasNext());
-                Assert.assertEquals(treeCache.size(), 0);
+                assertFalse(iterator.hasNext());
+                assertEquals(treeCache.size(), 0);
             }
         }
     }
@@ -193,8 +197,8 @@
                     paths.add(next.getPath());
                 }
 
-                Assert.assertEquals(paths, Sets.newHashSet("/foo", "/foo/a1", "/foo/a2", "/foo/a2/a2.1", "/foo/a3", "/foo/a3/a3.2"));
-                Assert.assertEquals(treeCache.size(), 6);
+                assertEquals(paths, Sets.newHashSet("/foo", "/foo/a1", "/foo/a2", "/foo/a2/a2.1", "/foo/a3", "/foo/a3/a3.2"));
+                assertEquals(treeCache.size(), 6);
             }
         }
     }
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCacheRandomTree.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCacheRandomTree.java
index e78bb9e..687f027 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCacheRandomTree.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestTreeCacheRandomTree.java
@@ -19,18 +19,20 @@
 
 package org.apache.curator.framework.recipes.cache;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
 import com.google.common.collect.Iterables;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.utils.ZKPaths;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Random;
 
-import static org.testng.Assert.assertNotNull;
-
 public class TestTreeCacheRandomTree extends BaseTestTreeCache
 {
     /**
@@ -119,7 +121,7 @@
                 {
                     // Delete myself from parent.
                     TestNode removed = last.children.remove(ZKPaths.getNodeFromPath(node.fullPath));
-                    Assert.assertSame(node, removed);
+                    assertSame(node, removed);
 
                     // Delete from ZK
                     cl.delete().forPath(node.fullPath);
@@ -217,7 +219,7 @@
             return;
         }
 
-        Assert.assertEquals(cacheChildren.keySet(), expectedNode.children.keySet(), path);
+        assertEquals(cacheChildren.keySet(), expectedNode.children.keySet(), path);
 
         for ( Map.Entry<String, TestNode> entry : expectedNode.children.entrySet() )
         {
@@ -236,6 +238,6 @@
     {
         String path = expectedNode.fullPath;
         assertNotNull(actualChild, path);
-        Assert.assertEquals(actualChild.getData(), expectedNode.data, path);
+        assertArrayEquals(actualChild.getData(), expectedNode.data, path);
     }
 }
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestWrappedNodeCache.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestWrappedNodeCache.java
index 25716a7..26aa64e 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestWrappedNodeCache.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/cache/TestWrappedNodeCache.java
@@ -18,6 +18,11 @@
  */
 package org.apache.curator.framework.recipes.cache;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.imps.TestCleanState;
@@ -25,8 +30,9 @@
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.utils.CloseableUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.util.Optional;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Semaphore;
@@ -34,7 +40,7 @@
 
 import static org.apache.curator.framework.recipes.cache.CuratorCacheListener.builder;
 
-@Test(groups = CuratorTestBase.zk36Group)
+@Tag(CuratorTestBase.zk36Group)
 public class TestWrappedNodeCache extends CuratorTestBase
 {
     @Test
@@ -55,18 +61,18 @@
             Supplier<Optional<ChildData>> rootData = getRootDataProc(cache, "/test/foo");
 
             cache.start();
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
+            assertTrue(timing.acquireSemaphore(semaphore));
 
-            Assert.assertTrue(rootData.get().isPresent());
-            Assert.assertEquals(rootData.get().get().getData(), "one".getBytes());
+            assertTrue(rootData.get().isPresent());
+            assertArrayEquals(rootData.get().get().getData(), "one".getBytes());
 
             client.delete().forPath("/test/foo");
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
+            assertTrue(timing.acquireSemaphore(semaphore));
             client.create().forPath("/test/foo", "two".getBytes());
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
+            assertTrue(timing.acquireSemaphore(semaphore));
 
-            Assert.assertTrue(rootData.get().isPresent());
-            Assert.assertEquals(rootData.get().get().getData(), "two".getBytes());
+            assertTrue(rootData.get().isPresent());
+            assertArrayEquals(rootData.get().get().getData(), "two".getBytes());
         }
         finally
         {
@@ -103,18 +109,18 @@
             Supplier<Optional<ChildData>> rootData = getRootDataProc(cache, "/test/node");
 
             cache.start();
-            Assert.assertTrue(timing.acquireSemaphore(latch));
+            assertTrue(timing.acquireSemaphore(latch));
 
             client.getZookeeperClient().getZooKeeper().getTestable().injectSessionExpiration();
-            Assert.assertTrue(timing.awaitLatch(lostLatch));
+            assertTrue(timing.awaitLatch(lostLatch));
 
-            Assert.assertTrue(rootData.get().isPresent());
-            Assert.assertEquals(rootData.get().get().getData(), "start".getBytes());
+            assertTrue(rootData.get().isPresent());
+            assertArrayEquals(rootData.get().get().getData(), "start".getBytes());
 
             client.setData().forPath("/test/node", "new data".getBytes());
-            Assert.assertTrue(timing.acquireSemaphore(latch));
-            Assert.assertTrue(rootData.get().isPresent());
-            Assert.assertEquals(rootData.get().get().getData(), "new data".getBytes());
+            assertTrue(timing.acquireSemaphore(latch));
+            assertTrue(rootData.get().isPresent());
+            assertArrayEquals(rootData.get().get().getData(), "new data".getBytes());
         }
         finally
         {
@@ -143,19 +149,19 @@
             NodeCacheListener listener = semaphore::release;
             cache.listenable().addListener(builder().forNodeCache(listener).build());
 
-            Assert.assertNull(rootData.get().orElse(null));
+            assertNull(rootData.get().orElse(null));
 
             client.create().forPath("/test/node", "a".getBytes());
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
-            Assert.assertEquals(rootData.get().orElse(null).getData(), "a".getBytes());
+            assertTrue(timing.acquireSemaphore(semaphore));
+            assertArrayEquals(rootData.get().orElse(null).getData(), "a".getBytes());
 
             client.setData().forPath("/test/node", "b".getBytes());
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
-            Assert.assertEquals(rootData.get().orElse(null).getData(), "b".getBytes());
+            assertTrue(timing.acquireSemaphore(semaphore));
+            assertArrayEquals(rootData.get().orElse(null).getData(), "b".getBytes());
 
             client.delete().forPath("/test/node");
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
-            Assert.assertNull(rootData.get().orElse(null));
+            assertTrue(timing.acquireSemaphore(semaphore));
+            assertNull(rootData.get().orElse(null));
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderAcls.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderAcls.java
index 1589c7a..4d1172c 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderAcls.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderAcls.java
@@ -19,6 +19,8 @@
 
 package org.apache.curator.framework.recipes.leader;
 
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.RetryPolicy;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -33,8 +35,9 @@
 import org.apache.zookeeper.data.ACL;
 import org.apache.zookeeper.data.Id;
 import org.apache.zookeeper.server.auth.DigestAuthenticationProvider;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+
 import java.security.NoSuchAlgorithmException;
 import java.util.Collections;
 import java.util.List;
@@ -45,7 +48,8 @@
 {
     private final Timing timing = new Timing();
 
-    @Test(description = "Validation test for CURATOR-365")
+    @Test
+    @DisplayName("Validation test for CURATOR-365")
     public void testAclErrorWithLeader() throws Exception
     {
         ACLProvider provider = new ACLProvider()
@@ -90,7 +94,7 @@
 
             latch = new LeaderLatch(client, "/base");
             latch.start();
-            Assert.assertTrue(latch.await(timing.forWaiting().seconds(), TimeUnit.SECONDS));
+            assertTrue(latch.await(timing.forWaiting().seconds(), TimeUnit.SECONDS));
             latch.close();
             latch = null;
 
@@ -117,7 +121,7 @@
                 // but also making sure that the code goes through the backgroundCreateParentsThenNode() codepath
                 latch = new LeaderLatch(noAuthClient, "/base/second");
                 latch.start();
-                Assert.assertTrue(timing.awaitLatch(noAuthLatch));
+                assertTrue(timing.awaitLatch(noAuthLatch));
             }
             finally
             {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderLatch.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderLatch.java
index 1dca724..d64e7cf 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderLatch.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderLatch.java
@@ -19,6 +19,12 @@
 
 package org.apache.curator.framework.recipes.leader;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import com.google.common.base.Throwables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Queues;
@@ -40,8 +46,9 @@
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.test.compatibility.Timing2;
 import org.apache.curator.utils.CloseableUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -61,7 +68,7 @@
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
-@Test(groups = CuratorTestBase.zk35TestCompatibilityGroup)
+@Tag(CuratorTestBase.zk35TestCompatibilityGroup)
 public class TestLeaderLatch extends BaseClassForTests
 {
     private static final String PATH_NAME = "/one/two/me";
@@ -133,7 +140,7 @@
             holders.forEach(holder -> {
                 executorService.submit(() -> {
                     holder.latch.start();
-                    Assert.assertTrue(holder.latch.await(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS));
+                    assertTrue(holder.latch.await(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS));
                     holder.isLockedLatch.countDown();
                     return null;
                 });
@@ -143,17 +150,17 @@
             for ( int i = 0; i < 4; ++i )   // note: 4 is just a random number of loops to simulate disconnections
             {
                 server.stop();
-                Assert.assertTrue(timing.acquireSemaphore(lostSemaphore));
+                assertTrue(timing.acquireSemaphore(lostSemaphore));
                 server.restart();
                 timing.sleepABit();
             }
 
             for ( Holder holder : holders )
             {
-                Assert.assertTrue(holder.latch.await(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS));
-                Assert.assertEquals(timing.takeFromQueue(holder.stateChanges), ConnectionState.SUSPENDED);
-                Assert.assertEquals(timing.takeFromQueue(holder.stateChanges), ConnectionState.LOST);
-                Assert.assertEquals(timing.takeFromQueue(holder.stateChanges), ConnectionState.RECONNECTED);
+                assertTrue(holder.latch.await(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS));
+                assertEquals(timing.takeFromQueue(holder.stateChanges), ConnectionState.SUSPENDED);
+                assertEquals(timing.takeFromQueue(holder.stateChanges), ConnectionState.LOST);
+                assertEquals(timing.takeFromQueue(holder.stateChanges), ConnectionState.RECONNECTED);
             }
         }
         finally
@@ -187,7 +194,7 @@
             try ( LeaderLatch latch2 = new LeaderLatch(client, latchPath, "2") )
             {
                 latch1.start();
-                Assert.assertTrue(latch1.await(timing.milliseconds(), TimeUnit.MILLISECONDS));
+                assertTrue(latch1.await(timing.milliseconds(), TimeUnit.MILLISECONDS));
 
                 latch2.start(); // will get a watcher on latch1's node
                 timing.sleepABit();
@@ -200,9 +207,9 @@
                 latch2.reset(); // force the internal "ourPath" to get reset
                 latch2.debugCheckLeaderShipLatch.countDown();   // allow checkLeadership() to continue
 
-                Assert.assertTrue(latch2.await(timing.forSessionSleep().forWaiting().milliseconds(), TimeUnit.MILLISECONDS));
+                assertTrue(latch2.await(timing.forSessionSleep().forWaiting().milliseconds(), TimeUnit.MILLISECONDS));
                 timing.sleepABit();
-                Assert.assertEquals(client.getChildren().forPath(latchPath).size(), 1);
+                assertEquals(client.getChildren().forPath(latchPath).size(), 1);
             }
             finally
             {
@@ -258,25 +265,25 @@
                 };
                 latch.addListener(listener);
                 latch.start();
-                Assert.assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED.name());
-                Assert.assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), "true");
+                assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED.name());
+                assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), "true");
                 server.stop();
                 if ( isSessionIteration )
                 {
-                    Assert.assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED.name());
+                    assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED.name());
                     server.restart();
-                    Assert.assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.RECONNECTED.name());
-                    Assert.assertNull(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS));
+                    assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.RECONNECTED.name());
+                    assertNull(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS));
                 }
                 else
                 {
                     String s = states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS);
-                    Assert.assertTrue("false".equals(s) || ConnectionState.SUSPENDED.name().equals(s));
+                    assertTrue("false".equals(s) || ConnectionState.SUSPENDED.name().equals(s));
                     s = states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS);
-                    Assert.assertTrue("false".equals(s) || ConnectionState.SUSPENDED.name().equals(s));
+                    assertTrue("false".equals(s) || ConnectionState.SUSPENDED.name().equals(s));
                     server.restart();
-                    Assert.assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.RECONNECTED.name());
-                    Assert.assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), "true");
+                    assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.RECONNECTED.name());
+                    assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), "true");
                 }
             }
             finally
@@ -329,14 +336,14 @@
             };
             latch.addListener(listener);
             latch.start();
-            Assert.assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED.name());
-            Assert.assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), "true");
+            assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED.name());
+            assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), "true");
             server.close();
             List<String> next = Lists.newArrayList();
             next.add(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS));
             next.add(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS));
-            Assert.assertTrue(next.equals(Arrays.asList(ConnectionState.SUSPENDED.name(), "false")) || next.equals(Arrays.asList("false", ConnectionState.SUSPENDED.name())), next.toString());
-            Assert.assertEquals(states.poll(timing.forSessionSleep().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST.name());
+            assertTrue(next.equals(Arrays.asList(ConnectionState.SUSPENDED.name(), "false")) || next.equals(Arrays.asList("false", ConnectionState.SUSPENDED.name())), next.toString());
+            assertEquals(states.poll(timing.forSessionSleep().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST.name());
             latch.close();
             client.close();
 
@@ -356,14 +363,14 @@
             latch = new LeaderLatch(client, "/test");
             latch.addListener(listener);
             latch.start();
-            Assert.assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED.name());
-            Assert.assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), "true");
+            assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED.name());
+            assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), "true");
             server.close();
-            Assert.assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED.name());
+            assertEquals(states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED.name());
             next = Lists.newArrayList();
             next.add(states.poll(timing.forSessionSleep().milliseconds(), TimeUnit.MILLISECONDS));
             next.add(states.poll(timing.forSessionSleep().milliseconds(), TimeUnit.MILLISECONDS));
-            Assert.assertTrue(next.equals(Arrays.asList(ConnectionState.LOST.name(), "false")) || next.equals(Arrays.asList("false", ConnectionState.LOST.name())), next.toString());
+            assertTrue(next.equals(Arrays.asList(ConnectionState.LOST.name(), "false")) || next.equals(Arrays.asList("false", ConnectionState.LOST.name())), next.toString());
         }
         finally
         {
@@ -411,8 +418,8 @@
             latch.close();
             latch = null;
 
-            Assert.assertTrue(timing.awaitLatch(cancelStartTaskLatch));
-            Assert.assertFalse(resetCalled.get());
+            assertTrue(timing.awaitLatch(cancelStartTaskLatch));
+            assertFalse(resetCalled.get());
         }
         finally
         {
@@ -442,7 +449,7 @@
 
             timing.sleepABit();
 
-            Assert.assertEquals(client.getChildren().forPath(PATH_NAME).size(), 1);
+            assertEquals(client.getChildren().forPath(PATH_NAME).size(), 1);
         }
         finally
         {
@@ -474,7 +481,7 @@
 
             timing.sleepABit();
 
-            Assert.assertEquals(client.getChildren().forPath(PATH_NAME).size(), 0);
+            assertEquals(client.getChildren().forPath(PATH_NAME).size(), 0);
 
         }
         finally
@@ -519,14 +526,14 @@
             waitForALeader(latches, timing);
 
             server.stop();
-            Assert.assertTrue(timing.awaitLatch(countDownLatch));
+            assertTrue(timing.awaitLatch(countDownLatch));
 
             timing.forWaiting().sleepABit();
 
-            Assert.assertEquals(getLeaders(latches).size(), 0);
+            assertEquals(getLeaders(latches).size(), 0);
 
             server.restart();
-            Assert.assertEquals(waitForALeader(latches, timing).size(), 1); // should reconnect
+            assertEquals(waitForALeader(latches, timing).size(), 1); // should reconnect
         }
         finally
         {
@@ -565,7 +572,7 @@
 
             //As the previous algorithm assumed that if the watched node is deleted gets the leadership
             //we need to ensure that the PARTICIPANT_ID-1 is not getting (wrongly) elected as leader.
-            Assert.assertTrue(!latches.get(PARTICIPANT_ID - 1).hasLeadership());
+            assertTrue(!latches.get(PARTICIPANT_ID - 1).hasLeadership());
         }
         finally
         {
@@ -617,8 +624,8 @@
                         try
                         {
                             latch.start();
-                            Assert.assertTrue(latch.await(timing.forWaiting().seconds(), TimeUnit.SECONDS));
-                            Assert.assertTrue(thereIsALeader.compareAndSet(false, true));
+                            assertTrue(latch.await(timing.forWaiting().seconds(), TimeUnit.SECONDS));
+                            assertTrue(thereIsALeader.compareAndSet(false, true));
                             Thread.sleep((int)(10 * Math.random()));
                             thereIsALeader.set(false);
                         }
@@ -719,11 +726,11 @@
 
             timesSquare.await();
 
-            Assert.assertEquals(masterCounter.get(), PARTICIPANT_QTY * 2);
-            Assert.assertEquals(notLeaderCounter.get(), PARTICIPANT_QTY);
+            assertEquals(masterCounter.get(), PARTICIPANT_QTY * 2);
+            assertEquals(notLeaderCounter.get(), PARTICIPANT_QTY);
             for ( LeaderLatch latch : latches )
             {
-                Assert.assertEquals(latch.getState(), LeaderLatch.State.CLOSED);
+                assertEquals(latch.getState(), LeaderLatch.State.CLOSED);
             }
         }
         finally
@@ -807,11 +814,11 @@
 
             timesSquare.await();
 
-            Assert.assertEquals(masterCounter.get(), PARTICIPANT_QTY * 2);
-            Assert.assertEquals(notLeaderCounter.get(), PARTICIPANT_QTY * 2 - SILENT_QTY);
+            assertEquals(masterCounter.get(), PARTICIPANT_QTY * 2);
+            assertEquals(notLeaderCounter.get(), PARTICIPANT_QTY * 2 - SILENT_QTY);
             for ( LeaderLatch latch : latches )
             {
-                Assert.assertEquals(latch.getState(), LeaderLatch.State.CLOSED);
+                assertEquals(latch.getState(), LeaderLatch.State.CLOSED);
             }
         }
         finally
@@ -886,11 +893,11 @@
             // Test the close override
             leader.close(LeaderLatch.CloseMode.NOTIFY_LEADER);
 
-            Assert.assertEquals(leader.getState(), LeaderLatch.State.CLOSED);
-            Assert.assertEquals(notifiedLeader.getState(), LeaderLatch.State.CLOSED);
+            assertEquals(leader.getState(), LeaderLatch.State.CLOSED);
+            assertEquals(notifiedLeader.getState(), LeaderLatch.State.CLOSED);
 
-            Assert.assertEquals(masterCounter.get(), 1);
-            Assert.assertEquals(notLeaderCounter.get(), 0);
+            assertEquals(masterCounter.get(), 1);
+            assertEquals(notLeaderCounter.get(), 0);
         }
         finally
         {
@@ -946,14 +953,14 @@
             // Start the new server
             server = new TestingServer(server.getPort(), server.getTempDirectory());
 
-            Assert.assertTrue(timing.awaitLatch(leaderCounter), "Not elected leader");
+            assertTrue(timing.awaitLatch(leaderCounter), "Not elected leader");
 
-            Assert.assertEquals(leaderCount.get(), 1, "Elected too many times");
-            Assert.assertEquals(notLeaderCount.get(), 0, "Unelected too many times");
+            assertEquals(leaderCount.get(), 1, "Elected too many times");
+            assertEquals(notLeaderCount.get(), 0, "Unelected too many times");
         }
         catch ( Exception e )
         {
-            Assert.fail("Unexpected exception", e);
+            fail("Unexpected exception", e);
         }
         finally
         {
@@ -1012,11 +1019,11 @@
             while ( latches.size() > 0 )
             {
                 List<LeaderLatch> leaders = waitForALeader(latches, timing);
-                Assert.assertEquals(leaders.size(), 1); // there can only be one leader
+                assertEquals(leaders.size(), 1); // there can only be one leader
                 LeaderLatch theLeader = leaders.get(0);
                 if ( mode == Mode.START_IMMEDIATELY )
                 {
-                    Assert.assertEquals(latches.indexOf(theLeader), 0); // assert ordering - leadership should advance in start order
+                    assertEquals(latches.indexOf(theLeader), 0); // assert ordering - leadership should advance in start order
                 }
                 theLeader.close();
                 latches.remove(theLeader);
@@ -1059,11 +1066,13 @@
         return leaders;
     }
 
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testRelativePath() throws Exception
+    @Test
+    public void testRelativePath()
     {
-        Timing timing = new Timing();
-        CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), timing.session(), timing.connection(), new RetryOneTime(1));
-        new LeaderLatch(client, "parent");
+        assertThrows(IllegalArgumentException.class, ()->{
+            Timing timing = new Timing();
+            CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), timing.session(), timing.connection(), new RetryOneTime(1));
+            new LeaderLatch(client, "parent");
+        });
     }
 }
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderLatchCluster.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderLatchCluster.java
index 752ed4f..5fba3b1 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderLatchCluster.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderLatchCluster.java
@@ -18,6 +18,8 @@
  */
 package org.apache.curator.framework.recipes.leader;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import com.google.common.collect.Lists;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -27,8 +29,8 @@
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.test.compatibility.Timing2;
 import org.apache.curator.utils.CloseableUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.Collection;
 import java.util.List;
 
@@ -72,16 +74,16 @@
             }
 
             ClientAndLatch leader = waitForALeader(clients, timing);
-            Assert.assertNotNull(leader);
+            assertNotNull(leader);
 
             cluster.killServer(instances.get(leader.index));
 
             Thread.sleep(sessionLength * 2);
 
             leader = waitForALeader(clients, timing);
-            Assert.assertNotNull(leader);
+            assertNotNull(leader);
 
-            Assert.assertEquals(getLeaders(clients).size(), 1);
+            assertEquals(getLeaders(clients).size(), 1);
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelector.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelector.java
index 3b054a2..44e0269 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelector.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelector.java
@@ -19,6 +19,12 @@
 
 package org.apache.curator.framework.recipes.leader;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Queues;
 import com.google.common.collect.Sets;
@@ -34,8 +40,8 @@
 import org.apache.curator.test.Timing;
 import org.apache.curator.test.compatibility.Timing2;
 import org.apache.curator.utils.CloseableUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
@@ -47,8 +53,6 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import static org.testng.Assert.fail;
-
 public class TestLeaderSelector extends BaseClassForTests
 {
     private static final String PATH_NAME = "/one/two/me";
@@ -86,9 +90,9 @@
             selector.start();
             Thread leaderThread = timing.takeFromQueue(threadExchange);
             leaderThread.interrupt();
-            Assert.assertTrue(timing.awaitLatch(exitLatch));
+            assertTrue(timing.awaitLatch(exitLatch));
             timing.sleepABit(); // wait for leader selector to clear nodes
-            Assert.assertEquals(0, selector.failedMutexReleaseCount.get());
+            assertEquals(0, selector.failedMutexReleaseCount.get());
         }
         finally
         {
@@ -144,14 +148,14 @@
             selector = new LeaderSelector(client, "/test", listener);
             selector.start();
 
-            Assert.assertEquals(changes.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED.name());
-            Assert.assertEquals(changes.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), "leader");
+            assertEquals(changes.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED.name());
+            assertEquals(changes.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), "leader");
             server.close();
             List<String> next = Lists.newArrayList();
             next.add(changes.poll(timing.forSessionSleep().milliseconds(), TimeUnit.MILLISECONDS));
             next.add(changes.poll(timing.forSessionSleep().milliseconds(), TimeUnit.MILLISECONDS));
-            Assert.assertTrue(next.equals(Arrays.asList(ConnectionState.SUSPENDED.name(), "release")) || next.equals(Arrays.asList("release", ConnectionState.SUSPENDED.name())), next.toString());
-            Assert.assertEquals(changes.poll(timing.forSessionSleep().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST.name());
+            assertTrue(next.equals(Arrays.asList(ConnectionState.SUSPENDED.name(), "release")) || next.equals(Arrays.asList("release", ConnectionState.SUSPENDED.name())), next.toString());
+            assertEquals(changes.poll(timing.forSessionSleep().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.LOST.name());
 
             selector.close();
             client.close();
@@ -172,14 +176,14 @@
             selector = new LeaderSelector(client, "/test", listener);
             selector.start();
 
-            Assert.assertEquals(changes.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED.name());
-            Assert.assertEquals(changes.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), "leader");
+            assertEquals(changes.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED.name());
+            assertEquals(changes.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), "leader");
             server.stop();
-            Assert.assertEquals(changes.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED.name());
+            assertEquals(changes.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED.name());
             next = Lists.newArrayList();
             next.add(changes.poll(timing.forSessionSleep().milliseconds(), TimeUnit.MILLISECONDS));
             next.add(changes.poll(timing.forSessionSleep().milliseconds(), TimeUnit.MILLISECONDS));
-            Assert.assertTrue(next.equals(Arrays.asList(ConnectionState.LOST.name(), "release")) || next.equals(Arrays.asList("release", ConnectionState.LOST.name())), next.toString());
+            assertTrue(next.equals(Arrays.asList(ConnectionState.LOST.name(), "release")) || next.equals(Arrays.asList("release", ConnectionState.LOST.name())), next.toString());
         }
         finally
         {
@@ -241,10 +245,10 @@
             server.stop();
             leaderThread.interrupt();
             server.restart();
-            Assert.assertTrue(timing.awaitLatch(reconnectedLatch));
+            assertTrue(timing.awaitLatch(reconnectedLatch));
             timing.sleepABit();
 
-            Assert.assertEquals(client.getChildren().forPath("/leader").size(), 0);
+            assertEquals(client.getChildren().forPath("/leader").size(), 0);
         }
         finally
         {
@@ -278,10 +282,10 @@
             selector.autoRequeue();
             selector.start();
 
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
+            assertTrue(timing.acquireSemaphore(semaphore));
             selector.interruptLeadership();
 
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
+            assertTrue(timing.acquireSemaphore(semaphore));
         }
         finally
         {
@@ -327,9 +331,9 @@
             selector = new LeaderSelector(client, "/leader", listener);
             selector.start();
 
-            Assert.assertTrue(timing.awaitLatch(isLeaderLatch));
+            assertTrue(timing.awaitLatch(isLeaderLatch));
             selector.interruptLeadership();
-            Assert.assertTrue(timing.awaitLatch(losingLeaderLatch));
+            assertTrue(timing.awaitLatch(losingLeaderLatch));
         }
         finally
         {
@@ -382,16 +386,16 @@
 
             selector.start();
 
-            Assert.assertTrue(timing.awaitLatch(debugLeadershipLatch));
+            assertTrue(timing.awaitLatch(debugLeadershipLatch));
             server.stop();
-            Assert.assertTrue(timing.awaitLatch(lostLatch));
+            assertTrue(timing.awaitLatch(lostLatch));
             timing.sleepABit();
             debugLeadershipWaitLatch.countDown();
 
             server.restart();
-            Assert.assertTrue(timing.awaitLatch(reconnectedLatch));
+            assertTrue(timing.awaitLatch(reconnectedLatch));
 
-            Assert.assertFalse(takeLeadershipLatch.await(3, TimeUnit.SECONDS));
+            assertFalse(takeLeadershipLatch.await(3, TimeUnit.SECONDS));
         }
         finally
         {
@@ -429,7 +433,7 @@
             selector.autoRequeue();
             selector.start();
 
-            Assert.assertTrue(timing.acquireSemaphore(semaphore, 2));
+            assertTrue(timing.acquireSemaphore(semaphore, 2));
         }
         finally
         {
@@ -528,20 +532,20 @@
             leaderSelector1.start();
             leaderSelector2.start();
 
-            Assert.assertTrue(timing.acquireSemaphore(semaphore, 1));
+            assertTrue(timing.acquireSemaphore(semaphore, 1));
 
             client.getZookeeperClient().getZooKeeper().getTestable().injectSessionExpiration();
 
-            Assert.assertTrue(timing.awaitLatch(interruptedLatch));
+            assertTrue(timing.awaitLatch(interruptedLatch));
             timing.sleepABit();
 
             boolean requeued1 = leaderSelector1.requeue();
             boolean requeued2 = leaderSelector2.requeue();
-            Assert.assertTrue(requeued1);
-            Assert.assertTrue(requeued2);
+            assertTrue(requeued1);
+            assertTrue(requeued2);
 
-            Assert.assertTrue(timing.acquireSemaphore(semaphore, 1));
-            Assert.assertEquals(leaderCount.get(), 1);
+            assertTrue(timing.acquireSemaphore(semaphore, 1));
+            assertEquals(leaderCount.get(), 1);
 
             if ( leaderSelector1.hasLeadership() )
             {
@@ -559,8 +563,8 @@
             }
 
             // Verify that the other leader took over leadership.
-            Assert.assertTrue(timing.acquireSemaphore(semaphore, 1));
-            Assert.assertEquals(leaderCount.get(), 1);
+            assertTrue(timing.acquireSemaphore(semaphore, 1));
+            assertEquals(leaderCount.get(), 1);
 
             if ( !leaderSelector1Closed )
             {
@@ -632,17 +636,17 @@
             leaderSelector1.start();
             leaderSelector2.start();
 
-            Assert.assertTrue(timing.acquireSemaphore(semaphore, 1));
+            assertTrue(timing.acquireSemaphore(semaphore, 1));
 
             int port = server.getPort();
             server.stop();
             timing.sleepABit();
             server = new TestingServer(port);
-            Assert.assertTrue(timing.awaitLatch(interruptedLatch));
+            assertTrue(timing.awaitLatch(interruptedLatch));
             timing.sleepABit();
 
-            Assert.assertTrue(timing.acquireSemaphore(semaphore, 1));
-            Assert.assertEquals(leaderCount.get(), 1);
+            assertTrue(timing.acquireSemaphore(semaphore, 1));
+            assertEquals(leaderCount.get(), 1);
 
             if ( leaderSelector1.hasLeadership() )
             {
@@ -660,8 +664,8 @@
             }
 
             // Verify that the other leader took over leadership.
-            Assert.assertTrue(timing.acquireSemaphore(semaphore, 1));
-            Assert.assertEquals(leaderCount.get(), 1);
+            assertTrue(timing.acquireSemaphore(semaphore, 1));
+            assertEquals(leaderCount.get(), 1);
 
             if ( !leaderSelector1Closed )
             {
@@ -722,7 +726,7 @@
                 Thread.sleep(1000);
             }
 
-            Assert.assertNotSame(leaderSelector1.hasLeadership(), leaderSelector2.hasLeadership());
+            assertNotSame(leaderSelector1.hasLeadership(), leaderSelector2.hasLeadership());
 
             LeaderSelector positiveLeader;
             LeaderSelector negativeLeader;
@@ -739,12 +743,12 @@
 
             negativeLeader.close();
             Thread.sleep(1000);
-            Assert.assertNotSame(positiveLeader.hasLeadership(), negativeLeader.hasLeadership());
-            Assert.assertTrue(positiveLeader.hasLeadership());
+            assertNotSame(positiveLeader.hasLeadership(), negativeLeader.hasLeadership());
+            assertTrue(positiveLeader.hasLeadership());
 
             positiveLeader.close();
             Thread.sleep(1000);
-            Assert.assertFalse(positiveLeader.hasLeadership());
+            assertFalse(positiveLeader.hasLeadership());
         }
         finally
         {
@@ -804,7 +808,7 @@
                 while ( localLeaderList.size() != (i * selectors.size()) )
                 {
                     Integer polledIndex = leaderList.poll(10, TimeUnit.SECONDS);
-                    Assert.assertNotNull(polledIndex);
+                    assertNotNull(polledIndex);
                     localLeaderList.add(polledIndex);
                 }
                 timing.sleepABit();
@@ -821,10 +825,10 @@
                 Set<Integer> uniques = Sets.newHashSet();
                 for ( int j = 0; j < selectors.size(); ++j )
                 {
-                    Assert.assertTrue(localLeaderList.size() > 0);
+                    assertTrue(localLeaderList.size() > 0);
 
                     int thisIndex = localLeaderList.remove(0);
-                    Assert.assertFalse(uniques.contains(thisIndex));
+                    assertFalse(uniques.contains(thisIndex));
                     uniques.add(thisIndex);
                 }
             }
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorCluster.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorCluster.java
index 6849816..10903ed 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorCluster.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorCluster.java
@@ -18,6 +18,10 @@
  */
 package org.apache.curator.framework.recipes.leader;
 
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.curator.framework.CuratorFramework;
@@ -28,8 +32,8 @@
 import org.apache.curator.test.TestingCluster;
 import org.apache.curator.test.Timing;
 import org.apache.curator.utils.ZKPaths;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.Collection;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
@@ -58,7 +62,7 @@
                 public void takeLeadership(CuratorFramework client) throws Exception
                 {
                     List<String>        names = client.getChildren().forPath("/leader");
-                    Assert.assertTrue(names.size() > 0);
+                    assertTrue(names.size() > 0);
                     semaphore.release();
                 }
 
@@ -70,12 +74,12 @@
             LeaderSelector      selector = new LeaderSelector(client, "/leader", listener);
             selector.autoRequeue();
             selector.start();
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
+            assertTrue(timing.acquireSemaphore(semaphore));
 
             InstanceSpec connectionInstance = cluster.findConnectionInstance(client.getZookeeperClient().getZooKeeper());
             cluster.killServer(connectionInstance);
 
-            Assert.assertTrue(timing.multiple(4).acquireSemaphore(semaphore));
+            assertTrue(timing.multiple(4).acquireSemaphore(semaphore));
         }
         finally
         {
@@ -142,7 +146,7 @@
             };
             LeaderSelector      selector = new LeaderSelector(client, "/leader", listener);
             selector.start();
-            Assert.assertTrue(timing.multiple(4).acquireSemaphore(semaphore));
+            assertTrue(timing.multiple(4).acquireSemaphore(semaphore));
             if ( error.get() != null )
             {
                 throw new AssertionError(error.get());
@@ -151,11 +155,11 @@
             Collection<InstanceSpec>    instances = cluster.getInstances();
             cluster.stop();
 
-            Assert.assertTrue(timing.multiple(4).awaitLatch(lostLatch));
+            assertTrue(timing.multiple(4).awaitLatch(lostLatch));
             timing.sleepABit();
-            Assert.assertFalse(selector.hasLeadership());
+            assertFalse(selector.hasLeadership());
 
-            Assert.assertNotNull(lockNode.get());
+            assertNotNull(lockNode.get());
             
             cluster = new TestingCluster(instances.toArray(new InstanceSpec[instances.size()]));
             cluster.start();
@@ -169,11 +173,11 @@
                 // ignore
             }
 
-            Assert.assertTrue(semaphore.availablePermits() == 0);
-            Assert.assertFalse(selector.hasLeadership());
+            assertTrue(semaphore.availablePermits() == 0);
+            assertFalse(selector.hasLeadership());
 
             selector.requeue();
-            Assert.assertTrue(timing.multiple(4).acquireSemaphore(semaphore));
+            assertTrue(timing.multiple(4).acquireSemaphore(semaphore));
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorEdges.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorEdges.java
index 9841677..003f383 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorEdges.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorEdges.java
@@ -19,6 +19,10 @@
 
 package org.apache.curator.framework.recipes.leader;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.api.BackgroundCallback;
@@ -26,16 +30,14 @@
 import org.apache.curator.framework.state.ConnectionState;
 import org.apache.curator.retry.RetryNTimes;
 import org.apache.curator.test.BaseClassForTests;
-import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.zookeeper.CreateMode;
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.server.ServerCnxnFactory;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -46,13 +48,13 @@
 {
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    @BeforeClass
+    @BeforeAll
     public static void setCNXFactory()
     {
         System.setProperty(ServerCnxnFactory.ZOOKEEPER_SERVER_CNXN_FACTORY, ChaosMonkeyCnxnFactory.class.getName());
     }
 
-    @AfterClass
+    @AfterAll
     public static void resetCNXFactory()
     {
         System.clearProperty(ServerCnxnFactory.ZOOKEEPER_SERVER_CNXN_FACTORY);
@@ -86,20 +88,20 @@
             leaderSelector1.start();
             // At this point the ChaosMonkeyZookeeperServer must close the connection
             // right after the lock znode is created.
-            Assert.assertTrue(listener.reconnected.await(10, TimeUnit.SECONDS), "Connection has not been lost");
+            assertTrue(listener.reconnected.await(10, TimeUnit.SECONDS), "Connection has not been lost");
             // Check that leader ship has failed
-            Assert.assertEquals(listener.takeLeadership.getCount(), 1);
+            assertEquals(listener.takeLeadership.getCount(), 1);
             // Wait FailedDelete
             Thread.sleep(ChaosMonkeyCnxnFactory.LOCKOUT_DURATION_MS * 2);
             // Check that there is no znode
             final int children = client.getChildren().forPath(ChaosMonkeyCnxnFactory.CHAOS_ZNODE).size();
-            Assert.assertEquals(children, 0,
+            assertEquals(children, 0,
                 "Still " + children + " znodes under " + ChaosMonkeyCnxnFactory.CHAOS_ZNODE + " lock");
             // Check that a new LeaderSelector can be started
             leaderSelector2 = new LeaderSelector(client, ChaosMonkeyCnxnFactory.CHAOS_ZNODE,
                 listener);
             leaderSelector2.start();
-            Assert.assertTrue(listener.takeLeadership.await(1, TimeUnit.SECONDS));
+            assertTrue(listener.takeLeadership.await(1, TimeUnit.SECONDS));
         }
         finally
         {
@@ -109,7 +111,7 @@
             }
             catch ( IllegalStateException e )
             {
-                Assert.fail(e.getMessage());
+                fail(e.getMessage());
             }
             try
             {
@@ -120,7 +122,7 @@
             }
             catch ( IllegalStateException e )
             {
-                Assert.fail(e.getMessage());
+                fail(e.getMessage());
             }
             client.close();
         }
@@ -187,12 +189,12 @@
                              )
                 .forPath(ChaosMonkeyCnxnFactory.CHAOS_ZNODE_PREFIX + "foo-");
 
-            Assert.assertTrue(latch.await(30, TimeUnit.SECONDS), "Callback has not been called");
+            assertTrue(latch.await(30, TimeUnit.SECONDS), "Callback has not been called");
             // Wait for the znode to be deleted
             Thread.sleep(ChaosMonkeyCnxnFactory.LOCKOUT_DURATION_MS * 2);
             // Check that there is no znode
             final int children = client.getChildren().forPath(ChaosMonkeyCnxnFactory.CHAOS_ZNODE).size();
-            Assert.assertEquals(children, 0,
+            assertEquals(children, 0,
                 "Still " + children + " znodes under " + ChaosMonkeyCnxnFactory.CHAOS_ZNODE + " lock");
         }
         finally
@@ -239,12 +241,12 @@
                              )
                 .forPath(ChaosMonkeyCnxnFactory.CHAOS_ZNODE_PREFIX + "foo-");
 
-            Assert.assertTrue(latch.await(30, TimeUnit.SECONDS), "Callback has not been called");
+            assertTrue(latch.await(30, TimeUnit.SECONDS), "Callback has not been called");
             // Wait for the znode to be deleted
             Thread.sleep(ChaosMonkeyCnxnFactory.LOCKOUT_DURATION_MS * 2);
             // Check that there is no znode
             final int children = client.getChildren().forPath(ChaosMonkeyCnxnFactory.CHAOS_ZNODE).size();
-            Assert.assertEquals(children, 0,
+            assertEquals(children, 0,
                 "Still " + children + " znodes under " + ChaosMonkeyCnxnFactory.CHAOS_ZNODE + " lock");
         }
         finally
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorParticipants.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorParticipants.java
index e026f87..d80b93f 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorParticipants.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorParticipants.java
@@ -18,6 +18,9 @@
  */
 package org.apache.curator.framework.recipes.leader;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import org.apache.curator.test.BaseClassForTests;
@@ -26,8 +29,8 @@
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.state.ConnectionState;
 import org.apache.curator.retry.RetryOneTime;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.Collection;
 import java.util.List;
 import java.util.Set;
@@ -64,16 +67,16 @@
             selector.setId("A is A");
             selector.start();
 
-            Assert.assertTrue(latch.await(10, TimeUnit.SECONDS));
+            assertTrue(latch.await(10, TimeUnit.SECONDS));
 
             Participant leader = selector.getLeader();
-            Assert.assertTrue(leader.isLeader());
-            Assert.assertEquals(leader.getId(), "A is A");
+            assertTrue(leader.isLeader());
+            assertEquals(leader.getId(), "A is A");
 
             Collection<Participant>     participants = selector.getParticipants();
-            Assert.assertEquals(participants.size(), 1);
-            Assert.assertEquals(participants.iterator().next().getId(), "A is A");
-            Assert.assertEquals(participants.iterator().next().getId(), selector.getId());
+            assertEquals(participants.size(), 1);
+            assertEquals(participants.iterator().next().getId(), "A is A");
+            assertEquals(participants.iterator().next().getId(), selector.getId());
         }
         finally
         {
@@ -130,15 +133,15 @@
                 selector.start();
             }
 
-            Assert.assertTrue(leaderLatch.await(10, TimeUnit.SECONDS));
-            Assert.assertTrue(workingLatch.await(10, TimeUnit.SECONDS));
+            assertTrue(leaderLatch.await(10, TimeUnit.SECONDS));
+            assertTrue(workingLatch.await(10, TimeUnit.SECONDS));
             
             Thread.sleep(1000); // some time for locks to acquire
 
             Collection<Participant>     participants = selectors.get(0).getParticipants();
             for ( int i = 1; i < selectors.size(); ++i )
             {
-                Assert.assertEquals(participants, selectors.get(i).getParticipants());
+                assertEquals(participants, selectors.get(i).getParticipants());
             }
 
             Set<String>                 ids = Sets.newHashSet();
@@ -149,17 +152,17 @@
                 {
                     ++leaderCount;
                 }
-                Assert.assertFalse(ids.contains(participant.getId()));
+                assertFalse(ids.contains(participant.getId()));
                 ids.add(participant.getId());
             }
-            Assert.assertEquals(leaderCount, 1);
+            assertEquals(leaderCount, 1);
 
             Set<String>                 expectedIds = Sets.newHashSet();
             for ( int i = 0; i < SELECTOR_QTY; ++i )
             {
                 expectedIds.add(Integer.toString(i));
             }
-            Assert.assertEquals(expectedIds, ids);
+            assertEquals(expectedIds, ids);
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorWithExecutor.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorWithExecutor.java
index 214931b..cd77f18 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorWithExecutor.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/TestLeaderSelectorWithExecutor.java
@@ -18,6 +18,8 @@
  */
 package org.apache.curator.framework.recipes.leader;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.curator.framework.CuratorFramework;
@@ -26,8 +28,8 @@
 import org.apache.curator.retry.ExponentialBackoffRetry;
 import org.apache.curator.test.Timing;
 import org.apache.curator.utils.ThreadUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadFactory;
@@ -61,7 +63,7 @@
 
             timing.sleepABit();
 
-            Assert.assertEquals(listener.getLeaderCount(), 1);
+            assertEquals(listener.getLeaderCount(), 1);
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMultiMutex.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMultiMutex.java
index dceff88..faf0f7f 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMultiMutex.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMultiMutex.java
@@ -18,12 +18,16 @@
  */
 package org.apache.curator.framework.recipes.locks;
 
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.imps.TestCleanState;
 import org.apache.curator.retry.RetryOneTime;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.concurrent.TimeUnit;
@@ -81,14 +85,14 @@
             {
                 lock.acquire();
                 lock.release();
-                Assert.fail();
+                fail();
             }
             catch ( Exception e )
             {
                 // ignore
             }
-            Assert.assertFalse(goodLock.isAcquiredInThisProcess());
-            Assert.assertTrue(otherGoodLock.isAcquiredInThisProcess());
+            assertFalse(goodLock.isAcquiredInThisProcess());
+            assertTrue(otherGoodLock.isAcquiredInThisProcess());
         }
         finally
         {
@@ -140,14 +144,14 @@
             try
             {
                 lock.acquire();
-                Assert.fail();
+                fail();
             }
             catch ( Exception e )
             {
                 // ignore
             }
-            Assert.assertFalse(goodLock.isAcquiredInThisProcess());
-            Assert.assertTrue(goodLockWasLocked.get());
+            assertFalse(goodLock.isAcquiredInThisProcess());
+            assertTrue(goodLockWasLocked.get());
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMutex.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMutex.java
index 12434ef..b5c30ae 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMutex.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMutex.java
@@ -19,6 +19,10 @@
 
 package org.apache.curator.framework.recipes.locks;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Lists;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -28,8 +32,8 @@
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.zookeeper.CreateMode;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.Collection;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CountDownLatch;
@@ -118,13 +122,13 @@
                         @Override
                         public Void call() throws Exception
                         {
-                            Assert.assertTrue(lockLatch.await(10, TimeUnit.SECONDS));
+                            assertTrue(lockLatch.await(10, TimeUnit.SECONDS));
                             Collection<String> nodes = lock.getParticipantNodes();
-                            Assert.assertEquals(nodes.size(), 1);
+                            assertEquals(nodes.size(), 1);
                             Revoker.attemptRevoke(client, nodes.iterator().next());
 
                             InterProcessMutex l2 = new InterProcessMutex(client, LOCK_PATH);
-                            Assert.assertTrue(l2.acquire(5, TimeUnit.SECONDS));
+                            assertTrue(l2.acquire(5, TimeUnit.SECONDS));
                             l2.release();
                             return null;
                         }
@@ -168,16 +172,16 @@
 
             // Get a persistent lock
             lock.acquire(10, TimeUnit.SECONDS);
-            Assert.assertTrue(lock.isAcquiredInThisProcess());
+            assertTrue(lock.isAcquiredInThisProcess());
 
             // Kill the session, check that lock node still exists
             client.getZookeeperClient().getZooKeeper().getTestable().injectSessionExpiration();
-            Assert.assertNotNull(client.checkExists().forPath(LOCK_PATH));
+            assertNotNull(client.checkExists().forPath(LOCK_PATH));
 
             // Release the lock and verify that the actual lock node created no longer exists
             String actualLockPath = lock.getLockPath();
             lock.release();
-            Assert.assertNull(client.checkExists().forPath(actualLockPath));
+            assertNull(client.checkExists().forPath(actualLockPath));
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMutexBase.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMutexBase.java
index 6e3b6ed..3a25e28 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMutexBase.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessMutexBase.java
@@ -19,6 +19,11 @@
 
 package org.apache.curator.framework.recipes.locks;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import com.google.common.collect.Lists;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -32,8 +37,8 @@
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.curator.utils.ZKPaths;
 import org.apache.zookeeper.KeeperException;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CountDownLatch;
@@ -67,9 +72,9 @@
             InterProcessLock lock = makeLock(client);
             try ( Locker locker = new Locker(lock, timing.milliseconds(), TimeUnit.MILLISECONDS) )
             {
-                Assert.assertTrue(lock.isAcquiredInThisProcess());
+                assertTrue(lock.isAcquiredInThisProcess());
             }
-            Assert.assertFalse(lock.isAcquiredInThisProcess());
+            assertFalse(lock.isAcquiredInThisProcess());
         }
         finally
         {
@@ -121,7 +126,7 @@
                                     timing.sleepABit();
 
                                     server.stop();
-                                    Assert.assertTrue(timing.forWaiting().awaitLatch(latch));
+                                    assertTrue(timing.forWaiting().awaitLatch(latch));
                                     server.restart();
                                 }
                             }
@@ -144,7 +149,7 @@
 
             for ( int i = 0; i < 2; ++i )
             {
-                Assert.assertEquals(service.take().get(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), result);
+                assertEquals(service.take().get(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS), result);
             }
         }
         finally
@@ -197,9 +202,9 @@
                     }
                 );
 
-            Assert.assertTrue(timing.acquireSemaphore(semaphore, 1));
+            assertTrue(timing.acquireSemaphore(semaphore, 1));
             client.getZookeeperClient().getZooKeeper().getTestable().injectSessionExpiration();
-            Assert.assertTrue(timing.forSessionSleep().acquireSemaphore(semaphore, 1));
+            assertTrue(timing.forSessionSleep().acquireSemaphore(semaphore, 1));
         }
         finally
         {
@@ -266,7 +271,7 @@
 
                 new Timing().sleepABit();
 
-                Assert.assertNull(client.checkExists().forPath(LOCK_BASE_PATH));
+                assertNull(client.checkExists().forPath(LOCK_BASE_PATH));
             }
             finally
             {
@@ -334,7 +339,7 @@
                                 mutex.acquire();
                                 try
                                 {
-                                    Assert.assertTrue(hasLock.compareAndSet(false, true));
+                                    assertTrue(hasLock.compareAndSet(false, true));
                                     if ( isFirst.compareAndSet(true, false) )
                                     {
                                         semaphore.release(THREAD_QTY - 1);
@@ -389,11 +394,11 @@
                         @Override
                         public Object call() throws Exception
                         {
-                            Assert.assertTrue(countLatchForBar.await(10, TimeUnit.SECONDS));
+                            assertTrue(countLatchForBar.await(10, TimeUnit.SECONDS));
                             try
                             {
                                 mutex.acquire(10, TimeUnit.SECONDS);
-                                Assert.fail();
+                                fail();
                             }
                             catch ( Exception e )
                             {
@@ -409,7 +414,7 @@
                 );
 
             foo(mutex);
-            Assert.assertFalse(mutex.isAcquiredInThisProcess());
+            assertFalse(mutex.isAcquiredInThisProcess());
         }
         finally
         {
@@ -426,7 +431,7 @@
         {
             InterProcessLock mutex = makeLock(client);
             foo(mutex);
-            Assert.assertFalse(mutex.isAcquiredInThisProcess());
+            assertFalse(mutex.isAcquiredInThisProcess());
         }
         finally
         {
@@ -437,32 +442,32 @@
     private void foo(InterProcessLock mutex) throws Exception
     {
         mutex.acquire(10, TimeUnit.SECONDS);
-        Assert.assertTrue(mutex.isAcquiredInThisProcess());
+        assertTrue(mutex.isAcquiredInThisProcess());
         bar(mutex);
-        Assert.assertTrue(mutex.isAcquiredInThisProcess());
+        assertTrue(mutex.isAcquiredInThisProcess());
         mutex.release();
     }
 
     private void bar(InterProcessLock mutex) throws Exception
     {
         mutex.acquire(10, TimeUnit.SECONDS);
-        Assert.assertTrue(mutex.isAcquiredInThisProcess());
+        assertTrue(mutex.isAcquiredInThisProcess());
         if ( countLatchForBar != null )
         {
             countLatchForBar.countDown();
             waitLatchForBar.await(10, TimeUnit.SECONDS);
         }
         snafu(mutex);
-        Assert.assertTrue(mutex.isAcquiredInThisProcess());
+        assertTrue(mutex.isAcquiredInThisProcess());
         mutex.release();
     }
 
     private void snafu(InterProcessLock mutex) throws Exception
     {
         mutex.acquire(10, TimeUnit.SECONDS);
-        Assert.assertTrue(mutex.isAcquiredInThisProcess());
+        assertTrue(mutex.isAcquiredInThisProcess());
         mutex.release();
-        Assert.assertTrue(mutex.isAcquiredInThisProcess());
+        assertTrue(mutex.isAcquiredInThisProcess());
     }
 
     @Test
@@ -536,13 +541,13 @@
             while ( !mutexForClient1.isAcquiredInThisProcess() && !mutexForClient2.isAcquiredInThisProcess() )
             {
                 Thread.sleep(1000);
-                Assert.assertFalse(future1.isDone() && future2.isDone());
+                assertFalse(future1.isDone() && future2.isDone());
             }
 
-            Assert.assertTrue(mutexForClient1.isAcquiredInThisProcess() != mutexForClient2.isAcquiredInThisProcess());
+            assertTrue(mutexForClient1.isAcquiredInThisProcess() != mutexForClient2.isAcquiredInThisProcess());
             Thread.sleep(1000);
-            Assert.assertTrue(mutexForClient1.isAcquiredInThisProcess() || mutexForClient2.isAcquiredInThisProcess());
-            Assert.assertTrue(mutexForClient1.isAcquiredInThisProcess() != mutexForClient2.isAcquiredInThisProcess());
+            assertTrue(mutexForClient1.isAcquiredInThisProcess() || mutexForClient2.isAcquiredInThisProcess());
+            assertTrue(mutexForClient1.isAcquiredInThisProcess() != mutexForClient2.isAcquiredInThisProcess());
 
             Exception exception = exceptionRef.get();
             if ( exception != null )
@@ -553,14 +558,14 @@
             if ( mutexForClient1.isAcquiredInThisProcess() )
             {
                 latchForClient1.countDown();
-                Assert.assertTrue(acquiredLatchForClient2.await(10, TimeUnit.SECONDS));
-                Assert.assertTrue(mutexForClient2.isAcquiredInThisProcess());
+                assertTrue(acquiredLatchForClient2.await(10, TimeUnit.SECONDS));
+                assertTrue(mutexForClient2.isAcquiredInThisProcess());
             }
             else
             {
                 latchForClient2.countDown();
-                Assert.assertTrue(acquiredLatchForClient1.await(10, TimeUnit.SECONDS));
-                Assert.assertTrue(mutexForClient1.isAcquiredInThisProcess());
+                assertTrue(acquiredLatchForClient1.await(10, TimeUnit.SECONDS));
+                assertTrue(mutexForClient1.isAcquiredInThisProcess());
             }
 
             future1.get();
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessReadWriteLock.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessReadWriteLock.java
index 48e4805..a601241 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessReadWriteLock.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessReadWriteLock.java
@@ -19,14 +19,19 @@
 
 package org.apache.curator.framework.recipes.locks;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Lists;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.imps.TestCleanState;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.BaseClassForTests;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.Collection;
 import java.util.List;
 import java.util.Random;
@@ -92,7 +97,7 @@
                         @Override
                         public Void call() throws Exception
                         {
-                            Assert.assertTrue(readLatch.await(10, TimeUnit.SECONDS));
+                            assertTrue(readLatch.await(10, TimeUnit.SECONDS));
                             latch.countDown();  // must be before as there can only be one writer
                             lock.writeLock().acquire();
                             try
@@ -109,13 +114,13 @@
                 );
             }
 
-            Assert.assertTrue(latch.await(10, TimeUnit.SECONDS));
+            assertTrue(latch.await(10, TimeUnit.SECONDS));
 
             Collection<String> readers = lock.readLock().getParticipantNodes();
             Collection<String> writers = lock.writeLock().getParticipantNodes();
 
-            Assert.assertEquals(readers.size(), READERS);
-            Assert.assertEquals(writers.size(), WRITERS);
+            assertEquals(readers.size(), READERS);
+            assertEquals(writers.size(), WRITERS);
 
             exitLatch.countDown();
             for ( int i = 0; i < (READERS + WRITERS); ++i )
@@ -139,7 +144,7 @@
 
             InterProcessReadWriteLock lock = new InterProcessReadWriteLock(client, "/lock");
             lock.readLock().acquire();
-            Assert.assertFalse(lock.writeLock().acquire(5, TimeUnit.SECONDS));
+            assertFalse(lock.writeLock().acquire(5, TimeUnit.SECONDS));
 
             lock.readLock().release();
         }
@@ -193,8 +198,8 @@
                         @Override
                         public Object call() throws Exception
                         {
-                            Assert.assertTrue(latch.await(10, TimeUnit.SECONDS));
-                            Assert.assertFalse(lock.readLock().acquire(5, TimeUnit.SECONDS));
+                            assertTrue(latch.await(10, TimeUnit.SECONDS));
+                            assertFalse(lock.readLock().acquire(5, TimeUnit.SECONDS));
                             return null;
                         }
                     }
@@ -220,7 +225,7 @@
 
             InterProcessReadWriteLock lock = new InterProcessReadWriteLock(client, "/lock");
             lock.writeLock().acquire();
-            Assert.assertTrue(lock.readLock().acquire(5, TimeUnit.SECONDS));
+            assertTrue(lock.readLock().acquire(5, TimeUnit.SECONDS));
             lock.writeLock().release();
 
             lock.readLock().release();
@@ -291,9 +296,9 @@
 
         System.out.println("Writes: " + writeCount.get() + " - Reads: " + readCount.get() + " - Max Reads: " + maxConcurrentCount.get());
 
-        Assert.assertTrue(writeCount.get() > 0);
-        Assert.assertTrue(readCount.get() > 0);
-        Assert.assertTrue(maxConcurrentCount.get() > 1);
+        assertTrue(writeCount.get() > 0);
+        assertTrue(readCount.get() > 0);
+        assertTrue(maxConcurrentCount.get() > 1);
     }
 
     @Test
@@ -315,11 +320,11 @@
             lock.writeLock().acquire();
 
             List<String> children = client.getChildren().forPath("/lock");
-            Assert.assertEquals(1, children.size());
+            assertEquals(1, children.size());
 
             byte dataInZk[] = client.getData().forPath("/lock/" + children.get(0));
-            Assert.assertNotNull(dataInZk);
-            Assert.assertEquals(new byte[]{1, 2, 3, 4}, dataInZk);
+            assertNotNull(dataInZk);
+            assertArrayEquals(new byte[]{1, 2, 3, 4}, dataInZk);
 
             lock.writeLock().release();
         }
@@ -333,7 +338,7 @@
     {
         try
         {
-            Assert.assertTrue(lock.acquire(10, TimeUnit.SECONDS));
+            assertTrue(lock.acquire(10, TimeUnit.SECONDS));
             int localConcurrentCount;
             synchronized(this)
             {
@@ -344,7 +349,7 @@
                 }
             }
 
-            Assert.assertTrue(localConcurrentCount <= maxAllowed, "" + localConcurrentCount);
+            assertTrue(localConcurrentCount <= maxAllowed, "" + localConcurrentCount);
 
             Thread.sleep(random.nextInt(9) + 1);
         }
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessSemaphore.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessSemaphore.java
index ce9f8fa..edd649b 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessSemaphore.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessSemaphore.java
@@ -19,6 +19,11 @@
 
 package org.apache.curator.framework.recipes.locks;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Queues;
 import org.apache.curator.framework.CuratorFramework;
@@ -28,7 +33,6 @@
 import org.apache.curator.framework.recipes.shared.SharedCount;
 import org.apache.curator.framework.state.ConnectionState;
 import org.apache.curator.framework.state.ConnectionStateListener;
-import org.apache.curator.retry.RetryNTimes;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.test.Timing;
@@ -36,8 +40,8 @@
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.WatchedEvent;
 import org.apache.zookeeper.Watcher;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.Collection;
 import java.util.List;
 import java.util.Random;
@@ -128,7 +132,7 @@
             {
                 executor.execute(runner);
             }
-            Assert.assertTrue(timing.awaitLatch(isReadyLatch));
+            assertTrue(timing.awaitLatch(isReadyLatch));
             timing.sleepABit();
 
             final CountDownLatch lostLatch = new CountDownLatch(1);
@@ -150,20 +154,20 @@
             });
       
             server.stop();
-            Assert.assertTrue(timing.multiple(1.25).awaitLatch(lostLatch));
+            assertTrue(timing.multiple(1.25).awaitLatch(lostLatch));
             InterProcessSemaphoreV2.debugAcquireLatch.countDown();  // the waiting semaphore proceeds to getChildren - which should fail
-            Assert.assertTrue(timing.awaitLatch(InterProcessSemaphoreV2.debugFailedGetChildrenLatch));  // wait until getChildren fails
+            assertTrue(timing.awaitLatch(InterProcessSemaphoreV2.debugFailedGetChildrenLatch));  // wait until getChildren fails
 
             server.restart();
 
-            Assert.assertTrue(timing.awaitLatch(restartedLatch));
+            assertTrue(timing.awaitLatch(restartedLatch));
             for ( int i = 0; i < NUM_CLIENTS; ++i )
             {
                 // acquires should continue as normal after server restart
                 Boolean polled = acquiredQueue.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS);
                 if ( (polled == null) || !polled )
                 {
-                    Assert.fail("Semaphores not reacquired after restart");
+                    fail("Semaphores not reacquired after restart");
                 }
             }
         }
@@ -200,10 +204,10 @@
                         public Object call() throws Exception
                         {
                             Lease lease = semaphore.acquire(timing.seconds(), TimeUnit.SECONDS);
-                            Assert.assertNotNull(lease);
+                            assertNotNull(lease);
                             latch1.countDown();
                             lease = semaphore.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS);
-                            Assert.assertNotNull(lease);
+                            assertNotNull(lease);
                             latch2.countDown();
                             return null;
                         }
@@ -216,12 +220,12 @@
                         @Override
                         public Object call() throws Exception
                         {
-                            Assert.assertTrue(latch1.await(timing.forWaiting().seconds(), TimeUnit.SECONDS));
+                            assertTrue(latch1.await(timing.forWaiting().seconds(), TimeUnit.SECONDS));
                             timing.sleepABit(); // make sure second acquire is waiting
-                            Assert.assertTrue(count.trySetCount(2));
+                            assertTrue(count.trySetCount(2));
                             //Make sure second acquire takes less than full waiting time:
                             timing.sleepABit();
-                            Assert.assertTrue(latch2.await(0, TimeUnit.SECONDS));
+                            assertTrue(latch2.await(0, TimeUnit.SECONDS));
                             return null;
                         }
                     }
@@ -258,16 +262,16 @@
             semaphore2 = new InterProcessSemaphoreV2(client2, "/test", 1);
 
             Lease lease = semaphore2.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS);
-            Assert.assertNotNull(lease);
+            assertNotNull(lease);
             lease.close();
 
             lease = semaphore1.acquire(10, TimeUnit.SECONDS);
-            Assert.assertNotNull(lease);
+            assertNotNull(lease);
 
             client1.close();    // should release any held leases
             client1 = null;
 
-            Assert.assertNotNull(semaphore2.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS));
+            assertNotNull(semaphore2.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS));
         }
         finally
         {
@@ -324,10 +328,10 @@
                                                 thisQty = (available.get() > 1) ? (random.nextInt(available.get()) + 1) : 1;
 
                                                 available.addAndGet(-1 * thisQty);
-                                                Assert.assertTrue(available.get() >= 0);
+                                                assertTrue(available.get() >= 0);
                                             }
                                             Collection<Lease> leases = semaphore.acquire(thisQty, timing.forWaiting().seconds(), TimeUnit.SECONDS);
-                                            Assert.assertNotNull(leases);
+                                            assertNotNull(leases);
                                             try
                                             {
                                                 synchronized(counter)
@@ -373,9 +377,9 @@
 
         synchronized(counter)
         {
-            Assert.assertTrue(counter.currentCount == 0);
-            Assert.assertTrue(counter.maxCount > 0);
-            Assert.assertTrue(counter.maxCount <= SESSION_MAX);
+            assertTrue(counter.currentCount == 0);
+            assertTrue(counter.maxCount > 0);
+            assertTrue(counter.maxCount <= SESSION_MAX);
             System.out.println(counter.maxCount);
         }
     }
@@ -407,7 +411,7 @@
                             {
                                 InterProcessSemaphoreV2 semaphore = new InterProcessSemaphoreV2(client, "/test", MAX);
                                 Lease lease = semaphore.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS);
-                                Assert.assertNotNull(lease);
+                                assertNotNull(lease);
                                 uses.incrementAndGet();
                                 try
                                 {
@@ -444,8 +448,8 @@
             f.get();
         }
 
-        Assert.assertEquals(uses.get(), CLIENT_QTY);
-        Assert.assertEquals(maxLeases.get(), MAX);
+        assertEquals(uses.get(), CLIENT_QTY);
+        assertEquals(maxLeases.get(), MAX);
     }
 
     @Test
@@ -524,9 +528,9 @@
             timing.sleepABit();
             synchronized(counter)
             {
-                Assert.assertTrue(counter.currentCount == 0);
-                Assert.assertTrue(counter.maxCount > 0);
-                Assert.assertTrue(counter.maxCount <= MAX_LEASES);
+                assertTrue(counter.currentCount == 0);
+                assertTrue(counter.maxCount > 0);
+                assertTrue(counter.maxCount <= MAX_LEASES);
                 System.out.println(counter.maxCount);
             }
         }
@@ -572,7 +576,7 @@
                     );
             }
             service.shutdown();
-            Assert.assertTrue(service.awaitTermination(10, TimeUnit.SECONDS));
+            assertTrue(service.awaitTermination(10, TimeUnit.SECONDS));
         }
         finally
         {
@@ -589,8 +593,8 @@
         try
         {
             InterProcessSemaphoreV2 semaphore = new InterProcessSemaphoreV2(client, "/test", 1);
-            Assert.assertNotNull(semaphore.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS));
-            Assert.assertNull(semaphore.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS));
+            assertNotNull(semaphore.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS));
+            assertNull(semaphore.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS));
         }
         finally
         {
@@ -613,16 +617,16 @@
             {
                 InterProcessSemaphoreV2 semaphore = new InterProcessSemaphoreV2(client, "/test", MAX_LEASES);
                 Lease lease = semaphore.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS);
-                Assert.assertNotNull(lease);
+                assertNotNull(lease);
                 leases.add(lease);
             }
 
             InterProcessSemaphoreV2 semaphore = new InterProcessSemaphoreV2(client, "/test", MAX_LEASES);
             Lease lease = semaphore.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS);
-            Assert.assertNull(lease);
+            assertNull(lease);
 
             leases.remove(0).close();
-            Assert.assertNotNull(semaphore.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS));
+            assertNotNull(semaphore.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS));
         }
         finally
         {
@@ -651,7 +655,7 @@
                 leases.add(semaphore.acquire());
             }
 
-            Assert.assertEquals(semaphore.getParticipantNodes().size(), LEASES);
+            assertEquals(semaphore.getParticipantNodes().size(), LEASES);
         }
         finally
         {
@@ -674,9 +678,9 @@
         {
             final InterProcessSemaphoreV2 semaphore = new InterProcessSemaphoreV2(client, "/test", 1);
             Lease lease = semaphore.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS);
-            Assert.assertNotNull(lease);
+            assertNotNull(lease);
             final List<String> childNodes = client.getChildren().forPath("/test/leases");
-            Assert.assertEquals(childNodes.size(), 1);
+            assertEquals(childNodes.size(), 1);
 
             final CountDownLatch nodeCreatedLatch = new CountDownLatch(1);
             client.getChildren().usingWatcher(new CuratorWatcher()
@@ -710,7 +714,7 @@
                     newNode = c;
                 }
             }
-            Assert.assertNotNull(newNode);
+            assertNotNull(newNode);
 
             // delete the ephemeral node to trigger a retry
             client.delete().forPath("/test/leases/" + newNode);
@@ -718,12 +722,12 @@
             // release first lease so second one can be acquired
             lease.close();
             lease = leaseFuture.get();
-            Assert.assertNotNull(lease);
+            assertNotNull(lease);
             lease.close();
-            Assert.assertEquals(client.getChildren().forPath("/test/leases").size(), 0);
+            assertEquals(client.getChildren().forPath("/test/leases").size(), 0);
 
             // no more lease exist. must be possible to acquire a new one
-            Assert.assertNotNull(semaphore.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS));
+            assertNotNull(semaphore.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS));
         }
         finally
         {
@@ -749,7 +753,7 @@
             
             // Acquire exclusive semaphore
             Lease lease = s1.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS);
-            Assert.assertNotNull(lease);
+            assertNotNull(lease);
             
             // Queue up another semaphore on the same path
             Future<Object> handle = Executors.newSingleThreadExecutor().submit(new Callable<Object>() {
@@ -762,18 +766,18 @@
             });
 
             // Wait until second lease is created and the wait is started for it to become active
-            Assert.assertTrue(timing.awaitLatch(debugWaitLatch));
+            assertTrue(timing.awaitLatch(debugWaitLatch));
             
             // Interrupt the wait
             handle.cancel(true);
             
             // Assert that the second lease is gone
             timing.sleepABit();
-            Assert.assertEquals(client.getChildren().forPath("/test/leases").size(), 1);
+            assertEquals(client.getChildren().forPath("/test/leases").size(), 1);
             
             // Assert that after closing the first (current) semaphore, we can acquire a new one
             s1.returnLease(lease);
-            Assert.assertNotNull(s3.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS));
+            assertNotNull(s3.acquire(timing.forWaiting().seconds(), TimeUnit.SECONDS));
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessSemaphoreCluster.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessSemaphoreCluster.java
index 3470eff..01bd332 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessSemaphoreCluster.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessSemaphoreCluster.java
@@ -18,6 +18,9 @@
  */
 package org.apache.curator.framework.recipes.locks;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Lists;
 import org.apache.curator.ensemble.EnsembleProvider;
 import org.apache.curator.framework.CuratorFramework;
@@ -32,8 +35,9 @@
 import org.apache.curator.test.Timing;
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.utils.CloseableUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.io.IOException;
 import java.util.Iterator;
 import java.util.List;
@@ -47,7 +51,7 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 
-@Test(groups = CuratorTestBase.zk35TestCompatibilityGroup)
+@Tag(CuratorTestBase.zk35TestCompatibilityGroup)
 public class TestInterProcessSemaphoreCluster extends BaseClassForTests
 {
     @Test
@@ -168,22 +172,22 @@
                 );
             }
 
-            Assert.assertTrue(timing.acquireSemaphore(acquiredSemaphore));
-            Assert.assertEquals(1, acquireCount.get());
+            assertTrue(timing.acquireSemaphore(acquiredSemaphore));
+            assertEquals(1, acquireCount.get());
 
             cluster.close();
             timing.awaitLatch(suspendedLatch);
             timing.forWaiting().sleepABit();
-            Assert.assertEquals(0, acquireCount.get());
+            assertEquals(0, acquireCount.get());
 
             cluster = createAndStartCluster(3);
 
             connectionString.set(cluster.getConnectString());
             timing.forWaiting().sleepABit();
 
-            Assert.assertTrue(timing.acquireSemaphore(acquiredSemaphore));
+            assertTrue(timing.acquireSemaphore(acquiredSemaphore));
             timing.forWaiting().sleepABit();
-            Assert.assertEquals(1, acquireCount.get());
+            assertEquals(1, acquireCount.get());
         }
         finally
         {
@@ -232,7 +236,7 @@
 
             timing.forWaiting().sleepABit();
 
-            Assert.assertNotNull(SemaphoreClient.getActiveClient());
+            assertNotNull(SemaphoreClient.getActiveClient());
 
             final CountDownLatch    latch = new CountDownLatch(1);
             CuratorFramework        client = CuratorFrameworkFactory.newClient(cluster.getConnectString(), timing.session(), timing.connection(), new ExponentialBackoffRetry(100, 3));
@@ -271,7 +275,7 @@
                 {
                     break;  // checking that the op count isn't increasing
                 }
-                Assert.assertTrue((System.currentTimeMillis() - startTicks) < timing.forWaiting().milliseconds());
+                assertTrue((System.currentTimeMillis() - startTicks) < timing.forWaiting().milliseconds());
             }
 
             int     thisOpCount = opCount.get();
@@ -289,7 +293,7 @@
                 {
                     break;  // checking that semaphore has started working again
                 }
-                Assert.assertTrue((System.currentTimeMillis() - startTicks) < timing.forWaiting().milliseconds());
+                assertTrue((System.currentTimeMillis() - startTicks) < timing.forWaiting().milliseconds());
             }
         }
         finally
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessSemaphoreMutex.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessSemaphoreMutex.java
index 90bd7da..d81d793 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessSemaphoreMutex.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestInterProcessSemaphoreMutex.java
@@ -19,26 +19,30 @@
 package org.apache.curator.framework.recipes.locks;
 
 import org.apache.curator.framework.CuratorFramework;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
 
 public class TestInterProcessSemaphoreMutex extends TestInterProcessMutexBase
 {
     private static final String LOCK_PATH = LOCK_BASE_PATH + "/our-lock";
 
     @Override
-    @Test(enabled = false)
+    @Test
+    @Disabled
     public void testReentrant()
     {
     }
 
     @Override
-    @Test(enabled = false)
+    @Test
+    @Disabled
     public void testReentrant2Threads()
     {
     }
 
     @Override
-    @Test(enabled = false)
+    @Test
+    @Disabled
     public void testReentrantSingleLock()
     {
     }
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestLockACLs.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestLockACLs.java
index 3676d6f..f110a97 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestLockACLs.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestLockACLs.java
@@ -19,6 +19,9 @@
 
 package org.apache.curator.framework.recipes.locks;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
 import org.apache.curator.framework.imps.TestCleanState;
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.utils.CloseableUtils;
@@ -30,8 +33,8 @@
 import org.apache.zookeeper.ZooDefs;
 import org.apache.zookeeper.data.ACL;
 import org.apache.zookeeper.data.Id;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.Collections;
 import java.util.List;
 
@@ -60,18 +63,18 @@
         try
         {
             client.create().forPath("/foo");
-            Assert.assertNotNull(client.checkExists().forPath("/foo"));
-            Assert.assertEquals(ZooDefs.Perms.ALL, client.getACL().forPath("/foo").get(0).getPerms());
-            Assert.assertEquals("ip", client.getACL().forPath("/foo").get(0).getId().getScheme());
-            Assert.assertEquals("127.0.0.1", client.getACL().forPath("/foo").get(0).getId().getId());
+            assertNotNull(client.checkExists().forPath("/foo"));
+            assertEquals(ZooDefs.Perms.ALL, client.getACL().forPath("/foo").get(0).getPerms());
+            assertEquals("ip", client.getACL().forPath("/foo").get(0).getId().getScheme());
+            assertEquals("127.0.0.1", client.getACL().forPath("/foo").get(0).getId().getId());
 
             InterProcessReadWriteLock lock = new InterProcessReadWriteLock(client, "/bar");
             InterProcessMutex writeLock = lock.writeLock();
             writeLock.acquire();
-            Assert.assertNotNull(client.checkExists().forPath("/bar"));
-            Assert.assertEquals(ZooDefs.Perms.ALL, client.getACL().forPath("/bar").get(0).getPerms());
-            Assert.assertEquals("ip", client.getACL().forPath("/bar").get(0).getId().getScheme());
-            Assert.assertEquals("127.0.0.1", client.getACL().forPath("/bar").get(0).getId().getId());
+            assertNotNull(client.checkExists().forPath("/bar"));
+            assertEquals(ZooDefs.Perms.ALL, client.getACL().forPath("/bar").get(0).getPerms());
+            assertEquals("ip", client.getACL().forPath("/bar").get(0).getId().getScheme());
+            assertEquals("127.0.0.1", client.getACL().forPath("/bar").get(0).getId().getId());
         }
         finally
         {
@@ -86,8 +89,8 @@
         try
         {
             client.create().creatingParentsIfNeeded().forPath("/parent/foo");
-            Assert.assertEquals(ZooDefs.Perms.CREATE | ZooDefs.Perms.READ, client.getACL().forPath("/parent").get(0).getPerms());
-            Assert.assertEquals(ZooDefs.Perms.ALL, client.getACL().forPath("/parent/foo").get(0).getPerms());
+            assertEquals(ZooDefs.Perms.CREATE | ZooDefs.Perms.READ, client.getACL().forPath("/parent").get(0).getPerms());
+            assertEquals(ZooDefs.Perms.ALL, client.getACL().forPath("/parent/foo").get(0).getPerms());
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestLockCleanlinessWithFaults.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestLockCleanlinessWithFaults.java
index dc14c11..d73e73c 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestLockCleanlinessWithFaults.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/locks/TestLockCleanlinessWithFaults.java
@@ -18,15 +18,17 @@
  */
 package org.apache.curator.framework.recipes.locks;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.imps.TestCleanState;
 import org.apache.curator.retry.RetryNTimes;
 import org.apache.curator.test.BaseClassForTests;
-import org.apache.curator.utils.CloseableUtils;
 import org.apache.zookeeper.KeeperException;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.List;
 
 public class TestLockCleanlinessWithFaults extends BaseClassForTests
@@ -43,7 +45,7 @@
             client.start();
 
             client.create().creatingParentsIfNeeded().forPath(PATH);
-            Assert.assertEquals(client.checkExists().forPath(PATH).getNumChildren(), 0);
+            assertEquals(client.checkExists().forPath(PATH).getNumChildren(), 0);
 
             LockInternals       internals = new LockInternals(client, new StandardLockInternalsDriver(), PATH, "lock-", 1)
             {
@@ -56,7 +58,7 @@
             try
             {
                 internals.attemptLock(0, null, null);
-                Assert.fail();
+                fail();
             }
             catch ( KeeperException.NoNodeException dummy )
             {
@@ -64,7 +66,7 @@
             }
 
             // make sure no nodes are left lying around
-            Assert.assertEquals(client.checkExists().forPath(PATH).getNumChildren(), 0);
+            assertEquals(client.checkExists().forPath(PATH).getNumChildren(), 0);
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestGroupMember.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestGroupMember.java
index 4395b36..1416533 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestGroupMember.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestGroupMember.java
@@ -18,6 +18,10 @@
  */
 package org.apache.curator.framework.recipes.nodes;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.base.Function;
 import com.google.common.collect.Maps;
 import org.apache.curator.framework.CuratorFramework;
@@ -27,11 +31,12 @@
 import org.apache.curator.test.Timing;
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.utils.CloseableUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.util.Map;
 
-@Test(groups = CuratorTestBase.zk35TestCompatibilityGroup)
+@Tag(CuratorTestBase.zk35TestCompatibilityGroup)
 public class TestGroupMember extends BaseClassForTests
 {
     // NOTE - don't need many tests as this class is just a wrapper around two existing recipes
@@ -48,7 +53,7 @@
             client.start();
 
             groupMember1 = new GroupMember(client, "/member", "1");
-            Assert.assertTrue(groupMember1.getCurrentMembers().containsKey("1"));
+            assertTrue(groupMember1.getCurrentMembers().containsKey("1"));
             groupMember1.start();
 
             groupMember2 = new GroupMember(client, "/member", "2");
@@ -74,27 +79,27 @@
                     return new String(input);
                 }
             });
-            Assert.assertEquals(convertMembers1.size(), 2);
-            Assert.assertEquals(convertMembers2.size(), 2);
-            Assert.assertEquals(convertMembers1, convertMembers2);
-            Assert.assertTrue(convertMembers1.containsKey("1"));
-            Assert.assertTrue(convertMembers1.containsKey("2"));
+            assertEquals(convertMembers1.size(), 2);
+            assertEquals(convertMembers2.size(), 2);
+            assertEquals(convertMembers1, convertMembers2);
+            assertTrue(convertMembers1.containsKey("1"));
+            assertTrue(convertMembers1.containsKey("2"));
 
             groupMember2.close();
 
             timing.sleepABit();
 
             currentMembers1 = groupMember1.getCurrentMembers();
-            Assert.assertEquals(currentMembers1.size(), 1);
-            Assert.assertTrue(currentMembers1.containsKey("1"));
-            Assert.assertFalse(currentMembers1.containsKey("2"));
+            assertEquals(currentMembers1.size(), 1);
+            assertTrue(currentMembers1.containsKey("1"));
+            assertFalse(currentMembers1.containsKey("2"));
 
             groupMember1.setThisData("something".getBytes());
 
             timing.sleepABit();
             currentMembers1 = groupMember1.getCurrentMembers();
-            Assert.assertTrue(currentMembers1.containsKey("1"));
-            Assert.assertEquals(currentMembers1.get("1"), "something".getBytes());
+            assertTrue(currentMembers1.containsKey("1"));
+            assertArrayEquals(currentMembers1.get("1"), "something".getBytes());
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java
index 7acde06..7e4835d 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNode.java
@@ -18,6 +18,13 @@
  */
 package org.apache.curator.framework.recipes.nodes;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
@@ -41,11 +48,10 @@
 import org.apache.zookeeper.ZooDefs;
 import org.apache.zookeeper.data.ACL;
 import org.apache.zookeeper.data.Stat;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.Test;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
@@ -56,8 +62,6 @@
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 
-import static org.testng.Assert.*;
-
 @SuppressWarnings("deprecation")
 public class TestPersistentEphemeralNode extends BaseClassForTests
 {
@@ -70,7 +74,7 @@
 
     private final Timing2 timing = new Timing2();
 
-    @AfterMethod
+    @AfterEach
     @Override
     public void teardown() throws Exception
     {
@@ -126,14 +130,14 @@
                 client.getConnectionStateListenable().addListener(listener);
                 timing.sleepABit();
                 server.restart();
-                Assert.assertTrue(timing.awaitLatch(connectedLatch));
+                assertTrue(timing.awaitLatch(connectedLatch));
                 timing.sleepABit();
-                Assert.assertTrue(node.waitForInitialCreate(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS));
+                assertTrue(node.waitForInitialCreate(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS));
                 server.stop();
                 timing.sleepABit();
                 server.restart();
                 timing.sleepABit();
-                Assert.assertTrue(timing.awaitLatch(reconnectedLatch));
+                assertTrue(timing.awaitLatch(reconnectedLatch));
             }
         }
         finally
@@ -174,11 +178,11 @@
 
             server.restart();
 
-            Assert.assertTrue(timing.awaitLatch(connectedLatch));
+            assertTrue(timing.awaitLatch(connectedLatch));
 
             timing.sleepABit();
 
-            Assert.assertTrue(node.waitForInitialCreate(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS));
+            assertTrue(node.waitForInitialCreate(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS));
         }
         finally
         {
@@ -187,31 +191,39 @@
         }
     }
 
-    @Test(expectedExceptions = NullPointerException.class)
-    public void testNullCurator() throws Exception
+    @Test
+    public void testNullCurator()
     {
-        new PersistentEphemeralNode(null, PersistentEphemeralNode.Mode.EPHEMERAL, PATH, new byte[0]);
+        assertThrows(NullPointerException.class, ()-> {
+            new PersistentEphemeralNode(null, PersistentEphemeralNode.Mode.EPHEMERAL, PATH, new byte[0]);
+        });
     }
 
-    @Test(expectedExceptions = IllegalArgumentException.class)
-    public void testNullPath() throws Exception
+    @Test
+    public void testNullPath()
     {
-        CuratorFramework curator = newCurator();
-        new PersistentEphemeralNode(curator, PersistentEphemeralNode.Mode.EPHEMERAL, null, new byte[0]);
+        assertThrows(IllegalArgumentException.class, ()-> {
+            CuratorFramework curator = newCurator();
+            new PersistentEphemeralNode(curator, PersistentEphemeralNode.Mode.EPHEMERAL, null, new byte[0]);
+        });
     }
 
-    @Test(expectedExceptions = NullPointerException.class)
-    public void testNullData() throws Exception
+    @Test
+    public void testNullData()
     {
-        CuratorFramework curator = newCurator();
-        new PersistentEphemeralNode(curator, PersistentEphemeralNode.Mode.EPHEMERAL, PATH, null);
+        assertThrows(NullPointerException.class, ()-> {
+            CuratorFramework curator = newCurator();
+            new PersistentEphemeralNode(curator, PersistentEphemeralNode.Mode.EPHEMERAL, PATH, null);
+        });
     }
 
-    @Test(expectedExceptions = NullPointerException.class)
-    public void testNullMode() throws Exception
+    @Test
+    public void testNullMode()
     {
-        CuratorFramework curator = newCurator();
-        new PersistentEphemeralNode(curator, null, PATH, new byte[0]);
+        assertThrows(NullPointerException.class, ()->{
+            CuratorFramework curator = newCurator();
+            new PersistentEphemeralNode(curator, null, PATH, new byte[0]);
+            });
     }
 
     @Test
@@ -236,9 +248,9 @@
             node = new PersistentEphemeralNode(client, mode, PATH, "a".getBytes());
             node.debugWaitMsForBackgroundBeforeClose.set(timing.forSleepingABit().milliseconds());
             node.start();
-            Assert.assertTrue(node.waitForInitialCreate(timing.forWaiting().seconds(), TimeUnit.SECONDS));
+            assertTrue(node.waitForInitialCreate(timing.forWaiting().seconds(), TimeUnit.SECONDS));
 
-            Assert.assertEquals(client.getData().forPath(node.getActualPath()), "a".getBytes());
+            assertArrayEquals(client.getData().forPath(node.getActualPath()), "a".getBytes());
 
             final Semaphore semaphore = new Semaphore(0);
             Watcher watcher = new Watcher()
@@ -251,15 +263,15 @@
             };
             client.checkExists().usingWatcher(watcher).forPath(node.getActualPath());
             node.setData("b".getBytes());
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
-            Assert.assertEquals(node.getActualPath(), node.getActualPath());
-            Assert.assertEquals(client.getData().usingWatcher(watcher).forPath(node.getActualPath()), "b".getBytes());
+            assertTrue(timing.acquireSemaphore(semaphore));
+            assertEquals(node.getActualPath(), node.getActualPath());
+            assertArrayEquals(client.getData().usingWatcher(watcher).forPath(node.getActualPath()), "b".getBytes());
             node.setData("c".getBytes());
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
-            Assert.assertEquals(node.getActualPath(), node.getActualPath());
-            Assert.assertEquals(client.getData().usingWatcher(watcher).forPath(node.getActualPath()), "c".getBytes());
+            assertTrue(timing.acquireSemaphore(semaphore));
+            assertEquals(node.getActualPath(), node.getActualPath());
+            assertArrayEquals(client.getData().usingWatcher(watcher).forPath(node.getActualPath()), "c".getBytes());
             node.close();
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
+            assertTrue(timing.acquireSemaphore(semaphore));
         }
         finally
         {
@@ -395,7 +407,7 @@
             {
                 Trigger deletionTrigger = Trigger.deletedOrSetData();
                 Stat stat = observer.checkExists().usingWatcher(deletionTrigger).forPath(path);
-                Assert.assertNotNull(stat, "node should exist: " + path);
+                assertNotNull(stat, "node should exist: " + path);
 
                 node.debugCreateNodeLatch = new CountDownLatch(1);
                 // Kill the session, thus cleaning up the node...
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNodeListener.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNodeListener.java
index 6771eec..6a411af 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNodeListener.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentEphemeralNodeListener.java
@@ -19,17 +19,19 @@
 
 package org.apache.curator.framework.recipes.nodes;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.state.ConnectionState;
 import org.apache.curator.framework.state.ConnectionStateListener;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.BaseClassForTests;
-import org.apache.curator.test.TestingServer;
 import org.apache.curator.test.Timing;
 import org.apache.curator.utils.CloseableUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
@@ -72,14 +74,14 @@
             client.getConnectionStateListenable().addListener(listener);
             timing.sleepABit();
             server.restart();
-            Assert.assertTrue(timing.awaitLatch(connectedLatch));
+            assertTrue(timing.awaitLatch(connectedLatch));
             timing.sleepABit();
-            Assert.assertTrue(node.waitForInitialCreate(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS));
+            assertTrue(node.waitForInitialCreate(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS));
             server.restart();
             timing.sleepABit();
-            Assert.assertTrue(timing.awaitLatch(reconnectedLatch));
+            assertTrue(timing.awaitLatch(reconnectedLatch));
             timing.sleepABit();
-            Assert.assertEquals(lastState.get(), ConnectionState.RECONNECTED);
+            assertEquals(lastState.get(), ConnectionState.RECONNECTED);
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentNode.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentNode.java
index b157000..620c9cc 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentNode.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentNode.java
@@ -18,6 +18,12 @@
  */
 package org.apache.curator.framework.recipes.nodes;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.RetryOneTime;
@@ -26,8 +32,7 @@
 import org.apache.curator.test.compatibility.Timing2;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.zookeeper.CreateMode;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
 
 import java.util.List;
 import java.util.concurrent.TimeUnit;
@@ -51,7 +56,7 @@
             try
             {
                 pen.setData(ALT_TEST_DATA);
-                Assert.fail("IllegalStateException should have been thrown");
+                fail("IllegalStateException should have been thrown");
             }
             catch ( IllegalStateException dummy )
             {
@@ -79,14 +84,14 @@
             pen = new PersistentNode(client, CreateMode.PERSISTENT, false, "/test", TEST_DATA);
             pen.debugWaitMsForBackgroundBeforeClose.set(timing.forSleepingABit().milliseconds());
             pen.start();
-            Assert.assertTrue(pen.waitForInitialCreate(timing.milliseconds(), TimeUnit.MILLISECONDS));
+            assertTrue(pen.waitForInitialCreate(timing.milliseconds(), TimeUnit.MILLISECONDS));
             client.close(); // cause session to end - force checks that node is persistent
 
             client = CuratorFrameworkFactory.newClient(server.getConnectString(), timing.session(), timing.connection(), new RetryOneTime(1));
             client.start();
 
             byte[] bytes = client.getData().forPath("/test");
-            Assert.assertEquals(bytes, TEST_DATA);
+            assertArrayEquals(bytes, TEST_DATA);
         }
         finally
         {
@@ -108,7 +113,7 @@
             pen.start();
             pen.close();
             timing.sleepABit();
-            Assert.assertNull(client.checkExists().forPath("/test/one/two"));
+            assertNull(client.checkExists().forPath("/test/one/two"));
         }
         finally
         {
@@ -132,7 +137,7 @@
             pen.start();
             pen.close();
             timing.sleepABit();
-            Assert.assertNull(client.checkExists().forPath("/test/one/two"));
+            assertNull(client.checkExists().forPath("/test/one/two"));
         }
         finally
         {
@@ -156,14 +161,14 @@
             pen.start();
             List<String> children = client.getChildren().forPath("/test/one");
             System.out.println("children before restart: "+children);
-            Assert.assertEquals(1, children.size());
+            assertEquals(1, children.size());
             server.stop();
             timing.sleepABit();
             server.restart();
             timing.sleepABit();
             List<String> childrenAfter = client.getChildren().forPath("/test/one");
             System.out.println("children after restart: "+childrenAfter);
-            Assert.assertEquals(children, childrenAfter, "unexpected znodes: "+childrenAfter);
+            assertEquals(children, childrenAfter, "unexpected znodes: "+childrenAfter);
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentTtlNode.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentTtlNode.java
index b95df11..040bb05 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentTtlNode.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/nodes/TestPersistentTtlNode.java
@@ -18,6 +18,11 @@
  */
 package org.apache.curator.framework.recipes.nodes;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.recipes.cache.PathChildrenCache;
@@ -27,11 +32,11 @@
 import org.apache.curator.test.Timing;
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.utils.ZKPaths;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 
@@ -42,12 +47,12 @@
     private final Timing timing = new Timing();
     private final long ttlMs = timing.multiple(.10).milliseconds(); // a small number
 
-    @BeforeClass
+    @BeforeAll
     public static void setUpClass() {
         System.setProperty("zookeeper.extendedTypesEnabled", "true");
     }
 
-    @BeforeMethod
+    @BeforeEach
     @Override
     public void setup() throws Exception
     {
@@ -55,7 +60,7 @@
         super.setup();
     }
 
-    @AfterMethod
+    @AfterEach
     @Override
     public void teardown() throws Exception
     {
@@ -73,18 +78,18 @@
             try (PersistentTtlNode node = new PersistentTtlNode(client, "/test", ttlMs, new byte[0]))
             {
                 node.start();
-                Assert.assertTrue(node.waitForInitialCreate(timing.session(), TimeUnit.MILLISECONDS));
+                assertTrue(node.waitForInitialCreate(timing.session(), TimeUnit.MILLISECONDS));
 
                 for ( int i = 0; i < 5; ++i )
                 {
                     Thread.sleep(ttlMs + (ttlMs / 2));  // sleep a bit more than the TTL
-                    Assert.assertNotNull(client.checkExists().forPath("/test"));
+                    assertNotNull(client.checkExists().forPath("/test"));
                 }
             }
-            Assert.assertNotNull(client.checkExists().forPath("/test"));
+            assertNotNull(client.checkExists().forPath("/test"));
 
             timing.sleepABit();
-            Assert.assertNull(client.checkExists().forPath("/test"));
+            assertNull(client.checkExists().forPath("/test"));
         }
     }
 
@@ -98,7 +103,7 @@
             try (PersistentTtlNode node = new PersistentTtlNode(client, "/test", ttlMs, new byte[0]))
             {
                 node.start();
-                Assert.assertTrue(node.waitForInitialCreate(timing.session(), TimeUnit.MILLISECONDS));
+                assertTrue(node.waitForInitialCreate(timing.session(), TimeUnit.MILLISECONDS));
 
                 for ( int i = 0; i < 5; ++i )
                 {
@@ -107,7 +112,7 @@
                 }
 
                 timing.sleepABit();
-                Assert.assertNotNull(client.checkExists().forPath("/test"));
+                assertNotNull(client.checkExists().forPath("/test"));
             }
         }
     }
@@ -138,23 +143,23 @@
                     cache.getListenable().addListener(listener);
 
                     node.start();
-                    Assert.assertTrue(node.waitForInitialCreate(timing.session(), TimeUnit.MILLISECONDS));
+                    assertTrue(node.waitForInitialCreate(timing.session(), TimeUnit.MILLISECONDS));
                     cache.start(BUILD_INITIAL_CACHE);
 
-                    Assert.assertEquals(changes.availablePermits(), 0);
+                    assertEquals(changes.availablePermits(), 0);
                     timing.sleepABit();
-                    Assert.assertEquals(changes.availablePermits(), 0);
+                    assertEquals(changes.availablePermits(), 0);
 
                     client.setData().forPath("/test", "changed".getBytes());
-                    Assert.assertTrue(timing.acquireSemaphore(changes));
+                    assertTrue(timing.acquireSemaphore(changes));
                     timing.sleepABit();
-                    Assert.assertEquals(changes.availablePermits(), 0);
+                    assertEquals(changes.availablePermits(), 0);
                 }
             }
 
             timing.sleepABit();
 
-            Assert.assertNull(client.checkExists().forPath("/test"));
+            assertNull(client.checkExists().forPath("/test"));
         }
     }
 }
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestBoundedDistributedQueue.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestBoundedDistributedQueue.java
index 80b4861..9547d41 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestBoundedDistributedQueue.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestBoundedDistributedQueue.java
@@ -18,6 +18,10 @@
  */
 package org.apache.curator.framework.recipes.queue;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.imps.CuratorFrameworkState;
@@ -28,8 +32,8 @@
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.zookeeper.WatchedEvent;
 import org.apache.zookeeper.Watcher;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.Callable;
@@ -180,7 +184,7 @@
 
             for ( int count : counts )
             {
-                Assert.assertTrue(count <= (MAX_ITEMS * CLIENT_QTY), counts.toString());
+                assertTrue(count <= (MAX_ITEMS * CLIENT_QTY), counts.toString());
             }
         }
         finally
@@ -235,16 +239,16 @@
             };
             queue.getPutListenerContainer().addListener(listener);
 
-            Assert.assertTrue(queue.put("1", timing.milliseconds(), TimeUnit.MILLISECONDS));   // should end up in consumer
-            Assert.assertTrue(queue.put("2", timing.milliseconds(), TimeUnit.MILLISECONDS));   // should sit blocking in DistributedQueue
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(queue.put("1", timing.milliseconds(), TimeUnit.MILLISECONDS));   // should end up in consumer
+            assertTrue(queue.put("2", timing.milliseconds(), TimeUnit.MILLISECONDS));   // should sit blocking in DistributedQueue
+            assertTrue(timing.awaitLatch(latch));
             timing.sleepABit();
-            Assert.assertFalse(queue.put("3", timing.multiple(.5).milliseconds(), TimeUnit.MILLISECONDS));
+            assertFalse(queue.put("3", timing.multiple(.5).milliseconds(), TimeUnit.MILLISECONDS));
 
             semaphore.release(100);
-            Assert.assertTrue(queue.put("3", timing.milliseconds(), TimeUnit.MILLISECONDS));
-            Assert.assertTrue(queue.put("4", timing.milliseconds(), TimeUnit.MILLISECONDS));
-            Assert.assertTrue(queue.put("5", timing.milliseconds(), TimeUnit.MILLISECONDS));
+            assertTrue(queue.put("3", timing.milliseconds(), TimeUnit.MILLISECONDS));
+            assertTrue(queue.put("4", timing.milliseconds(), TimeUnit.MILLISECONDS));
+            assertTrue(queue.put("5", timing.milliseconds(), TimeUnit.MILLISECONDS));
 
             for ( int i = 0; i < 5; ++i )
             {
@@ -256,7 +260,7 @@
             }
             timing.sleepABit();
 
-            Assert.assertEquals(messages, Arrays.asList("1", "2", "3", "4", "5"));
+            assertEquals(messages, Arrays.asList("1", "2", "3", "4", "5"));
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestDistributedDelayQueue.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestDistributedDelayQueue.java
index a76f449..f130a30 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestDistributedDelayQueue.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestDistributedDelayQueue.java
@@ -18,6 +18,11 @@
  */
 package org.apache.curator.framework.recipes.queue;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.curator.framework.CuratorFramework;
@@ -25,10 +30,8 @@
 import org.apache.curator.framework.state.ConnectionStateListener;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.Timing;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -54,14 +57,14 @@
 
             queue.put(1L, System.currentTimeMillis() + Integer.MAX_VALUE);  // never come out
             Long        value = consumer.take(1, TimeUnit.SECONDS);
-            Assert.assertNull(value);
+            assertNull(value);
 
             queue.put(2L, System.currentTimeMillis());
             value = consumer.take(timing.seconds(), TimeUnit.SECONDS);
-            Assert.assertEquals(value, Long.valueOf(2));
+            assertEquals(value, Long.valueOf(2));
 
             value = consumer.take(1, TimeUnit.SECONDS);
-            Assert.assertNull(value);
+            assertNull(value);
         }
         finally
         {
@@ -85,10 +88,10 @@
 
             queue.put(1L, System.currentTimeMillis() + 1000);
             Thread.sleep(100);
-            Assert.assertEquals(consumer.size(), 0);    // delay hasn't been reached
+            assertEquals(consumer.size(), 0);    // delay hasn't been reached
 
             Long        value = consumer.take(timing.forWaiting().seconds(), TimeUnit.SECONDS);
-            Assert.assertEquals(value, Long.valueOf(1));
+            assertEquals(value, Long.valueOf(1));
         }
         finally
         {
@@ -123,8 +126,8 @@
             for ( int i = 0; i < QTY; ++i )
             {
                 Long        value = consumer.take(timing.forWaiting().seconds(), TimeUnit.SECONDS);
-                Assert.assertNotNull(value);
-                Assert.assertTrue(value >= lastValue);
+                assertNotNull(value);
+                assertTrue(value >= lastValue);
                 lastValue = value;
             }
         }
@@ -188,8 +191,8 @@
             for ( int i = 0; i < QTY; ++i )
             {
                 Long value = consumer.take(DELAY_MS * 2, TimeUnit.MILLISECONDS);
-                Assert.assertNotNull(value);
-                Assert.assertEquals(value, new Long(lastValue + 1));
+                assertNotNull(value);
+                assertEquals(value, new Long(lastValue + 1));
                 lastValue = value;
             }
         }
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestDistributedIdQueue.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestDistributedIdQueue.java
index 24f74a1..c2a81ab 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestDistributedIdQueue.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestDistributedIdQueue.java
@@ -18,6 +18,8 @@
  */
 package org.apache.curator.framework.recipes.queue;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Lists;
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.utils.CloseableUtils;
@@ -26,9 +28,8 @@
 import org.apache.curator.framework.state.ConnectionState;
 import org.apache.curator.framework.state.ConnectionStateListener;
 import org.apache.curator.retry.RetryOneTime;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
-import org.testng.Assert;
-import org.testng.annotations.Test;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
@@ -70,8 +71,8 @@
 
             queue.put(new TestQueueItem("test"), "id");
             
-            Assert.assertTrue(consumingLatch.await(10, TimeUnit.SECONDS));  // wait until consumer has it
-            Assert.assertEquals(queue.remove("id"), 0);
+            assertTrue(consumingLatch.await(10, TimeUnit.SECONDS));  // wait until consumer has it
+            assertEquals(queue.remove("id"), 0);
 
             waitLatch.countDown();
         }
@@ -108,14 +109,14 @@
             int                 iteration = 0;
             while ( consumer.size() < ITEM_QTY )
             {
-                Assert.assertTrue(++iteration < ITEM_QTY);
+                assertTrue(++iteration < ITEM_QTY);
                 Thread.sleep(1000);
             }
 
             int                 i = 0;
             for ( TestQueueItem item : consumer.getItems() )
             {
-                Assert.assertEquals(item.str, ids.get(i++));
+                assertEquals(item.str, ids.get(i++));
             }
         }
         finally
@@ -156,13 +157,13 @@
 
             queue.put(new TestQueueItem("test"), "id");
 
-            Assert.assertTrue(consumingLatch.await(10, TimeUnit.SECONDS));  // wait until consumer has it
+            assertTrue(consumingLatch.await(10, TimeUnit.SECONDS));  // wait until consumer has it
 
             // Sleep one more second
 
             Thread.sleep(1000);
 
-            Assert.assertTrue(queue.debugIsQueued("id"));
+            assertTrue(queue.debugIsQueued("id"));
 
         }
         finally
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestDistributedPriorityQueue.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestDistributedPriorityQueue.java
index 6c5ac7d..59b1227 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestDistributedPriorityQueue.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestDistributedPriorityQueue.java
@@ -18,6 +18,11 @@
  */
 package org.apache.curator.framework.recipes.queue;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.curator.framework.CuratorFramework;
@@ -26,9 +31,8 @@
 import org.apache.curator.framework.state.ConnectionStateListener;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.Timing;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
-import org.testng.Assert;
-import org.testng.annotations.Test;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
@@ -58,7 +62,7 @@
                 queue.put(i, 10 + i);
             }
 
-            Assert.assertEquals(consumer.take(1, TimeUnit.SECONDS), new Integer(0));
+            assertEquals(consumer.take(1, TimeUnit.SECONDS), new Integer(0));
             queue.put(1000, 1); // lower priority
 
             int         count = 0;
@@ -66,7 +70,7 @@
             {
                 ++count;
             }
-            Assert.assertTrue(Math.abs(minItemsBeforeRefresh - count) < minItemsBeforeRefresh, String.format("Diff: %d - min: %d", Math.abs(minItemsBeforeRefresh - count), minItemsBeforeRefresh));     // allows for some slack - testing that within a slop value the newly inserted item with lower priority comes out
+            assertTrue(Math.abs(minItemsBeforeRefresh - count) < minItemsBeforeRefresh, String.format("Diff: %d - min: %d", Math.abs(minItemsBeforeRefresh - count), minItemsBeforeRefresh));     // allows for some slack - testing that within a slop value the newly inserted item with lower priority comes out
         }
         finally
         {
@@ -106,12 +110,12 @@
                 queue.put(i, 10);
             }
 
-            Assert.assertEquals(blockingQueue.poll(timing.seconds(), TimeUnit.SECONDS), new Integer(0));
+            assertEquals(blockingQueue.poll(timing.seconds(), TimeUnit.SECONDS), new Integer(0));
             timing.sleepABit();
             queue.put(1000, 1); // lower priority
             timing.sleepABit();
-            Assert.assertEquals(blockingQueue.poll(timing.seconds(), TimeUnit.SECONDS), new Integer(1)); // is in consumer already
-            Assert.assertEquals(blockingQueue.poll(timing.seconds(), TimeUnit.SECONDS), new Integer(1000));
+            assertEquals(blockingQueue.poll(timing.seconds(), TimeUnit.SECONDS), new Integer(1)); // is in consumer already
+            assertEquals(blockingQueue.poll(timing.seconds(), TimeUnit.SECONDS), new Integer(1000));
         }
         finally
         {
@@ -197,7 +201,7 @@
 
             nums.add(Integer.MIN_VALUE);
             queue.put(Integer.MIN_VALUE, Integer.MIN_VALUE);  // the queue background thread will be blocking with the first item - make sure it's the lowest value
-            Assert.assertTrue(timing.awaitLatch(hasConsumedLatch));
+            assertTrue(timing.awaitLatch(hasConsumedLatch));
 
             Random          random = new Random();
             for ( int i = 0; i < 100; ++i )
@@ -222,7 +226,7 @@
             {
                 message.append(i).append("\t").append(DistributedPriorityQueue.priorityToString(i)).append("\n");
             }
-            Assert.fail(message.toString());
+            fail(message.toString());
         }
         finally
         {
@@ -237,10 +241,10 @@
         for ( int i = 0; i < qty; ++i )
         {
             Integer     value = consumer.take(10, TimeUnit.SECONDS);
-            Assert.assertNotNull(value);
+            assertNotNull(value);
             if ( i > 0 )
             {
-                Assert.assertTrue(value >= previous, String.format("Value: (%d:%s) Previous: (%d:%s)", value, DistributedPriorityQueue.priorityToString(value), previous, DistributedPriorityQueue.priorityToString(previous)));
+                assertTrue(value >= previous, String.format("Value: (%d:%s) Previous: (%d:%s)", value, DistributedPriorityQueue.priorityToString(value), previous, DistributedPriorityQueue.priorityToString(previous)));
             }
             previous = value;
         }
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestDistributedQueue.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestDistributedQueue.java
index 971b1ec..e9f6014 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestDistributedQueue.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestDistributedQueue.java
@@ -18,6 +18,10 @@
  */
 package org.apache.curator.framework.recipes.queue;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import org.apache.curator.test.BaseClassForTests;
@@ -34,9 +38,8 @@
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.Timing;
 import org.apache.zookeeper.CreateMode;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
-import org.testng.Assert;
-import org.testng.annotations.Test;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
@@ -107,9 +110,9 @@
             queue.put(new TestQueueItem("test"));
 
             retryCounter.await(10, TimeUnit.SECONDS);
-            Assert.assertEquals(retryCounter.getCount(), 0, "Queue item was not consumed. Retry counter is " + retryCounter.getCount());
-            Assert.assertEquals(names.size(), 2);
-            Assert.assertEquals(names.get(0).length(), names.get(1).length(), "name1: " + names.get(0) + " - " + "name2: " + names.get(1));
+            assertEquals(retryCounter.getCount(), 0, "Queue item was not consumed. Retry counter is " + retryCounter.getCount());
+            assertEquals(names.size(), 2);
+            assertEquals(names.get(0).length(), names.get(1).length(), "name1: " + names.get(0) + " - " + "name2: " + names.get(1));
         }
         finally
         {
@@ -200,9 +203,9 @@
                 queue.put(Integer.toString(i));
             }
 
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
 
-            Assert.assertTrue(doubleUsed.size() == 0, doubleUsed.toString());
+            assertTrue(doubleUsed.size() == 0, doubleUsed.toString());
         }
         finally
         {
@@ -250,17 +253,17 @@
             int                 iteration = 0;
             while ( consumer.size() < itemQty )
             {
-                Assert.assertTrue(++iteration < 10);
+                assertTrue(++iteration < 10);
                 Thread.sleep(1000);
             }
 
             int                 i = 0;
             for ( TestQueueItem item : consumer.getItems() )
             {
-                Assert.assertEquals(item.str, Integer.toString(i++));
+                assertEquals(item.str, Integer.toString(i++));
             }
             
-            Assert.assertEquals(listenerCalls.get(), itemQty);
+            assertEquals(listenerCalls.get(), itemQty);
         }
         finally
         {
@@ -304,8 +307,8 @@
                 TestQueueItem       item = new TestQueueItem("1");
                 queue.put(item);
 
-                Assert.assertTrue(timing.awaitLatch(latch.get()));
-                Assert.assertEquals(count.get(), 2);
+                assertTrue(timing.awaitLatch(latch.get()));
+                assertEquals(count.get(), 2);
 
                 queue.setErrorMode(ErrorMode.DELETE);
 
@@ -315,8 +318,8 @@
                 item = new TestQueueItem("1");
                 queue.put(item);
 
-                Assert.assertFalse(latch.get().await(5, TimeUnit.SECONDS)); // consumer should get called only once
-                Assert.assertEquals(count.get(), 1);
+                assertFalse(latch.get().await(5, TimeUnit.SECONDS)); // consumer should get called only once
+                assertEquals(count.get(), 1);
             }
             finally
             {
@@ -409,7 +412,7 @@
             }
 
             timing.awaitLatch(latch);
-            Assert.assertTrue(duplicateMessages.size() == 0, duplicateMessages.toString());
+            assertTrue(duplicateMessages.size() == 0, duplicateMessages.toString());
         }
         finally
         {
@@ -530,12 +533,12 @@
             int                 i = 0;
             for ( TestQueueItem item : takenItems )
             {
-                Assert.assertEquals(item.str, Integer.toString(i++));
+                assertEquals(item.str, Integer.toString(i++));
             }
 
-            Assert.assertNotNull(thrownItemFromConsumer1.get());
-            Assert.assertTrue((takenItemsForConsumer2.contains(thrownItemFromConsumer1.get())));
-            Assert.assertTrue(Sets.intersection(takenItemsForConsumer1, takenItemsForConsumer2).size() == 0);
+            assertNotNull(thrownItemFromConsumer1.get());
+            assertTrue((takenItemsForConsumer2.contains(thrownItemFromConsumer1.get())));
+            assertTrue(Sets.intersection(takenItemsForConsumer1, takenItemsForConsumer2).size() == 0);
         }
         finally
         {
@@ -593,14 +596,14 @@
                         for ( int i = 0; i < itemQty; ++i )
                         {
                             TestQueueItem item = consumer.take();
-                            Assert.assertEquals(item.str, Integer.toString(i));
+                            assertEquals(item.str, Integer.toString(i));
                         }
                         latch.countDown();
                         return null;
                     }
                 }
             );
-            Assert.assertTrue(latch.await(10, TimeUnit.SECONDS));
+            assertTrue(latch.await(10, TimeUnit.SECONDS));
         }
         finally
         {
@@ -643,8 +646,8 @@
             for ( int i = 0; i < itemQty; ++i )
             {
                 TestQueueItem   queueItem = consumer.take(1, TimeUnit.SECONDS);
-                Assert.assertNotNull(queueItem);
-                Assert.assertEquals(queueItem, new TestQueueItem(Integer.toString(i)));
+                assertNotNull(queueItem);
+                assertEquals(queueItem, new TestQueueItem(Integer.toString(i)));
             }
         }
         finally
@@ -679,13 +682,13 @@
             int                 iteration = 0;
             while ( consumer.size() < itemQty )
             {
-                Assert.assertTrue(++iteration < 10);
+                assertTrue(++iteration < 10);
                 Thread.sleep(1000);
             }
 
             List<TestQueueItem> items = consumer.getItems();
 
-            Assert.assertEquals(com.google.common.collect.Sets.<TestQueueItem>newHashSet(items).size(), items.size()); // check no duplicates
+            assertEquals(com.google.common.collect.Sets.<TestQueueItem>newHashSet(items).size(), items.size()); // check no duplicates
         }
         finally
         {
@@ -736,10 +739,10 @@
             queue.start();
 
             queue.put(new TestQueueItem("1"));
-            Assert.assertFalse(queue.flushPuts(timing.forWaiting().seconds(), TimeUnit.SECONDS));
+            assertFalse(queue.flushPuts(timing.forWaiting().seconds(), TimeUnit.SECONDS));
             latch.countDown();
 
-            Assert.assertTrue(queue.flushPuts(timing.forWaiting().seconds(), TimeUnit.SECONDS));
+            assertTrue(queue.flushPuts(timing.forWaiting().seconds(), TimeUnit.SECONDS));
         }
         finally
         {
@@ -776,14 +779,14 @@
             int                 iteration = 0;
             while ( consumer.size() < itemQty )
             {
-                Assert.assertTrue(++iteration < 10);
+                assertTrue(++iteration < 10);
                 Thread.sleep(1000);
             }
 
             int                 i = 0;
             for ( TestQueueItem item : consumer.getItems() )
             {
-                Assert.assertEquals(item.str, Integer.toString(i++));
+                assertEquals(item.str, Integer.toString(i++));
             }
         }
         finally
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestQueueSharder.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestQueueSharder.java
index 7c4f298..8e25062 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestQueueSharder.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestQueueSharder.java
@@ -18,6 +18,9 @@
  */
 package org.apache.curator.framework.recipes.queue;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Sets;
 import org.apache.commons.math.stat.descriptive.SummaryStatistics;
 import org.apache.curator.framework.CuratorFramework;
@@ -28,8 +31,8 @@
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.test.Timing;
 import org.apache.curator.utils.CloseableUtils;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
@@ -79,13 +82,13 @@
             for ( String path : sharder.getQueuePaths() )
             {
                 int numChildren = client.checkExists().forPath(path).getNumChildren();
-                Assert.assertTrue(numChildren > 0);
-                Assert.assertTrue(numChildren >= (threshold * .1));
+                assertTrue(numChildren > 0);
+                assertTrue(numChildren >= (threshold * .1));
                 statistics.addValue(numChildren);
             }
             latch.countDown();
 
-            Assert.assertTrue(statistics.getMean() >= (threshold * .9));
+            assertTrue(statistics.getMean() >= (threshold * .9));
         }
         finally
         {
@@ -119,9 +122,9 @@
             }
             timing.sleepABit();
 
-            Assert.assertTrue((sharder1.getShardQty() > 1) || (sharder2.getShardQty() > 1));
+            assertTrue((sharder1.getShardQty() > 1) || (sharder2.getShardQty() > 1));
             timing.forWaiting().sleepABit();
-            Assert.assertEquals(sharder1.getShardQty(), sharder2.getShardQty());
+            assertEquals(sharder1.getShardQty(), sharder2.getShardQty());
         }
         finally
         {
@@ -160,17 +163,17 @@
             sharder.getQueue().put("eight");
             timing.sleepABit();
 
-            Assert.assertTrue(sharder.getShardQty() > 1);
+            assertTrue(sharder.getShardQty() > 1);
 
             Set<String>             consumed = Sets.newHashSet();
             for ( int i = 0; i < 8; ++i )
             {
                 String s = consumer.take(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS);
-                Assert.assertNotNull(s);
+                assertNotNull(s);
                 consumed.add(s);
             }
 
-            Assert.assertEquals(consumed, Sets.newHashSet("one", "two", "three", "four", "five", "six", "seven", "eight"));
+            assertEquals(consumed, Sets.newHashSet("one", "two", "three", "four", "five", "six", "seven", "eight"));
 
             int         shardQty = sharder.getShardQty();
             sharder.close();
@@ -179,7 +182,7 @@
 
             sharder = new QueueSharder<String, DistributedQueue<String>>(client, distributedQueueAllocator, "/queues", "/leader", policies);
             sharder.start();
-            Assert.assertEquals(sharder.getShardQty(), shardQty);
+            assertEquals(sharder.getShardQty(), shardQty);
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestSimpleDistributedQueue.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestSimpleDistributedQueue.java
index ec4c3d1..2b90449 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestSimpleDistributedQueue.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/queue/TestSimpleDistributedQueue.java
@@ -18,6 +18,10 @@
  */
 package org.apache.curator.framework.recipes.queue;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.test.TestingServer;
 import org.apache.curator.test.Timing;
@@ -25,16 +29,13 @@
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.RetryOneTime;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.NoSuchElementException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertTrue;
-
 public class TestSimpleDistributedQueue extends BaseClassForTests
 {
     private static abstract class QueueUser implements Runnable
@@ -113,7 +114,7 @@
             });
 
             executor.shutdown();
-            Assert.assertTrue(executor.awaitTermination((QueueUser.ITEM_COUNT * 2) * timing.milliseconds(), TimeUnit.MILLISECONDS));
+            assertTrue(executor.awaitTermination((QueueUser.ITEM_COUNT * 2) * timing.milliseconds(), TimeUnit.MILLISECONDS));
         }
         finally
         {
@@ -139,7 +140,7 @@
                 queueHandles[i] = new SimpleDistributedQueue(clients[i], dir);
             }
 
-            Assert.assertNull(queueHandles[0].poll(3, TimeUnit.SECONDS));
+            assertNull(queueHandles[0].poll(3, TimeUnit.SECONDS));
         }
         finally
         {
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/shared/TestSharedCount.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/shared/TestSharedCount.java
index 9b6be7d..cddefd5 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/shared/TestSharedCount.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/shared/TestSharedCount.java
@@ -19,6 +19,9 @@
 
 package org.apache.curator.framework.recipes.shared;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Lists;
 import com.google.common.util.concurrent.ThreadFactoryBuilder;
 import org.apache.curator.framework.CuratorFramework;
@@ -34,8 +37,8 @@
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.zookeeper.WatchedEvent;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.List;
 import java.util.Random;
 import java.util.concurrent.Callable;
@@ -123,7 +126,7 @@
             client.start();
             client.checkExists().forPath("/");  // clear initial connect event
 
-            Assert.assertTrue(startLatch.await(10, TimeUnit.SECONDS));
+            assertTrue(startLatch.await(10, TimeUnit.SECONDS));
 
             SharedCount count = new SharedCount(client, "/count", 10);
             counts.add(count);
@@ -139,14 +142,14 @@
                 countList.add(next);
                 count.setCount(next);
 
-                Assert.assertTrue(semaphore.tryAcquire(CLIENT_QTY, 10, TimeUnit.SECONDS));
+                assertTrue(semaphore.tryAcquire(CLIENT_QTY, 10, TimeUnit.SECONDS));
             }
             count.setCount(-1);
 
             for ( Future<List<Integer>> future : futures )
             {
                 List<Integer> thisCountList = future.get();
-                Assert.assertEquals(thisCountList, countList);
+                assertEquals(thisCountList, countList);
             }
         }
         finally
@@ -189,15 +192,15 @@
             };
             count.addListener(listener);
 
-            Assert.assertTrue(count.trySetCount(1));
+            assertTrue(count.trySetCount(1));
             timing.sleepABit();
-            Assert.assertTrue(count.trySetCount(2));
+            assertTrue(count.trySetCount(2));
             timing.sleepABit();
-            Assert.assertTrue(count.trySetCount(10));
+            assertTrue(count.trySetCount(10));
             timing.sleepABit();
-            Assert.assertEquals(count.getCount(), 10);
+            assertEquals(count.getCount(), 10);
 
-            Assert.assertTrue(new Timing().awaitLatch(setLatch));
+            assertTrue(new Timing().awaitLatch(setLatch));
         }
         finally
         {
@@ -217,32 +220,32 @@
             count.start();
 
             VersionedValue<Integer> current = count.getVersionedValue();
-            Assert.assertEquals(current.getVersion(), 0);
+            assertEquals(current.getVersion(), 0);
 
-            Assert.assertTrue(count.trySetCount(current, 1));
+            assertTrue(count.trySetCount(current, 1));
             current = count.getVersionedValue();
-            Assert.assertEquals(current.getVersion(), 1);
-            Assert.assertEquals(count.getCount(), 1);
+            assertEquals(current.getVersion(), 1);
+            assertEquals(count.getCount(), 1);
 
-            Assert.assertTrue(count.trySetCount(current, 5));
+            assertTrue(count.trySetCount(current, 5));
             current = count.getVersionedValue();
-            Assert.assertEquals(current.getVersion(), 2);
-            Assert.assertEquals(count.getCount(), 5);
+            assertEquals(current.getVersion(), 2);
+            assertEquals(count.getCount(), 5);
 
-            Assert.assertTrue(count.trySetCount(current, 10));
+            assertTrue(count.trySetCount(current, 10));
 
             current = count.getVersionedValue();
-            Assert.assertEquals(current.getVersion(), 3);
-            Assert.assertEquals(count.getCount(), 10);
+            assertEquals(current.getVersion(), 3);
+            assertEquals(count.getCount(), 10);
 
             // Wrong value
-            Assert.assertFalse(count.trySetCount(new VersionedValue<Integer>(3, 20), 7));
+            assertFalse(count.trySetCount(new VersionedValue<Integer>(3, 20), 7));
             // Wrong version
-            Assert.assertFalse(count.trySetCount(new VersionedValue<Integer>(10, 10), 7));
+            assertFalse(count.trySetCount(new VersionedValue<Integer>(10, 10), 7));
 
             // Server changed
             client.setData().forPath("/count", SharedCount.toBytes(88));
-            Assert.assertFalse(count.trySetCount(current, 234));
+            assertFalse(count.trySetCount(current, 234));
         }
         finally
         {
@@ -267,10 +270,10 @@
             count2.start();
 
             VersionedValue<Integer> versionedValue = count1.getVersionedValue();
-            Assert.assertTrue(count1.trySetCount(versionedValue, 10));
+            assertTrue(count1.trySetCount(versionedValue, 10));
             timing.sleepABit();
             versionedValue = count2.getVersionedValue();
-            Assert.assertTrue(count2.trySetCount(versionedValue, 20));
+            assertTrue(count2.trySetCount(versionedValue, 20));
             timing.sleepABit();
 
             final CountDownLatch setLatch = new CountDownLatch(2);
@@ -291,12 +294,12 @@
             count1.addListener(listener);
             VersionedValue<Integer> versionedValue1 = count1.getVersionedValue();
             VersionedValue<Integer> versionedValue2 = count2.getVersionedValue();
-            Assert.assertTrue(count2.trySetCount(versionedValue2, 30));
-            Assert.assertFalse(count1.trySetCount(versionedValue1, 40));
+            assertTrue(count2.trySetCount(versionedValue2, 30));
+            assertFalse(count1.trySetCount(versionedValue1, 40));
 
             versionedValue1 = count1.getVersionedValue();
-            Assert.assertTrue(count1.trySetCount(versionedValue1, 40));
-            Assert.assertTrue(timing.awaitLatch(setLatch));
+            assertTrue(count1.trySetCount(versionedValue1, 40));
+            assertTrue(timing.awaitLatch(setLatch));
         }
         finally
         {
@@ -322,8 +325,8 @@
             count1.start();
             count2.start();
 
-            Assert.assertEquals(count1.getCount(), 10);
-            Assert.assertEquals(count2.getCount(), 10);
+            assertEquals(count1.getCount(), 10);
+            assertEquals(count2.getCount(), 10);
         }
         finally
         {
@@ -360,7 +363,7 @@
         {
             server.stop();
             // if watcher goes into 10second retry loop we won't get timely notification
-            Assert.assertTrue(gotSuspendEvent.await(5, TimeUnit.SECONDS));
+            assertTrue(gotSuspendEvent.await(5, TimeUnit.SECONDS));
         }
         finally
         {
@@ -405,14 +408,14 @@
         try
         {
             sharedCount.setCount(11);
-            Assert.assertTrue(gotChangeEvent.await(2, TimeUnit.SECONDS));
+            assertTrue(gotChangeEvent.await(2, TimeUnit.SECONDS));
 
             server.stop();
-            Assert.assertTrue(gotSuspendEvent.await(2, TimeUnit.SECONDS));
+            assertTrue(gotSuspendEvent.await(2, TimeUnit.SECONDS));
 
             server.restart();
-            Assert.assertTrue(getReconnectEvent.await(2, TimeUnit.SECONDS));
-            Assert.assertEquals(numChangeEvents.get(), 1);
+            assertTrue(getReconnectEvent.await(2, TimeUnit.SECONDS));
+            assertEquals(numChangeEvents.get(), 1);
 
             sharedCount.trySetCount(sharedCount.getVersionedValue(), 12);
 
@@ -428,7 +431,7 @@
 
             // CURATOR-311: when a Curator client's state became RECONNECTED, countHasChanged method is called back
             // because the Curator client calls readValueAndNotifyListenersInBackground in SharedValue#ConnectionStateListener#stateChanged.
-            Assert.assertTrue(numChangeEvents.get() > 2);
+            assertTrue(numChangeEvents.get() > 2);
         }
         finally
         {
@@ -489,24 +492,24 @@
         try
         {
             sharedCount1.setCount(12);
-            Assert.assertEquals(listener1.gotChangeEvent.awaitAdvanceInterruptibly(0, timing.seconds(), TimeUnit.SECONDS), 1);
-            Assert.assertEquals(sharedCount1.getCount(), 12);
+            assertEquals(listener1.gotChangeEvent.awaitAdvanceInterruptibly(0, timing.seconds(), TimeUnit.SECONDS), 1);
+            assertEquals(sharedCount1.getCount(), 12);
 
-            Assert.assertEquals(sharedCountWithFaultyWatcher.getCount(), 10);
+            assertEquals(sharedCountWithFaultyWatcher.getCount(), 10);
             // new counter with faultyWatcher start
             sharedCountWithFaultyWatcher.start();
 
             for (int i = 0; i < 10; i++) {
                 sharedCount1.setCount(13 + i);
-                Assert.assertEquals(sharedCount1.getCount(), 13 + i);
+                assertEquals(sharedCount1.getCount(), 13 + i);
 
                 server.restart();
 
-                Assert.assertEquals(listener2.getReconnectEvent.awaitAdvanceInterruptibly(i, timing.forWaiting().seconds(), TimeUnit.SECONDS), i + 1);
+                assertEquals(listener2.getReconnectEvent.awaitAdvanceInterruptibly(i, timing.forWaiting().seconds(), TimeUnit.SECONDS), i + 1);
                 // CURATOR-311 introduces to Curator's client reading server's shared count value
                 // when client's state gets ConnectionState.RECONNECTED. Following tests ensures that.
-                Assert.assertEquals(listener2.gotChangeEvent.awaitAdvanceInterruptibly(i, timing.forWaiting().seconds(), TimeUnit.SECONDS), i + 1);
-                Assert.assertEquals(sharedCountWithFaultyWatcher.getCount(), 13 + i);
+                assertEquals(listener2.gotChangeEvent.awaitAdvanceInterruptibly(i, timing.forWaiting().seconds(), TimeUnit.SECONDS), i + 1);
+                assertEquals(sharedCountWithFaultyWatcher.getCount(), 13 + i);
             }
         }
         finally
diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/watch/TestPersistentWatcher.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/watch/TestPersistentWatcher.java
index 1cf7eb0..d21f2be 100644
--- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/watch/TestPersistentWatcher.java
+++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/watch/TestPersistentWatcher.java
@@ -19,6 +19,9 @@
 
 package org.apache.curator.framework.recipes.watch;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.state.ConnectionState;
@@ -26,13 +29,14 @@
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.zookeeper.WatchedEvent;
 import org.apache.zookeeper.Watcher;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.LinkedBlockingQueue;
 
-@Test(groups = CuratorTestBase.zk36Group)
+@Tag(CuratorTestBase.zk36Group)
 public class TestPersistentWatcher extends CuratorTestBase
 {
     @Test
@@ -73,22 +77,22 @@
                 persistentWatcher.getListenable().addListener(events::add);
 
                 client.create().creatingParentsIfNeeded().forPath("/top/main/a");
-                Assert.assertEquals(timing.takeFromQueue(events).getPath(), "/top/main");
+                assertEquals(timing.takeFromQueue(events).getPath(), "/top/main");
                 if ( recursive )
                 {
-                    Assert.assertEquals(timing.takeFromQueue(events).getPath(), "/top/main/a");
+                    assertEquals(timing.takeFromQueue(events).getPath(), "/top/main/a");
                 }
                 else
                 {
-                    Assert.assertEquals(timing.takeFromQueue(events).getPath(), "/top/main");   // child added
+                    assertEquals(timing.takeFromQueue(events).getPath(), "/top/main");   // child added
                 }
 
                 server.stop();
-                Assert.assertEquals(timing.takeFromQueue(events).getState(), Watcher.Event.KeeperState.Disconnected);
-                Assert.assertTrue(timing.awaitLatch(lostLatch));
+                assertEquals(timing.takeFromQueue(events).getState(), Watcher.Event.KeeperState.Disconnected);
+                assertTrue(timing.awaitLatch(lostLatch));
 
                 server.restart();
-                Assert.assertTrue(timing.awaitLatch(reconnectedLatch));
+                assertTrue(timing.awaitLatch(reconnectedLatch));
 
                 timing.sleepABit();     // time to allow watcher to get reset
                 events.clear();
@@ -96,10 +100,10 @@
                 if ( recursive )
                 {
                     client.setData().forPath("/top/main/a", "foo".getBytes());
-                    Assert.assertEquals(timing.takeFromQueue(events).getType(), Watcher.Event.EventType.NodeDataChanged);
+                    assertEquals(timing.takeFromQueue(events).getType(), Watcher.Event.EventType.NodeDataChanged);
                 }
                 client.setData().forPath("/top/main", "bar".getBytes());
-                Assert.assertEquals(timing.takeFromQueue(events).getPath(), "/top/main");
+                assertEquals(timing.takeFromQueue(events).getPath(), "/top/main");
             }
         }
     }
diff --git a/curator-test-zk35/pom.xml b/curator-test-zk35/pom.xml
index 5e683b5..2abfe90 100644
--- a/curator-test-zk35/pom.xml
+++ b/curator-test-zk35/pom.xml
@@ -131,8 +131,33 @@
         </dependency>
 
         <dependency>
-            <groupId>org.testng</groupId>
-            <artifactId>testng</artifactId>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-math</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.dataformat</groupId>
+            <artifactId>jackson-dataformat-yaml</artifactId>
+            <version>${jackson-version}</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
             <scope>test</scope>
         </dependency>
 
diff --git a/curator-test-zk35/src/test/java/org/apache/curator/framework/TestCompatibility.java b/curator-test-zk35/src/test/java/org/apache/curator/framework/TestCompatibility.java
index 5112d41..89f2d29 100644
--- a/curator-test-zk35/src/test/java/org/apache/curator/framework/TestCompatibility.java
+++ b/curator-test-zk35/src/test/java/org/apache/curator/framework/TestCompatibility.java
@@ -18,32 +18,36 @@
  */
 package org.apache.curator.framework;
 
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.x.async.AsyncCuratorFramework;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
 
 public class TestCompatibility extends CuratorTestBase
 {
-    @Test(expectedExceptions = IllegalStateException.class)
-    public void testPersistentWatchesNotAvailable() throws Exception
+    @Test
+    public void testPersistentWatchesNotAvailable()
     {
-        try ( CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)) )
-        {
-            client.start();
-            client.watchers().add().forPath("/foo");
-        }
+        assertThrows(IllegalStateException.class, ()-> {
+            try (CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1))) {
+                client.start();
+                client.watchers().add().forPath("/foo");
+            }
+        });
     }
 
-    @Test(expectedExceptions = IllegalStateException.class)
+    @Test
     public void testPersistentWatchesNotAvailableAsync()
     {
-        try ( CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)) )
-        {
-            client.start();
+        assertThrows(IllegalStateException.class, ()->{
+            try ( CuratorFramework client = CuratorFrameworkFactory.newClient(server.getConnectString(), new RetryOneTime(1)) )
+            {
+                client.start();
 
-            AsyncCuratorFramework async = AsyncCuratorFramework.wrap(client);
-            async.addWatch().forPath("/foo");
-        }
+                AsyncCuratorFramework async = AsyncCuratorFramework.wrap(client);
+                async.addWatch().forPath("/foo");
+            }
+        });
     }
 }
diff --git a/curator-test-zk35/src/test/java/org/apache/curator/zk35/TestIs35.java b/curator-test-zk35/src/test/java/org/apache/curator/zk35/TestIs35.java
index 4292bd0..53bcf1b 100644
--- a/curator-test-zk35/src/test/java/org/apache/curator/zk35/TestIs35.java
+++ b/curator-test-zk35/src/test/java/org/apache/curator/zk35/TestIs35.java
@@ -18,18 +18,19 @@
  */
 package org.apache.curator.zk35;
 
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import org.apache.curator.utils.Compatibility;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
 
 public class TestIs35
 {
     @Test
     public void testIsZk35()
     {
-        Assert.assertFalse(Compatibility.hasGetReachableOrOneMethod());
-        Assert.assertTrue(Compatibility.hasAddrField());
-        Assert.assertFalse(Compatibility.hasPersistentWatchers());
+        assertFalse(Compatibility.hasGetReachableOrOneMethod());
+        assertTrue(Compatibility.hasAddrField());
+        assertFalse(Compatibility.hasPersistentWatchers());
     }
 }
 
diff --git a/curator-test/pom.xml b/curator-test/pom.xml
index b1d9500..6547998 100644
--- a/curator-test/pom.xml
+++ b/curator-test/pom.xml
@@ -56,12 +56,11 @@
         </dependency>
 
         <dependency>
-            <groupId>org.testng</groupId>
-            <artifactId>testng</artifactId>
-            <scope>provided</scope>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
         </dependency>
 
-	    <dependency>
+        <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-log4j12</artifactId>
             <scope>test</scope>
@@ -107,6 +106,16 @@
                     </execution>
                 </executions>
             </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <threadCount>1</threadCount>
+                    <reuseForks>false</reuseForks>
+                    <redirectTestOutputToFile>true</redirectTestOutputToFile>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
diff --git a/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java b/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java
index eb568e9..1ed3500 100644
--- a/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java
+++ b/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java
@@ -19,15 +19,10 @@
 
 package org.apache.curator.test;
 
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.testng.IInvokedMethod;
-import org.testng.IInvokedMethodListener2;
-import org.testng.ITestContext;
-import org.testng.ITestResult;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.BeforeSuite;
 import java.io.IOException;
 import java.net.BindException;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -81,39 +76,7 @@
         INTERNAL_PROPERTY_VALIDATE_NAMESPACE_WATCHER_MAP_EMPTY = s;
     }
 
-    @BeforeSuite(alwaysRun = true)
-    public void beforeSuite(ITestContext context)
-    {
-        IInvokedMethodListener2 methodListener2 = new IInvokedMethodListener2()
-        {
-            @Override
-            public void beforeInvocation(IInvokedMethod method, ITestResult testResult)
-            {
-                method.getTestMethod().setRetryAnalyzer(BaseClassForTests.this::retry);
-            }
-
-            @Override
-            public void beforeInvocation(IInvokedMethod method, ITestResult testResult, ITestContext context)
-            {
-                beforeInvocation(method, testResult);
-            }
-
-            @Override
-            public void afterInvocation(IInvokedMethod method, ITestResult testResult, ITestContext context)
-            {
-                // NOP
-            }
-
-            @Override
-            public void afterInvocation(IInvokedMethod method, ITestResult testResult)
-            {
-                // NOP
-            }
-        };
-        context.getSuite().addListener(methodListener2);
-    }
-
-    @BeforeMethod(alwaysRun = true)
+    @BeforeEach
     public void setup() throws Exception
     {
         if ( INTERNAL_PROPERTY_DONT_LOG_CONNECTION_ISSUES != null )
@@ -177,7 +140,7 @@
         }
     }
 
-    @AfterMethod(alwaysRun = true)
+    @AfterEach
     public void teardown() throws Exception
     {
         System.clearProperty(INTERNAL_PROPERTY_VALIDATE_NAMESPACE_WATCHER_MAP_EMPTY);
@@ -203,25 +166,4 @@
             }
         }
     }
-
-    private boolean retry(ITestResult result)
-    {
-        if ( result.isSuccess() || isRetrying.get() )
-        {
-            isRetrying.set(false);
-            return false;
-        }
-
-        result.setStatus(ITestResult.SKIP);
-        if ( result.getThrowable() != null )
-        {
-            log.error("Retrying 1 time", result.getThrowable());
-        }
-        else
-        {
-            log.error("Retrying 1 time");
-        }
-        isRetrying.set(true);
-        return true;
-    }
 }
diff --git a/curator-test/src/test/java/org/apache/curator/test/TestQuorumConfigBuilder.java b/curator-test/src/test/java/org/apache/curator/test/TestQuorumConfigBuilder.java
index cfb89c5..3737f82 100644
--- a/curator-test/src/test/java/org/apache/curator/test/TestQuorumConfigBuilder.java
+++ b/curator-test/src/test/java/org/apache/curator/test/TestQuorumConfigBuilder.java
@@ -20,10 +20,10 @@
 
 package org.apache.curator.test;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import java.util.HashMap;
 import java.util.Map;
-import static org.testng.AssertJUnit.assertEquals;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
 
 /**
  * Test QuorumConfigBuilder
diff --git a/curator-x-async/pom.xml b/curator-x-async/pom.xml
index 2d6527e..3571438 100644
--- a/curator-x-async/pom.xml
+++ b/curator-x-async/pom.xml
@@ -38,8 +38,8 @@
         </dependency>
 
         <dependency>
-            <groupId>org.testng</groupId>
-            <artifactId>testng</artifactId>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
             <scope>test</scope>
         </dependency>
 
diff --git a/curator-x-async/src/test/java/org/apache/curator/framework/imps/TestAddWatch.java b/curator-x-async/src/test/java/org/apache/curator/framework/imps/TestAddWatch.java
index bdf006a..5a93431 100644
--- a/curator-x-async/src/test/java/org/apache/curator/framework/imps/TestAddWatch.java
+++ b/curator-x-async/src/test/java/org/apache/curator/framework/imps/TestAddWatch.java
@@ -18,6 +18,8 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.RetryOneTime;
@@ -27,8 +29,8 @@
 import org.apache.zookeeper.AddWatchMode;
 import org.apache.zookeeper.Watcher;
 import org.apache.zookeeper.ZooKeeper;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.CountDownLatch;
 
 public class TestAddWatch extends CuratorTestBase
@@ -52,7 +54,7 @@
             client.create().forPath("/test/a/b/c");
             client.create().forPath("/test/a/b/c/d");
 
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
         }
     }
 
@@ -81,7 +83,7 @@
             client.create().forPath("/test/a/b/c");
             client.create().forPath("/test/a/b/c/d");
 
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
         }
     }
 }
diff --git a/curator-x-async/src/test/java/org/apache/curator/framework/imps/TestFramework.java b/curator-x-async/src/test/java/org/apache/curator/framework/imps/TestFramework.java
index 395c4fd..d03ffca 100644
--- a/curator-x-async/src/test/java/org/apache/curator/framework/imps/TestFramework.java
+++ b/curator-x-async/src/test/java/org/apache/curator/framework/imps/TestFramework.java
@@ -18,6 +18,12 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import com.google.common.collect.Lists;
 import org.apache.curator.framework.AuthInfo;
 import org.apache.curator.framework.CuratorFramework;
@@ -41,10 +47,10 @@
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.ZooDefs;
 import org.apache.zookeeper.data.ACL;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.EnumSet;
@@ -59,7 +65,7 @@
 @SuppressWarnings("deprecation")
 public class TestFramework extends BaseClassForTests
 {
-    @BeforeMethod
+    @BeforeEach
     @Override
     public void setup() throws Exception
     {
@@ -67,7 +73,7 @@
         super.setup();
     }
 
-    @AfterMethod
+    @AfterEach
     @Override
     public void teardown() throws Exception
     {
@@ -101,8 +107,8 @@
             });
 
             Integer code = rc.poll(new Timing().milliseconds(), TimeUnit.MILLISECONDS);
-            Assert.assertNotNull(code);
-            Assert.assertEquals(code.intValue(), KeeperException.Code.OK.intValue());
+            assertNotNull(code);
+            assertEquals(code.intValue(), KeeperException.Code.OK.intValue());
         }
         finally
         {
@@ -135,7 +141,7 @@
                 .thenRun(() -> async.create().forPath("/base/child"));
 
             String path = queue.take();
-            Assert.assertEquals(path, "/base");
+            assertEquals(path, "/base");
         }
         finally
         {
@@ -174,7 +180,7 @@
             }
             catch ( ExecutionException e )
             {
-                Assert.fail("Auth failed");
+                fail("Auth failed");
             }
             client.close();
 
@@ -189,7 +195,7 @@
             {
                 AsyncCuratorFramework async = AsyncCuratorFramework.wrap(client);
                 async.setData().forPath("/test", "test".getBytes()).toCompletableFuture().get();
-                Assert.fail("Should have failed with auth exception");
+                fail("Should have failed with auth exception");
             }
             catch ( ExecutionException e )
             {
@@ -238,7 +244,7 @@
             }
             catch ( ExecutionException e )
             {
-                Assert.fail("Auth failed");
+                fail("Auth failed");
             }
             client.close();
 
@@ -256,7 +262,7 @@
             }
             catch ( ExecutionException e )
             {
-                Assert.fail("Auth failed");
+                fail("Auth failed");
             }
             client.close();
 
@@ -271,7 +277,7 @@
             {
                 AsyncCuratorFramework async = AsyncCuratorFramework.wrap(client);
                 async.setData().forPath("/test", "test".getBytes()).toCompletableFuture().get();
-                Assert.fail("Should have failed with auth exception");
+                fail("Should have failed with auth exception");
             }
             catch ( ExecutionException e )
             {
@@ -314,12 +320,12 @@
             client.create().withACL(aclList).forPath("/test", "test".getBytes());
 
             server.stop();
-            Assert.assertTrue(timing.awaitLatch(lostLatch));
+            assertTrue(timing.awaitLatch(lostLatch));
             try
             {
                 AsyncCuratorFramework async = AsyncCuratorFramework.wrap(client);
                 async.checkExists().forPath("/").toCompletableFuture().get();
-                Assert.fail("Connection should be down");
+                fail("Connection should be down");
             }
             catch ( ExecutionException e )
             {
@@ -334,7 +340,7 @@
             }
             catch ( ExecutionException e )
             {
-                Assert.fail("Auth failed", e);
+                fail("Auth failed", e);
             }
         }
         finally
@@ -354,11 +360,11 @@
             AsyncCuratorFramework async = AsyncCuratorFramework.wrap(client);
             async.create().withOptions(EnumSet.of(CreateOption.createParentsIfNeeded)).forPath("/one/two/three", "foo".getBytes()).toCompletableFuture().get();
             byte[] data = async.getData().forPath("/one/two/three").toCompletableFuture().get();
-            Assert.assertEquals(data, "foo".getBytes());
+            assertArrayEquals(data, "foo".getBytes());
 
             async.create().withOptions(EnumSet.of(CreateOption.createParentsIfNeeded)).forPath("/one/two/another", "bar".getBytes());
             data = async.getData().forPath("/one/two/another").toCompletableFuture().get();
-            Assert.assertEquals(data, "bar".getBytes());
+            assertArrayEquals(data, "bar".getBytes());
         }
         finally
         {
@@ -382,14 +388,14 @@
             AsyncCuratorFramework async = AsyncCuratorFramework.wrap(client);
             async.create().withOptions(EnumSet.of(CreateOption.createParentsAsContainers)).forPath("/one/two/three", "foo".getBytes()).toCompletableFuture().get();
             byte[] data = async.getData().forPath("/one/two/three").toCompletableFuture().get();
-            Assert.assertEquals(data, "foo".getBytes());
+            assertArrayEquals(data, "foo".getBytes());
 
             async.delete().forPath("/one/two/three").toCompletableFuture().get();
             new Timing().sleepABit();
 
-            Assert.assertNull(async.checkExists().forPath("/one/two").toCompletableFuture().get());
+            assertNull(async.checkExists().forPath("/one/two").toCompletableFuture().get());
             new Timing().sleepABit();
-            Assert.assertNull(async.checkExists().forPath("/one").toCompletableFuture().get());
+            assertNull(async.checkExists().forPath("/one").toCompletableFuture().get());
         }
         finally
         {
@@ -408,8 +414,8 @@
             String path = async.create().withOptions(Collections.singleton(CreateOption.doProtected)).forPath("/yo").toCompletableFuture().get();
             String node = ZKPaths.getNodeFromPath(path);
             // CURATOR-489: confirm that the node contains a valid UUID, eg '_c_53345f98-9423-4e0c-a7b5-9f819e3ec2e1-yo'
-            Assert.assertTrue(ProtectedUtils.isProtectedZNode(node));
-            Assert.assertEquals(ProtectedUtils.normalize(node), "yo");
+            assertTrue(ProtectedUtils.isProtectedZNode(node));
+            assertEquals(ProtectedUtils.normalize(node), "yo");
         }
         finally
         {
@@ -436,17 +442,17 @@
             client.start();
             AsyncCuratorFramework async = AsyncCuratorFramework.wrap(client);
 
-            Assert.assertNull(client.checkExists().forPath("/one/two"));
+            assertNull(client.checkExists().forPath("/one/two"));
             async.create().withOptions(EnumSet.of(CreateOption.createParentsAsContainers)).forPath("/one/two/three").toCompletableFuture().get();
-            Assert.assertNotNull(async.checkExists().forPath("/one/two").toCompletableFuture().get());
+            assertNotNull(async.checkExists().forPath("/one/two").toCompletableFuture().get());
 
             async.delete().withOptions(EnumSet.of(DeleteOption.deletingChildrenIfNeeded)).forPath("/one").toCompletableFuture().get();
-            Assert.assertNull(client.checkExists().forPath("/one"));
+            assertNull(client.checkExists().forPath("/one"));
 
-            Assert.assertNull(async.checkExists().forPath("/one/two").toCompletableFuture().get());
+            assertNull(async.checkExists().forPath("/one/two").toCompletableFuture().get());
             async.checkExists().withOptions(EnumSet.of(ExistsOption.createParentsAsContainers)).forPath("/one/two/three").toCompletableFuture().get();
-            Assert.assertNotNull(async.checkExists().forPath("/one/two").toCompletableFuture().get());
-            Assert.assertNull(async.checkExists().forPath("/one/two/three").toCompletableFuture().get());
+            assertNotNull(async.checkExists().forPath("/one/two").toCompletableFuture().get());
+            assertNull(async.checkExists().forPath("/one/two/three").toCompletableFuture().get());
         }
         finally
         {
@@ -463,11 +469,11 @@
             client.start();
             AsyncCuratorFramework async = AsyncCuratorFramework.wrap(client);
 
-            Assert.assertNull(async.checkExists().forPath("/one/two").toCompletableFuture().get());
+            assertNull(async.checkExists().forPath("/one/two").toCompletableFuture().get());
             async.checkExists().withOptions(EnumSet.of(ExistsOption.createParentsAsContainers)).forPath("/one/two/three").toCompletableFuture().get();
-            Assert.assertNotNull(async.checkExists().forPath("/one/two").toCompletableFuture().get());
-            Assert.assertNull(async.checkExists().forPath("/one/two/three").toCompletableFuture().get());
-            Assert.assertNull(async.checkExists().withOptions(EnumSet.of(ExistsOption.createParentsAsContainers)).forPath("/one/two/three").toCompletableFuture().get());
+            assertNotNull(async.checkExists().forPath("/one/two").toCompletableFuture().get());
+            assertNull(async.checkExists().forPath("/one/two/three").toCompletableFuture().get());
+            assertNull(async.checkExists().withOptions(EnumSet.of(ExistsOption.createParentsAsContainers)).forPath("/one/two/three").toCompletableFuture().get());
         }
         finally
         {
@@ -483,17 +489,17 @@
         try
         {
             client.create().forPath("/head");
-            Assert.assertNotNull(client.checkExists().forPath("/head"));
+            assertNotNull(client.checkExists().forPath("/head"));
 
             final CountDownLatch latch = new CountDownLatch(1);
             AsyncCuratorFramework async = AsyncCuratorFramework.wrap(client);
             async.sync().forPath("/head").handle((v, e) -> {
-                Assert.assertNull(v);
-                Assert.assertNull(e);
+                assertNull(v);
+                assertNull(e);
                 latch.countDown();
                 return null;
             });
-            Assert.assertTrue(latch.await(10, TimeUnit.SECONDS));
+            assertTrue(latch.await(10, TimeUnit.SECONDS));
         }
         finally
         {
@@ -512,14 +518,14 @@
             CountDownLatch latch = new CountDownLatch(1);
             async.create().forPath("/head").thenRun(() ->
                 async.delete().forPath("/head").handle((v, e) -> {
-                    Assert.assertNull(v);
-                    Assert.assertNull(e);
+                    assertNull(v);
+                    assertNull(e);
                     latch.countDown();
                     return null;
                 })
             );
-            Assert.assertTrue(latch.await(10, TimeUnit.SECONDS));
-            Assert.assertNull(client.checkExists().forPath("/head"));
+            assertTrue(latch.await(10, TimeUnit.SECONDS));
+            assertNull(client.checkExists().forPath("/head"));
         }
         finally
         {
@@ -539,7 +545,7 @@
                 {
                     if ( event.getType() == CuratorEventType.DELETE )
                     {
-                        Assert.assertEquals(event.getPath(), "/one/two");
+                        assertEquals(event.getPath(), "/one/two");
                         ((CountDownLatch)event.getContext()).countDown();
                     }
                 });
@@ -548,14 +554,14 @@
             AsyncCuratorFramework async = AsyncCuratorFramework.wrap(client);
             async.create().withOptions(EnumSet.of(CreateOption.createParentsIfNeeded)).forPath("/one/two/three/four").thenRun(() ->
                 async.delete().withOptions(EnumSet.of(DeleteOption.deletingChildrenIfNeeded)).forPath("/one/two").handle((v, e) -> {
-                    Assert.assertNull(v);
-                    Assert.assertNull(e);
+                    assertNull(v);
+                    assertNull(e);
                     latch.countDown();
                     return null;
                 })
             );
-            Assert.assertTrue(latch.await(10, TimeUnit.SECONDS));
-            Assert.assertNull(client.checkExists().forPath("/one/two"));
+            assertTrue(latch.await(10, TimeUnit.SECONDS));
+            assertNull(client.checkExists().forPath("/one/two"));
         }
         finally
         {
@@ -574,9 +580,9 @@
             AsyncCuratorFramework async = AsyncCuratorFramework.wrap(client);
             async.create().withOptions(EnumSet.of(CreateOption.createParentsIfNeeded)).forPath("/one/two/three/four/five/six", "foo".getBytes()).toCompletableFuture().get();
             async.delete().withOptions(EnumSet.of(DeleteOption.guaranteed, DeleteOption.deletingChildrenIfNeeded)).forPath("/one/two/three/four/five").toCompletableFuture().get();
-            Assert.assertNull(async.checkExists().forPath("/one/two/three/four/five").toCompletableFuture().get());
+            assertNull(async.checkExists().forPath("/one/two/three/four/five").toCompletableFuture().get());
             async.delete().withOptions(EnumSet.of(DeleteOption.guaranteed, DeleteOption.deletingChildrenIfNeeded)).forPath("/one/two").toCompletableFuture().get();
-            Assert.assertNull(async.checkExists().forPath("/one/two").toCompletableFuture().get());
+            assertNull(async.checkExists().forPath("/one/two").toCompletableFuture().get());
         }
         finally
         {
@@ -600,9 +606,9 @@
                 }
             });
 
-            Assert.assertTrue(new Timing().acquireSemaphore(semaphore, 10));
+            assertTrue(new Timing().acquireSemaphore(semaphore, 10));
             List<String> children = async.getChildren().forPath("/head").toCompletableFuture().get();
-            Assert.assertEquals(children.size(), 10);
+            assertEquals(children.size(), 10);
         }
         finally
         {
@@ -627,22 +633,22 @@
             CountDownLatch backgroundLatch = new CountDownLatch(1);
             AsyncStage<byte[]> stage = async.watched().getData().forPath("/test");
             stage.event().handle((event, x) -> {
-                Assert.assertEquals(event.getPath(), "/test");
+                assertEquals(event.getPath(), "/test");
                 watchedLatch.countDown();
                 return null;
             });
             stage.handle((d, x) -> {
-                Assert.assertEquals(d, data1);
+                assertArrayEquals(d, data1);
                 backgroundLatch.countDown();
                 return null;
             });
 
-            Assert.assertTrue(backgroundLatch.await(10, TimeUnit.SECONDS));
+            assertTrue(backgroundLatch.await(10, TimeUnit.SECONDS));
 
             async.setData().forPath("/test", data2);
-            Assert.assertTrue(watchedLatch.await(10, TimeUnit.SECONDS));
+            assertTrue(watchedLatch.await(10, TimeUnit.SECONDS));
             byte[] checkData = async.getData().forPath("/test").toCompletableFuture().get();
-            Assert.assertEquals(checkData, data2);
+            assertArrayEquals(checkData, data2);
         }
         finally
         {
diff --git a/curator-x-async/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java b/curator-x-async/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
index c00febd..c5bdf7c 100644
--- a/curator-x-async/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
+++ b/curator-x-async/src/test/java/org/apache/curator/framework/imps/TestFrameworkBackground.java
@@ -18,6 +18,9 @@
  */
 package org.apache.curator.framework.imps;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Lists;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -33,10 +36,9 @@
 import org.apache.curator.x.async.AsyncCuratorFramework;
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.data.ACL;
+import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.Test;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
@@ -102,7 +104,7 @@
                 }
             };
             async.with(listener).create().forPath("/foo");
-            Assert.assertTrue(new Timing().awaitLatch(errorLatch));
+            assertTrue(new Timing().awaitLatch(errorLatch));
         }
         finally
         {
@@ -144,10 +146,10 @@
 
             server.restart();
 
-            Assert.assertTrue(timing.awaitLatch(connectedLatch));
-            Assert.assertFalse(firstListenerAction.get());
+            assertTrue(timing.awaitLatch(connectedLatch));
+            assertFalse(firstListenerAction.get());
             ConnectionState firstconnectionState = firstListenerState.get();
-            Assert.assertEquals(firstconnectionState, ConnectionState.CONNECTED, "First listener state MUST BE CONNECTED but is " + firstconnectionState);
+            assertEquals(firstconnectionState, ConnectionState.CONNECTED, "First listener state MUST BE CONNECTED but is " + firstconnectionState);
         }
         finally
         {
@@ -190,7 +192,7 @@
 
             for ( long elapsed : times.subList(1, times.size()) )   // first one isn't a retry
             {
-                Assert.assertTrue(elapsed >= SLEEP, elapsed + ": " + times);
+                assertTrue(elapsed >= SLEEP, elapsed + ": " + times);
             }
         }
         finally
@@ -223,7 +225,7 @@
                 return null;
             });
             // Check if the callback has been called with a correct return code
-            Assert.assertTrue(timing.awaitLatch(latch), "Callback has not been called by curator !");
+            assertTrue(timing.awaitLatch(latch), "Callback has not been called by curator !");
         }
     }
 
@@ -280,7 +282,7 @@
             timing.sleepABit();
 
             // should not generate an exception
-            Assert.assertFalse(hadIllegalStateException.get());
+            assertFalse(hadIllegalStateException.get());
         }
         finally
         {
diff --git a/curator-x-async/src/test/java/org/apache/curator/x/async/CompletableBaseClassForTests.java b/curator-x-async/src/test/java/org/apache/curator/x/async/CompletableBaseClassForTests.java
index ae0df3b..1b587fb 100644
--- a/curator-x-async/src/test/java/org/apache/curator/x/async/CompletableBaseClassForTests.java
+++ b/curator-x-async/src/test/java/org/apache/curator/x/async/CompletableBaseClassForTests.java
@@ -18,10 +18,10 @@
  */
 package org.apache.curator.x.async;
 
+import static org.junit.jupiter.api.Assertions.fail;
 import com.google.common.base.Throwables;
 import org.apache.curator.test.BaseClassForTests;
 import org.apache.curator.test.compatibility.Timing2;
-import org.testng.Assert;
 import java.util.concurrent.CompletionStage;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
@@ -61,11 +61,11 @@
             {
                 throw (AssertionError)e.getCause();
             }
-            Assert.fail("get() failed", e);
+            fail("get() failed", e);
         }
         catch ( TimeoutException e )
         {
-            Assert.fail("get() timed out");
+            fail("get() timed out");
         }
     }
 }
diff --git a/curator-x-async/src/test/java/org/apache/curator/x/async/TestAsyncWrappers.java b/curator-x-async/src/test/java/org/apache/curator/x/async/TestAsyncWrappers.java
index 7ce7904..e720cba 100644
--- a/curator-x-async/src/test/java/org/apache/curator/x/async/TestAsyncWrappers.java
+++ b/curator-x-async/src/test/java/org/apache/curator/x/async/TestAsyncWrappers.java
@@ -18,12 +18,15 @@
  */
 package org.apache.curator.x.async;
 
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.recipes.locks.InterProcessMutex;
 import org.apache.curator.retry.RetryOneTime;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
@@ -38,7 +41,7 @@
 
             InterProcessMutex lock = new InterProcessMutex(client, "/one/two");
             complete(AsyncWrappers.lockAsync(lock), (__, e) -> {
-                Assert.assertNull(e);
+                assertNull(e);
                 AsyncWrappers.release(lock);
             });
         }
@@ -57,7 +60,7 @@
             AsyncWrappers.lockAsync(lock1).thenAccept(__ -> {
                 latch.countDown();  // don't release the lock
             });
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
 
             CountDownLatch latch2 = new CountDownLatch(1);
             AsyncWrappers.lockAsync(lock2, timing.forSleepingABit().milliseconds(), TimeUnit.MILLISECONDS).exceptionally(e -> {
@@ -67,7 +70,7 @@
                 }
                 return null;
             });
-            Assert.assertTrue(timing.awaitLatch(latch2));
+            assertTrue(timing.awaitLatch(latch2));
         }
     }
 }
diff --git a/curator-x-async/src/test/java/org/apache/curator/x/async/TestBasicOperations.java b/curator-x-async/src/test/java/org/apache/curator/x/async/TestBasicOperations.java
index f814146..3e3adb2 100644
--- a/curator-x-async/src/test/java/org/apache/curator/x/async/TestBasicOperations.java
+++ b/curator-x-async/src/test/java/org/apache/curator/x/async/TestBasicOperations.java
@@ -18,6 +18,17 @@
  */
 package org.apache.curator.x.async;
 
+import static java.util.EnumSet.of;
+import static org.apache.curator.x.async.api.CreateOption.compress;
+import static org.apache.curator.x.async.api.CreateOption.setDataIfExists;
+import static org.apache.zookeeper.CreateMode.EPHEMERAL_SEQUENTIAL;
+import static org.apache.zookeeper.CreateMode.PERSISTENT_SEQUENTIAL;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.framework.api.transaction.CuratorOp;
@@ -26,26 +37,20 @@
 import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.Watcher;
 import org.apache.zookeeper.data.Stat;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.concurrent.CompletionStage;
 import java.util.concurrent.CountDownLatch;
 
-import static java.util.EnumSet.of;
-import static org.apache.curator.x.async.api.CreateOption.compress;
-import static org.apache.curator.x.async.api.CreateOption.setDataIfExists;
-import static org.apache.zookeeper.CreateMode.EPHEMERAL_SEQUENTIAL;
-import static org.apache.zookeeper.CreateMode.PERSISTENT_SEQUENTIAL;
-
 public class TestBasicOperations extends CompletableBaseClassForTests
 {
     private AsyncCuratorFramework client;
 
-    @BeforeMethod
+    @BeforeEach
     @Override
     public void setup() throws Exception
     {
@@ -56,7 +61,7 @@
         this.client = AsyncCuratorFramework.wrap(client);
     }
 
-    @AfterMethod
+    @AfterEach
     @Override
     public void teardown() throws Exception
     {
@@ -74,29 +79,29 @@
         CuratorOp op2 = client.transactionOp().create().withMode(PERSISTENT_SEQUENTIAL).forPath("/test/node-");
         complete(client.transaction().forOperations(Arrays.asList(op1, op2)));
 
-        Assert.assertEquals(client.unwrap().getChildren().forPath("/test").size(), 2);
+        assertEquals(client.unwrap().getChildren().forPath("/test").size(), 2);
     }
 
     @Test
     public void testCrud()
     {
         AsyncStage<String> createStage = client.create().forPath("/test", "one".getBytes());
-        complete(createStage, (path, e) -> Assert.assertEquals(path, "/test"));
+        complete(createStage, (path, e) -> assertEquals(path, "/test"));
 
         AsyncStage<byte[]> getStage = client.getData().forPath("/test");
-        complete(getStage, (data, e) -> Assert.assertEquals(data, "one".getBytes()));
+        complete(getStage, (data, e) -> assertArrayEquals(data, "one".getBytes()));
 
         CompletionStage<byte[]> combinedStage = client.setData().forPath("/test", "new".getBytes()).thenCompose(
             __ -> client.getData().forPath("/test"));
-        complete(combinedStage, (data, e) -> Assert.assertEquals(data, "new".getBytes()));
+        complete(combinedStage, (data, e) -> assertArrayEquals(data, "new".getBytes()));
 
         CompletionStage<Void> combinedDelete = client.create().withMode(EPHEMERAL_SEQUENTIAL).forPath("/deleteme").thenCompose(
             path -> client.delete().forPath(path));
-        complete(combinedDelete, (v, e) -> Assert.assertNull(e));
+        complete(combinedDelete, (v, e) -> assertNull(e));
 
         CompletionStage<byte[]> setDataIfStage = client.create().withOptions(of(compress, setDataIfExists)).forPath("/test", "last".getBytes())
             .thenCompose(__ -> client.getData().decompressed().forPath("/test"));
-        complete(setDataIfStage, (data, e) -> Assert.assertEquals(data, "last".getBytes()));
+        complete(setDataIfStage, (data, e) -> assertArrayEquals(data, "last".getBytes()));
     }
 
     @Test
@@ -104,12 +109,12 @@
     {
         CountDownLatch latch = new CountDownLatch(1);
         client.getData().forPath("/woop").exceptionally(e -> {
-            Assert.assertTrue(e instanceof KeeperException);
-            Assert.assertEquals(((KeeperException)e).code(), KeeperException.Code.NONODE);
+            assertTrue(e instanceof KeeperException);
+            assertEquals(((KeeperException)e).code(), KeeperException.Code.NONODE);
             latch.countDown();
             return null;
         });
-        Assert.assertTrue(timing.awaitLatch(latch));
+        assertTrue(timing.awaitLatch(latch));
     }
 
     @Test
@@ -117,12 +122,12 @@
     {
         CountDownLatch latch = new CountDownLatch(1);
         client.watched().checkExists().forPath("/test").event().whenComplete((event, exception) -> {
-            Assert.assertNull(exception);
-            Assert.assertEquals(event.getType(), Watcher.Event.EventType.NodeCreated);
+            assertNull(exception);
+            assertEquals(event.getType(), Watcher.Event.EventType.NodeCreated);
             latch.countDown();
         });
         client.create().forPath("/test");
-        Assert.assertTrue(timing.awaitLatch(latch));
+        assertTrue(timing.awaitLatch(latch));
     }
 
     @Test
@@ -142,14 +147,14 @@
 
         CountDownLatch latch = new CountDownLatch(1);
         complete(stage.event(), (v, e) -> {
-            Assert.assertTrue(e instanceof AsyncEventException);
-            Assert.assertEquals(((AsyncEventException)e).getKeeperState(), Watcher.Event.KeeperState.Disconnected);
+            assertTrue(e instanceof AsyncEventException);
+            assertEquals(((AsyncEventException)e).getKeeperState(), Watcher.Event.KeeperState.Disconnected);
             ((AsyncEventException)e).reset().thenRun(latch::countDown);
         });
 
         server.restart();
         client.create().forPath("/test");
-        Assert.assertTrue(timing.awaitLatch(latch));
+        assertTrue(timing.awaitLatch(latch));
     }
 
     @Test
@@ -157,36 +162,36 @@
     {
         CompletionStage<AsyncResult<String>> resultStage = AsyncResult.of(client.create().forPath("/first"));
         complete(resultStage, (v, e) -> {
-            Assert.assertNull(e);
-            Assert.assertEquals(v.getRawValue(), "/first");
-            Assert.assertNull(v.getRawException());
-            Assert.assertEquals(v.getCode(), KeeperException.Code.OK);
+            assertNull(e);
+            assertEquals(v.getRawValue(), "/first");
+            assertNull(v.getRawException());
+            assertEquals(v.getCode(), KeeperException.Code.OK);
         });
 
         resultStage = AsyncResult.of(client.create().forPath("/foo/bar"));
         complete(resultStage, (v, e) -> {
-            Assert.assertNull(e);
-            Assert.assertNull(v.getRawValue());
-            Assert.assertNull(v.getRawException());
-            Assert.assertEquals(v.getCode(), KeeperException.Code.NONODE);
+            assertNull(e);
+            assertNull(v.getRawValue());
+            assertNull(v.getRawException());
+            assertEquals(v.getCode(), KeeperException.Code.NONODE);
         });
 
         resultStage = AsyncResult.of(client.create().forPath("illegal path"));
         complete(resultStage, (v, e) -> {
-            Assert.assertNull(e);
-            Assert.assertNull(v.getRawValue());
-            Assert.assertNotNull(v.getRawException());
-            Assert.assertTrue(v.getRawException() instanceof IllegalArgumentException);
-            Assert.assertEquals(v.getCode(), KeeperException.Code.SYSTEMERROR);
+            assertNull(e);
+            assertNull(v.getRawValue());
+            assertNotNull(v.getRawException());
+            assertTrue(v.getRawException() instanceof IllegalArgumentException);
+            assertEquals(v.getCode(), KeeperException.Code.SYSTEMERROR);
         });
 
         server.stop();
         resultStage = AsyncResult.of(client.create().forPath("/second"));
         complete(resultStage, (v, e) -> {
-            Assert.assertNull(e);
-            Assert.assertNull(v.getRawValue());
-            Assert.assertNull(v.getRawException());
-            Assert.assertEquals(v.getCode(), KeeperException.Code.CONNECTIONLOSS);
+            assertNull(e);
+            assertNull(v.getRawValue());
+            assertNull(v.getRawException());
+            assertEquals(v.getCode(), KeeperException.Code.CONNECTIONLOSS);
         });
     }
 
@@ -197,6 +202,6 @@
 
         Stat stat = new Stat();
         complete(client.getData().storingStatIn(stat).forPath("/test"));
-        Assert.assertEquals(stat.getDataLength(), "hey".length());
+        assertEquals(stat.getDataLength(), "hey".length());
     }
 }
diff --git a/curator-x-async/src/test/java/org/apache/curator/x/async/migrations/TestMigrationManager.java b/curator-x-async/src/test/java/org/apache/curator/x/async/migrations/TestMigrationManager.java
index 6cc7fd1..00ef28b 100644
--- a/curator-x-async/src/test/java/org/apache/curator/x/async/migrations/TestMigrationManager.java
+++ b/curator-x-async/src/test/java/org/apache/curator/x/async/migrations/TestMigrationManager.java
@@ -18,6 +18,12 @@
  */
 package org.apache.curator.x.async.migrations;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import com.google.common.base.Throwables;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -35,10 +41,10 @@
 import org.apache.curator.x.async.modeled.ModeledFramework;
 import org.apache.curator.x.async.modeled.ZPath;
 import org.apache.zookeeper.KeeperException;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
 import java.time.Duration;
 import java.util.Arrays;
 import java.util.Collections;
@@ -69,7 +75,7 @@
     private final AtomicReference<CountDownLatch> filterLatch = new AtomicReference<>();
     private CountDownLatch filterIsSetLatch;
 
-    @BeforeMethod
+    @BeforeEach
     @Override
     public void setup() throws Exception
     {
@@ -119,7 +125,7 @@
         manager.debugCount = new AtomicInteger();
     }
 
-    @AfterMethod
+    @AfterEach
     @Override
     public void teardown() throws Exception
     {
@@ -140,14 +146,14 @@
 
         ModeledFramework<ModelV3> v3Client = ModeledFramework.wrap(client, v3Spec);
         complete(v3Client.read(), (m, e) -> {
-            Assert.assertEquals(m.getAge(), 30);
-            Assert.assertEquals(m.getFirstName(), "One");
-            Assert.assertEquals(m.getLastName(), "Two");
+            assertEquals(m.getAge(), 30);
+            assertEquals(m.getFirstName(), "One");
+            assertEquals(m.getLastName(), "Two");
         });
 
         int count = manager.debugCount.get();
         complete(manager.migrate(migrationSet));
-        Assert.assertEquals(manager.debugCount.get(), count);   // second call should do nothing
+        assertEquals(manager.debugCount.get(), count);   // second call should do nothing
     }
 
     @Test
@@ -158,7 +164,7 @@
         complete(manager.migrate(migrationSet));
 
         ModeledFramework<ModelV1> v1Client = ModeledFramework.wrap(client, v1Spec);
-        complete(v1Client.read(), (m, e) -> Assert.assertEquals(m.getName(), "Test"));
+        complete(v1Client.read(), (m, e) -> assertEquals(m.getName(), "Test"));
 
         Migration m2 = () -> Collections.singletonList(v2op);
         migrationSet = MigrationSet.build("1", Arrays.asList(m1, m2));
@@ -166,8 +172,8 @@
 
         ModeledFramework<ModelV2> v2Client = ModeledFramework.wrap(client, v2Spec);
         complete(v2Client.read(), (m, e) -> {
-            Assert.assertEquals(m.getName(), "Test 2");
-            Assert.assertEquals(m.getAge(), 10);
+            assertEquals(m.getName(), "Test 2");
+            assertEquals(m.getAge(), 10);
         });
 
         Migration m3 = () -> Collections.singletonList(v3op);
@@ -176,9 +182,9 @@
 
         ModeledFramework<ModelV3> v3Client = ModeledFramework.wrap(client, v3Spec);
         complete(v3Client.read(), (m, e) -> {
-            Assert.assertEquals(m.getAge(), 30);
-            Assert.assertEquals(m.getFirstName(), "One");
-            Assert.assertEquals(m.getLastName(), "Two");
+            assertEquals(m.getAge(), 30);
+            assertEquals(m.getFirstName(), "One");
+            assertEquals(m.getLastName(), "Two");
         });
     }
 
@@ -195,8 +201,8 @@
         MigrationSet migrationSet = MigrationSet.build("main", Collections.singletonList(initialMigration));
         complete(manager.migrate(migrationSet));
 
-        Assert.assertNotNull(client.unwrap().checkExists().forPath("/parent/three"));
-        Assert.assertEquals(client.unwrap().getData().forPath("/main"), "hey".getBytes());
+        assertNotNull(client.unwrap().checkExists().forPath("/parent/three"));
+        assertArrayEquals(client.unwrap().getData().forPath("/main"), "hey".getBytes());
 
         CuratorOp newOp1 = client.transactionOp().create().forPath("/new");
         CuratorOp newOp2 = client.transactionOp().delete().forPath("/main");    // maybe this is no longer needed
@@ -205,7 +211,7 @@
         migrationSet = MigrationSet.build("main", Arrays.asList(initialMigration, newMigration));
         complete(manager.migrate(migrationSet));
 
-        Assert.assertNull(client.unwrap().checkExists().forPath("/main"));
+        assertNull(client.unwrap().checkExists().forPath("/main"));
     }
 
     @Test
@@ -223,11 +229,11 @@
         try
         {
             complete(manager.migrate(migrationSet));
-            Assert.fail("Should throw");
+            fail("Should throw");
         }
         catch ( Throwable e )
         {
-            Assert.assertTrue(Throwables.getRootCause(e) instanceof MigrationException);
+            assertTrue(Throwables.getRootCause(e) instanceof MigrationException);
         }
     }
 
@@ -246,11 +252,11 @@
         try
         {
             complete(manager.migrate(migrationSet));
-            Assert.fail("Should throw");
+            fail("Should throw");
         }
         catch ( Throwable e )
         {
-            Assert.assertTrue(Throwables.getRootCause(e) instanceof MigrationException);
+            assertTrue(Throwables.getRootCause(e) instanceof MigrationException);
         }
     }
 
@@ -265,14 +271,14 @@
         try
         {
             complete(manager.migrate(migrationSet));
-            Assert.fail("Should throw");
+            fail("Should throw");
         }
         catch ( Throwable e )
         {
-            Assert.assertTrue(Throwables.getRootCause(e) instanceof KeeperException.NoNodeException);
+            assertTrue(Throwables.getRootCause(e) instanceof KeeperException.NoNodeException);
         }
 
-        Assert.assertNull(client.unwrap().checkExists().forPath("/test"));  // should be all or nothing
+        assertNull(client.unwrap().checkExists().forPath("/test"));  // should be all or nothing
     }
 
     @Test
@@ -285,14 +291,14 @@
         try
         {
             complete(manager.migrate(migrationSet));
-            Assert.fail("Should throw");
+            fail("Should throw");
         }
         catch ( Throwable e )
         {
-            Assert.assertTrue(Throwables.getRootCause(e) instanceof KeeperException.NoNodeException);
+            assertTrue(Throwables.getRootCause(e) instanceof KeeperException.NoNodeException);
         }
 
-        Assert.assertNull(client.unwrap().checkExists().forPath("/test"));
+        assertNull(client.unwrap().checkExists().forPath("/test"));
     }
 
     @Test
@@ -305,22 +311,22 @@
         CountDownLatch latch = new CountDownLatch(1);
         filterLatch.set(latch);
         CompletionStage<Void> first = manager.migrate(migrationSet);
-        Assert.assertTrue(timing.awaitLatch(filterIsSetLatch));
+        assertTrue(timing.awaitLatch(filterIsSetLatch));
 
         MigrationManager manager2 = new MigrationManager(client, LOCK_PATH, META_DATA_PATH, executor, Duration.ofMillis(timing.forSleepingABit().milliseconds()));
         try
         {
             complete(manager2.migrate(migrationSet));
-            Assert.fail("Should throw");
+            fail("Should throw");
         }
         catch ( Throwable e )
         {
-            Assert.assertTrue(Throwables.getRootCause(e) instanceof AsyncWrappers.TimeoutException, "Should throw AsyncWrappers.TimeoutException, was: " + Throwables.getStackTraceAsString(Throwables.getRootCause(e)));
+            assertTrue(Throwables.getRootCause(e) instanceof AsyncWrappers.TimeoutException, "Should throw AsyncWrappers.TimeoutException, was: " + Throwables.getStackTraceAsString(Throwables.getRootCause(e)));
         }
 
         latch.countDown();
         complete(first);
-        Assert.assertEquals(client.unwrap().getData().forPath("/test/bar"), "first".getBytes());
+        assertArrayEquals(client.unwrap().getData().forPath("/test/bar"), "first".getBytes());
     }
 
     @Test
@@ -333,23 +339,23 @@
         CountDownLatch latch = new CountDownLatch(1);
         filterLatch.set(latch);
         CompletionStage<Void> first = manager.migrate(migrationSet);
-        Assert.assertTrue(timing.awaitLatch(filterIsSetLatch));
+        assertTrue(timing.awaitLatch(filterIsSetLatch));
 
         CompletionStage<Void> second = manager.migrate(migrationSet);
         try
         {
             second.toCompletableFuture().get(timing.forSleepingABit().milliseconds(), TimeUnit.MILLISECONDS);
-            Assert.fail("Should throw");
+            fail("Should throw");
         }
         catch ( Throwable e )
         {
-            Assert.assertTrue(Throwables.getRootCause(e) instanceof TimeoutException, "Should throw TimeoutException, was: " + Throwables.getStackTraceAsString(Throwables.getRootCause(e)));
+            assertTrue(Throwables.getRootCause(e) instanceof TimeoutException, "Should throw TimeoutException, was: " + Throwables.getStackTraceAsString(Throwables.getRootCause(e)));
         }
 
         latch.countDown();
         complete(first);
-        Assert.assertEquals(client.unwrap().getData().forPath("/test/bar"), "first".getBytes());
+        assertArrayEquals(client.unwrap().getData().forPath("/test/bar"), "first".getBytes());
         complete(second);
-        Assert.assertEquals(manager.debugCount.get(), 1);
+        assertEquals(manager.debugCount.get(), 1);
     }
 }
diff --git a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestCachedModeledFramework.java b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestCachedModeledFramework.java
index 70f9c66..1dc9feb 100644
--- a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestCachedModeledFramework.java
+++ b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestCachedModeledFramework.java
@@ -18,6 +18,11 @@
  */
 package org.apache.curator.x.async.modeled;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Sets;
 import org.apache.curator.framework.state.ConnectionState;
 import org.apache.curator.test.Timing;
@@ -25,8 +30,9 @@
 import org.apache.curator.x.async.modeled.cached.CachedModeledFramework;
 import org.apache.curator.x.async.modeled.cached.ModeledCacheListener;
 import org.apache.curator.x.async.modeled.models.TestModel;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.io.IOException;
 import java.math.BigInteger;
 import java.util.Arrays;
@@ -39,7 +45,7 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-@Test(groups = CuratorTestBase.zk35TestCompatibilityGroup)
+@Tag(CuratorTestBase.zk35TestCompatibilityGroup)
 public class TestCachedModeledFramework extends TestModeledFrameworkBase
 {
     @Test
@@ -56,7 +62,7 @@
         try
         {
             client.child(model).set(model);
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
+            assertTrue(timing.acquireSemaphore(semaphore));
 
             CountDownLatch latch = new CountDownLatch(1);
             rawClient.getConnectionStateListenable().addListener((__, state) -> {
@@ -66,11 +72,11 @@
                 }
             });
             server.stop();
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
 
             complete(client.child(model).read().whenComplete((value, e) -> {
-                Assert.assertNotNull(value);
-                Assert.assertNull(e);
+                assertNotNull(value);
+                assertNull(e);
             }));
         }
         finally
@@ -93,10 +99,10 @@
         client.start();
         try
         {
-            Assert.assertFalse(timing.forSleepingABit().acquireSemaphore(semaphore));
+            assertFalse(timing.forSleepingABit().acquireSemaphore(semaphore));
 
             client.child("2").set(model2);  // set before cache is started
-            Assert.assertTrue(timing.acquireSemaphore(semaphore));
+            assertTrue(timing.acquireSemaphore(semaphore));
         }
         finally
         {
@@ -124,7 +130,7 @@
             complete(client.child("p").child("c2").set(child2));
             complete(client.child("p").child("c1").child("g1").set(grandChild1));
             complete(client.child("p").child("c2").child("g2").set(grandChild2));
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
 
             complete(client.child("p").children(), (v, e) ->
             {
@@ -132,23 +138,23 @@
                     client.child("p").child("c1").modelSpec().path(),
                     client.child("p").child("c2").modelSpec().path()
                 );
-                Assert.assertEquals(v, paths);
+                assertEquals(v, paths);
             });
 
             complete(client.child("p").childrenAsZNodes(), (v, e) ->
             {
                 Set<TestModel> cachedModels = toSet(v.stream(), ZNode::model);
-                Assert.assertEquals(cachedModels, Sets.newHashSet(child1, child2));
+                assertEquals(cachedModels, Sets.newHashSet(child1, child2));
 
                 // verify that the same nodes are returned from the uncached method
                 complete(ModeledFramework.wrap(async, modelSpec).child("p").childrenAsZNodes(), (v2, e2) -> {
                     Set<TestModel> uncachedModels = toSet(v2.stream(), ZNode::model);
-                    Assert.assertEquals(cachedModels, uncachedModels);
+                    assertEquals(cachedModels, uncachedModels);
                 });
             });
 
-            complete(client.child("p").child("c1").childrenAsZNodes(), (v, e) -> Assert.assertEquals(toSet(v.stream(), ZNode::model), Sets.newHashSet(grandChild1)));
-            complete(client.child("p").child("c2").childrenAsZNodes(), (v, e) -> Assert.assertEquals(toSet(v.stream(), ZNode::model), Sets.newHashSet(grandChild2)));
+            complete(client.child("p").child("c1").childrenAsZNodes(), (v, e) -> assertEquals(toSet(v.stream(), ZNode::model), Sets.newHashSet(grandChild1)));
+            complete(client.child("p").child("c2").childrenAsZNodes(), (v, e) -> assertEquals(toSet(v.stream(), ZNode::model), Sets.newHashSet(grandChild2)));
         }
     }
 
@@ -164,13 +170,13 @@
 
             client.start();
             complete(client.child("m").set(model));
-            Assert.assertTrue(timing.awaitLatch(latch));
+            assertTrue(timing.awaitLatch(latch));
 
             // call 2 times in a row to validate CURATOR-546
             Optional<ZNode<TestModel>> optZNode = client.cache().currentData(modelSpec.path().child("m"));
-            Assert.assertEquals(optZNode.orElseThrow(() -> new AssertionError("node is missing")).model(), model);
+            assertEquals(optZNode.orElseThrow(() -> new AssertionError("node is missing")).model(), model);
             optZNode = client.cache().currentData(modelSpec.path().child("m"));
-            Assert.assertEquals(optZNode.orElseThrow(() -> new AssertionError("node is missing")).model(), model);
+            assertEquals(optZNode.orElseThrow(() -> new AssertionError("node is missing")).model(), model);
         }
     }
 
diff --git a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestModeledFramework.java b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestModeledFramework.java
index 7cbf964..0b64b1c 100644
--- a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestModeledFramework.java
+++ b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestModeledFramework.java
@@ -19,6 +19,11 @@
 
 package org.apache.curator.x.async.modeled;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import com.google.common.collect.Sets;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -38,8 +43,8 @@
 import org.apache.zookeeper.data.Id;
 import org.apache.zookeeper.data.Stat;
 import org.apache.zookeeper.server.auth.DigestAuthenticationProvider;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.math.BigInteger;
 import java.security.NoSuchAlgorithmException;
 import java.util.Collections;
@@ -56,13 +61,13 @@
         TestModel rawModel2 = new TestModel("Wayne", "Rooney", "Old Trafford", 10, BigInteger.valueOf(1));
         ModeledFramework<TestModel> client = ModeledFramework.wrap(async, modelSpec);
         AsyncStage<String> stage = client.set(rawModel);
-        Assert.assertNull(stage.event());
-        complete(stage, (s, e) -> Assert.assertNotNull(s));
-        complete(client.read(), (model, e) -> Assert.assertEquals(model, rawModel));
+        assertNull(stage.event());
+        complete(stage, (s, e) -> assertNotNull(s));
+        complete(client.read(), (model, e) -> assertEquals(model, rawModel));
         complete(client.update(rawModel2));
-        complete(client.read(), (model, e) -> Assert.assertEquals(model, rawModel2));
+        complete(client.read(), (model, e) -> assertEquals(model, rawModel2));
         complete(client.delete());
-        complete(client.checkExists(), (stat, e) -> Assert.assertNull(stat));
+        complete(client.checkExists(), (stat, e) -> assertNull(stat));
     }
 
     @Test
@@ -70,10 +75,10 @@
     {
         TestNewerModel rawNewModel = new TestNewerModel("John", "Galt", "1 Galt's Gulch", 42, BigInteger.valueOf(1), 100);
         ModeledFramework<TestNewerModel> clientForNew = ModeledFramework.wrap(async, newModelSpec);
-        complete(clientForNew.set(rawNewModel), (s, e) -> Assert.assertNotNull(s));
+        complete(clientForNew.set(rawNewModel), (s, e) -> assertNotNull(s));
 
         ModeledFramework<TestModel> clientForOld = ModeledFramework.wrap(async, modelSpec);
-        complete(clientForOld.read(), (model, e) -> Assert.assertTrue(rawNewModel.equalsOld(model)));
+        complete(clientForOld.read(), (model, e) -> assertTrue(rawNewModel.equalsOld(model)));
     }
 
     @Test
@@ -83,9 +88,9 @@
         ModeledFramework<TestModel> client = ModeledFramework.builder(async, modelSpec).watched().build();
         client.checkExists().event().whenComplete((event, ex) -> latch.countDown());
         timing.sleepABit();
-        Assert.assertEquals(latch.getCount(), 1);
+        assertEquals(latch.getCount(), 1);
         client.set(new TestModel());
-        Assert.assertTrue(timing.awaitLatch(latch));
+        assertTrue(timing.awaitLatch(latch));
     }
 
     @Test
@@ -98,7 +103,7 @@
         complete(client.child("three").set(model));
 
         Set<ZPath> expected = Sets.newHashSet(path.child("one"), path.child("two"), path.child("three"));
-        complete(client.children(), (children, e) -> Assert.assertEquals(Sets.newHashSet(children), expected));
+        complete(client.children(), (children, e) -> assertEquals(Sets.newHashSet(children), expected));
     }
 
     @Test
@@ -108,7 +113,7 @@
         });    // ignore error
 
         ModeledFramework<TestModel> client = ModeledFramework.builder(async, modelSpec).watched().build();
-        complete(client.read(), (model, e) -> Assert.assertTrue(e instanceof KeeperException.NoNodeException));
+        complete(client.read(), (model, e) -> assertTrue(e instanceof KeeperException.NoNodeException));
     }
 
     @Test
@@ -122,7 +127,7 @@
             try
             {
                 schemaClient.create().forPath(modelSpec.path().fullPath(), "asflasfas".getBytes());
-                Assert.fail("Should've thrown SchemaViolation");
+                fail("Should've thrown SchemaViolation");
             }
             catch ( SchemaViolation dummy )
             {
@@ -130,7 +135,7 @@
             }
 
             ModeledFramework<TestModel> modeledSchemaClient = ModeledFramework.wrap(AsyncCuratorFramework.wrap(schemaClient), modelSpec);
-            complete(modeledSchemaClient.set(new TestModel("one", "two", "three", 4, BigInteger.ONE)), (dummy, e) -> Assert.assertNull(e));
+            complete(modeledSchemaClient.set(new TestModel("one", "two", "three", 4, BigInteger.ONE)), (dummy, e) -> assertNull(e));
         }
     }
 
@@ -144,17 +149,17 @@
 
         VersionedModeledFramework<TestModel> versioned = client.versioned();
         complete(versioned.read().whenComplete((v, e) -> {
-            Assert.assertNull(e);
-            Assert.assertTrue(v.version() > 0);
-        }).thenCompose(versioned::set), (s, e) -> Assert.assertNull(e)); // version is correct should succeed
+            assertNull(e);
+            assertTrue(v.version() > 0);
+        }).thenCompose(versioned::set), (s, e) -> assertNull(e)); // version is correct should succeed
         
         Versioned<TestModel> badVersion = Versioned.from(model, 100000);
-        complete(versioned.set(badVersion), (v, e) -> Assert.assertTrue(e instanceof KeeperException.BadVersionException));
+        complete(versioned.set(badVersion), (v, e) -> assertTrue(e instanceof KeeperException.BadVersionException));
         
         final Stat stat = new Stat();
         complete(client.read(stat));
         // wrong version, needs to fail
-        complete(client.delete(stat.getVersion() + 1), (v, e) -> Assert.assertTrue(e instanceof KeeperException.BadVersionException));
+        complete(client.delete(stat.getVersion() + 1), (v, e) -> assertTrue(e instanceof KeeperException.BadVersionException));
         // correct version
         complete(client.delete(stat.getVersion()));
     }
@@ -166,13 +171,13 @@
         ModelSpec<TestModel> aclModelSpec = ModelSpec.builder(modelSpec.path(), modelSpec.serializer()).withAclList(aclList).build();
         ModeledFramework<TestModel> client = ModeledFramework.wrap(async, aclModelSpec);
         complete(client.set(new TestModel("John", "Galt", "Galt's Gulch", 21, BigInteger.valueOf(1010101))));
-        complete(client.update(new TestModel("John", "Galt", "Galt's Gulch", 54, BigInteger.valueOf(88))), (__, e) -> Assert.assertNotNull(e, "Should've gotten an auth failure"));
+        complete(client.update(new TestModel("John", "Galt", "Galt's Gulch", 54, BigInteger.valueOf(88))), (__, e) -> assertNotNull(e, "Should've gotten an auth failure"));
 
         try (CuratorFramework authCurator = CuratorFrameworkFactory.builder().connectString(server.getConnectString()).retryPolicy(new RetryOneTime(1)).authorization("digest", "test:test".getBytes()).build())
         {
             authCurator.start();
             ModeledFramework<TestModel> authClient = ModeledFramework.wrap(AsyncCuratorFramework.wrap(authCurator), aclModelSpec);
-            complete(authClient.update(new TestModel("John", "Galt", "Galt's Gulch", 42, BigInteger.valueOf(66))), (__, e) -> Assert.assertNull(e, "Should've succeeded"));
+            complete(authClient.update(new TestModel("John", "Galt", "Galt's Gulch", 42, BigInteger.valueOf(66))), (__, e) -> assertNull(e, "Should've succeeded"));
         }
     }
 }
diff --git a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestModeledFrameworkBase.java b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestModeledFrameworkBase.java
index 61a4570..7465a2e 100644
--- a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestModeledFrameworkBase.java
+++ b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestModeledFrameworkBase.java
@@ -26,8 +26,8 @@
 import org.apache.curator.x.async.CompletableBaseClassForTests;
 import org.apache.curator.x.async.modeled.models.TestModel;
 import org.apache.curator.x.async.modeled.models.TestNewerModel;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
 
 public class TestModeledFrameworkBase extends CompletableBaseClassForTests
 {
@@ -37,7 +37,7 @@
     protected ModelSpec<TestNewerModel> newModelSpec;
     protected AsyncCuratorFramework async;
 
-    @BeforeMethod
+    @BeforeEach
     @Override
     public void setup() throws Exception
     {
@@ -54,7 +54,7 @@
         newModelSpec = ModelSpec.builder(path, newSerializer).build();
     }
 
-    @AfterMethod
+    @AfterEach
     @Override
     public void teardown() throws Exception
     {
diff --git a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestZPath.java b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestZPath.java
index d2c24da..e35354c 100644
--- a/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestZPath.java
+++ b/curator-x-async/src/test/java/org/apache/curator/x/async/modeled/TestZPath.java
@@ -18,109 +18,114 @@
  */
 package org.apache.curator.x.async.modeled;
 
+import static org.apache.curator.x.async.modeled.ZPath.parameter;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import org.apache.curator.utils.ZKPaths;
 import org.apache.curator.x.async.modeled.details.ZPathImpl;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
-import static org.apache.curator.x.async.modeled.ZPath.parameter;
+import org.junit.jupiter.api.Test;
 
 public class TestZPath
 {
     @Test
     public void testRoot()
     {
-        Assert.assertEquals(ZPath.root.nodeName(), ZKPaths.PATH_SEPARATOR);
-        Assert.assertEquals(ZPath.root, ZPathImpl.root);
-        Assert.assertTrue(ZPath.root.isRoot());
-        Assert.assertEquals(ZPath.root.child("foo").parent(), ZPath.root);
-        Assert.assertTrue(ZPath.root.child("foo").parent().isRoot());
+        assertEquals(ZPath.root.nodeName(), ZKPaths.PATH_SEPARATOR);
+        assertEquals(ZPath.root, ZPathImpl.root);
+        assertTrue(ZPath.root.isRoot());
+        assertEquals(ZPath.root.child("foo").parent(), ZPath.root);
+        assertTrue(ZPath.root.child("foo").parent().isRoot());
     }
 
     @Test
     public void testBasic()
     {
         ZPath path = ZPath.root.child("one").child("two");
-        Assert.assertFalse(path.isRoot());
-        Assert.assertEquals(path, ZPath.root.child("one").child("two"));
-        Assert.assertNotEquals(path, ZPath.root.child("onex").child("two"));
-        Assert.assertEquals(path.nodeName(), "two");
-        Assert.assertEquals(path.fullPath(), "/one/two");
-        Assert.assertEquals(path.parent().fullPath(), "/one");
-        Assert.assertEquals(path.fullPath(), "/one/two");       // call twice to test the internal cache
-        Assert.assertEquals(path.parent().fullPath(), "/one");  // call twice to test the internal cache
+        assertFalse(path.isRoot());
+        assertEquals(path, ZPath.root.child("one").child("two"));
+        assertNotEquals(path, ZPath.root.child("onex").child("two"));
+        assertEquals(path.nodeName(), "two");
+        assertEquals(path.fullPath(), "/one/two");
+        assertEquals(path.parent().fullPath(), "/one");
+        assertEquals(path.fullPath(), "/one/two");       // call twice to test the internal cache
+        assertEquals(path.parent().fullPath(), "/one");  // call twice to test the internal cache
 
-        Assert.assertTrue(path.startsWith(ZPath.root.child("one")));
-        Assert.assertFalse(path.startsWith(ZPath.root.child("two")));
+        assertTrue(path.startsWith(ZPath.root.child("one")));
+        assertFalse(path.startsWith(ZPath.root.child("two")));
 
         ZPath checkIdLike = ZPath.parse("/one/{two}/three");
-        Assert.assertTrue(checkIdLike.isResolved());
+        assertTrue(checkIdLike.isResolved());
         checkIdLike = ZPath.parse("/one/" + ZPath.parameter() + "/three");
-        Assert.assertTrue(checkIdLike.isResolved());
+        assertTrue(checkIdLike.isResolved());
         checkIdLike = ZPath.parse("/one/" + ZPath.parameter("others") + "/three");
-        Assert.assertTrue(checkIdLike.isResolved());
+        assertTrue(checkIdLike.isResolved());
     }
 
     @Test
     public void testParsing()
     {
-        Assert.assertEquals(ZPath.parse("/"), ZPath.root);
-        Assert.assertEquals(ZPath.parse("/one/two/three"), ZPath.root.child("one").child("two").child("three"));
-        Assert.assertEquals(ZPath.parse("/one/two/three"), ZPath.from("one", "two", "three"));
-        Assert.assertEquals(ZPath.parseWithIds("/one/{id}/two/{id}"), ZPath.from("one", parameter(), "two", parameter()));
+        assertEquals(ZPath.parse("/"), ZPath.root);
+        assertEquals(ZPath.parse("/one/two/three"), ZPath.root.child("one").child("two").child("three"));
+        assertEquals(ZPath.parse("/one/two/three"), ZPath.from("one", "two", "three"));
+        assertEquals(ZPath.parseWithIds("/one/{id}/two/{id}"), ZPath.from("one", parameter(), "two", parameter()));
     }
 
-    @Test(expectedExceptions = IllegalStateException.class)
+    @Test
     public void testUnresolvedPath()
     {
-        ZPath path = ZPath.from("one", parameter(), "two");
-        path.fullPath();
+        assertThrows(IllegalStateException.class, ()->{
+            ZPath path = ZPath.from("one", parameter(), "two");
+            path.fullPath();
+        });
     }
 
     @Test
     public void testResolvedPath()
     {
         ZPath path = ZPath.from("one", parameter(), "two", parameter());
-        Assert.assertEquals(path.resolved("a", "b"), ZPath.from("one", "a", "two", "b"));
+        assertEquals(path.resolved("a", "b"), ZPath.from("one", "a", "two", "b"));
     }
 
     @Test
     public void testSchema()
     {
         ZPath path = ZPath.from("one", parameter(), "two", parameter());
-        Assert.assertEquals(path.toSchemaPathPattern().toString(), "/one/.*/two/.*");
+        assertEquals(path.toSchemaPathPattern().toString(), "/one/.*/two/.*");
         path = ZPath.parse("/one/two/three");
-        Assert.assertEquals(path.toSchemaPathPattern().toString(), "/one/two/three");
+        assertEquals(path.toSchemaPathPattern().toString(), "/one/two/three");
         path = ZPath.parseWithIds("/one/{id}/three");
-        Assert.assertEquals(path.toSchemaPathPattern().toString(), "/one/.*/three");
+        assertEquals(path.toSchemaPathPattern().toString(), "/one/.*/three");
         path = ZPath.parseWithIds("/{id}/{id}/three");
-        Assert.assertEquals(path.toSchemaPathPattern().toString(), "/.*/.*/three");
+        assertEquals(path.toSchemaPathPattern().toString(), "/.*/.*/three");
     }
 
     @Test
     public void testCustomIds()
     {
-        Assert.assertEquals(ZPath.parseWithIds("/a/{a}/bee/{bee}/c/{c}").toString(), "/a/{a}/bee/{bee}/c/{c}");
-        Assert.assertEquals(ZPath.from("a", parameter(), "b", parameter()).toString(), "/a/{id}/b/{id}");
-        Assert.assertEquals(ZPath.from("a", parameter("foo"), "b", parameter("bar")).toString(), "/a/{foo}/b/{bar}");
+        assertEquals(ZPath.parseWithIds("/a/{a}/bee/{bee}/c/{c}").toString(), "/a/{a}/bee/{bee}/c/{c}");
+        assertEquals(ZPath.from("a", parameter(), "b", parameter()).toString(), "/a/{id}/b/{id}");
+        assertEquals(ZPath.from("a", parameter("foo"), "b", parameter("bar")).toString(), "/a/{foo}/b/{bar}");
     }
 
     @Test
     public void testPartialResolution()
     {
         ZPath path = ZPath.parseWithIds("/one/{1}/two/{2}");
-        Assert.assertFalse(path.parent().isResolved());
-        Assert.assertFalse(path.parent().parent().isResolved());
-        Assert.assertTrue(path.parent().parent().parent().isResolved());
-        Assert.assertFalse(path.isResolved());
+        assertFalse(path.parent().isResolved());
+        assertFalse(path.parent().parent().isResolved());
+        assertTrue(path.parent().parent().parent().isResolved());
+        assertFalse(path.isResolved());
 
         path = path.resolved("p1");
-        Assert.assertFalse(path.isResolved());
-        Assert.assertTrue(path.parent().isResolved());
-        Assert.assertEquals(path.toString(), "/one/p1/two/{2}");
+        assertFalse(path.isResolved());
+        assertTrue(path.parent().isResolved());
+        assertEquals(path.toString(), "/one/p1/two/{2}");
 
         path = path.resolved("p2");
-        Assert.assertTrue(path.isResolved());
-        Assert.assertEquals(path.toString(), "/one/p1/two/p2");
+        assertTrue(path.isResolved());
+        assertEquals(path.toString(), "/one/p1/two/p2");
     }
 }
diff --git a/curator-x-discovery-server/pom.xml b/curator-x-discovery-server/pom.xml
index bcf25dc..6ea4c06 100644
--- a/curator-x-discovery-server/pom.xml
+++ b/curator-x-discovery-server/pom.xml
@@ -62,8 +62,8 @@
         </dependency>
 
         <dependency>
-            <groupId>org.testng</groupId>
-            <artifactId>testng</artifactId>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
             <scope>test</scope>
         </dependency>
 
diff --git a/curator-x-discovery-server/src/test/java/org/apache/curator/x/discovery/server/jetty_jersey/TestMapsWithJersey.java b/curator-x-discovery-server/src/test/java/org/apache/curator/x/discovery/server/jetty_jersey/TestMapsWithJersey.java
index 5dc16c8..997cefe 100644
--- a/curator-x-discovery-server/src/test/java/org/apache/curator/x/discovery/server/jetty_jersey/TestMapsWithJersey.java
+++ b/curator-x-discovery-server/src/test/java/org/apache/curator/x/discovery/server/jetty_jersey/TestMapsWithJersey.java
@@ -18,6 +18,7 @@
  */
 package org.apache.curator.x.discovery.server.jetty_jersey;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
@@ -39,13 +40,12 @@
 import org.apache.curator.x.discovery.server.entity.ServiceNames;
 import org.apache.curator.x.discovery.server.mocks.MockServiceDiscovery;
 import org.apache.curator.x.discovery.strategies.RandomStrategy;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mortbay.jetty.Server;
 import org.mortbay.jetty.servlet.Context;
 import org.mortbay.jetty.servlet.ServletHolder;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
 import javax.ws.rs.core.Application;
 import javax.ws.rs.core.MediaType;
 import java.util.Map;
@@ -53,6 +53,7 @@
 
 public class TestMapsWithJersey
 {
+    private static final String HOST = "127.0.0.1";
     private Server server;
     private JsonServiceNamesMarshaller serviceNamesMarshaller;
     private JsonServiceInstanceMarshaller<Map<String, String>> serviceInstanceMarshaller;
@@ -60,7 +61,7 @@
     private MapDiscoveryContext context;
     private int port;
 
-    @BeforeMethod
+    @BeforeEach
     public void         setup() throws Exception
     {
         context = new MapDiscoveryContext(new MockServiceDiscovery<Map<String, String>>(), new RandomStrategy<Map<String, String>>(), 1000);
@@ -98,7 +99,7 @@
         server.start();
     }
     
-    @AfterMethod
+    @AfterEach
     public void         teardown() throws Exception
     {
         server.stop();
@@ -132,22 +133,22 @@
             }
         };
         Client          client = Client.create(config);
-        WebResource     resource = client.resource("http://localhost:" + port);
+        WebResource     resource = client.resource("http://" + HOST + ":" + port);
         resource.path("/v1/service/test/" + service.getId()).type(MediaType.APPLICATION_JSON_TYPE).put(service);
 
         ServiceNames names = resource.path("/v1/service").get(ServiceNames.class);
-        Assert.assertEquals(names.getNames(), Lists.newArrayList("test"));
+        assertEquals(names.getNames(), Lists.newArrayList("test"));
 
         GenericType<ServiceInstances<Map<String, String>>> type = new GenericType<ServiceInstances<Map<String, String>>>(){};
         ServiceInstances<Map<String, String>>    instances = resource.path("/v1/service/test").get(type);
-        Assert.assertEquals(instances.getServices().size(), 1);
-        Assert.assertEquals(instances.getServices().get(0), service);
-        Assert.assertEquals(instances.getServices().get(0).getPayload(), payload);
+        assertEquals(instances.getServices().size(), 1);
+        assertEquals(instances.getServices().get(0), service);
+        assertEquals(instances.getServices().get(0).getPayload(), payload);
 
         // Retrieve a single instance
         GenericType<ServiceInstance<Map<String, String>>> singleInstanceType = new GenericType<ServiceInstance<Map<String, String>>>(){};
         ServiceInstance<Map<String, String>>    instance = resource.path("/v1/service/test/" + service.getId()).get(singleInstanceType);
-        Assert.assertEquals(instance, service);
+        assertEquals(instance, service);
 
     }
 }
diff --git a/curator-x-discovery-server/src/test/java/org/apache/curator/x/discovery/server/jetty_jersey/TestObjectPayloadWithJersey.java b/curator-x-discovery-server/src/test/java/org/apache/curator/x/discovery/server/jetty_jersey/TestObjectPayloadWithJersey.java
index 80f2e4a..5ef1983 100644
--- a/curator-x-discovery-server/src/test/java/org/apache/curator/x/discovery/server/jetty_jersey/TestObjectPayloadWithJersey.java
+++ b/curator-x-discovery-server/src/test/java/org/apache/curator/x/discovery/server/jetty_jersey/TestObjectPayloadWithJersey.java
@@ -18,6 +18,7 @@
  */
 package org.apache.curator.x.discovery.server.jetty_jersey;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.sun.jersey.api.client.Client;
@@ -37,19 +38,19 @@
 import org.apache.curator.x.discovery.server.entity.ServiceNames;
 import org.apache.curator.x.discovery.server.mocks.MockServiceDiscovery;
 import org.apache.curator.x.discovery.strategies.RandomStrategy;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mortbay.jetty.Server;
 import org.mortbay.jetty.servlet.Context;
 import org.mortbay.jetty.servlet.ServletHolder;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
 import javax.ws.rs.core.Application;
 import javax.ws.rs.core.MediaType;
 import java.util.Set;
 
 public class TestObjectPayloadWithJersey
 {
+    private static final String HOST = "127.0.0.1";
     private Server server;
     private JsonServiceNamesMarshaller serviceNamesMarshaller;
     private JsonServiceInstanceMarshaller<ServiceDetails> serviceInstanceMarshaller;
@@ -57,7 +58,7 @@
     private ServiceDetailsDiscoveryContext context;
     private int port;
 
-    @BeforeMethod
+    @BeforeEach
     public void         setup() throws Exception
     {
         context = new ServiceDetailsDiscoveryContext(new MockServiceDiscovery<ServiceDetails>(), new RandomStrategy<ServiceDetails>(), 1000);
@@ -95,7 +96,7 @@
         server.start();
     }
     
-    @AfterMethod
+    @AfterEach
     public void         teardown() throws Exception
     {
         server.stop();
@@ -130,22 +131,22 @@
             }
         };
         Client          client = Client.create(config);
-        WebResource     resource = client.resource("http://localhost:" + port);
+        WebResource     resource = client.resource("http://" + HOST + ":" + port);
 	        resource.path("/v1/service/test/" + service.getId()).type(MediaType.APPLICATION_JSON_TYPE).put(service);
 
         ServiceNames names = resource.path("/v1/service").get(ServiceNames.class);
-        Assert.assertEquals(names.getNames(), Lists.newArrayList("test"));
+        assertEquals(names.getNames(), Lists.newArrayList("test"));
 
         GenericType<ServiceInstances<ServiceDetails>> type = new GenericType<ServiceInstances<ServiceDetails>>(){};
         ServiceInstances<ServiceDetails>    instances = resource.path("/v1/service/test").get(type);
-        Assert.assertEquals(instances.getServices().size(), 1);
-        Assert.assertEquals(instances.getServices().get(0), service);
-        Assert.assertEquals(instances.getServices().get(0).getPayload(), payload);
+        assertEquals(instances.getServices().size(), 1);
+        assertEquals(instances.getServices().get(0), service);
+        assertEquals(instances.getServices().get(0).getPayload(), payload);
 
         // Retrieve a single instance
         GenericType<ServiceInstance<ServiceDetails>> singleInstanceType = new GenericType<ServiceInstance<ServiceDetails>>(){};
         ServiceInstance<ServiceDetails>    instance = resource.path("/v1/service/test/" + service.getId()).get(singleInstanceType);
-        Assert.assertEquals(instance, service);
+        assertEquals(instance, service);
 
     }
 }
diff --git a/curator-x-discovery-server/src/test/java/org/apache/curator/x/discovery/server/jetty_jersey/TestStringsWithJersey.java b/curator-x-discovery-server/src/test/java/org/apache/curator/x/discovery/server/jetty_jersey/TestStringsWithJersey.java
index 8cf43cc..3efbc00 100644
--- a/curator-x-discovery-server/src/test/java/org/apache/curator/x/discovery/server/jetty_jersey/TestStringsWithJersey.java
+++ b/curator-x-discovery-server/src/test/java/org/apache/curator/x/discovery/server/jetty_jersey/TestStringsWithJersey.java
@@ -18,6 +18,7 @@
  */
 package org.apache.curator.x.discovery.server.jetty_jersey;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import com.sun.jersey.api.client.Client;
@@ -38,19 +39,19 @@
 import org.apache.curator.x.discovery.server.entity.ServiceNames;
 import org.apache.curator.x.discovery.server.mocks.MockServiceDiscovery;
 import org.apache.curator.x.discovery.strategies.RandomStrategy;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mortbay.jetty.Server;
 import org.mortbay.jetty.servlet.Context;
 import org.mortbay.jetty.servlet.ServletHolder;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
 import javax.ws.rs.core.Application;
 import javax.ws.rs.core.MediaType;
 import java.util.Set;
 
 public class TestStringsWithJersey
 {
+    private static final String HOST = "127.0.0.1";
     private Server server;
     private JsonServiceNamesMarshaller serviceNamesMarshaller;
     private JsonServiceInstanceMarshaller<String> serviceInstanceMarshaller;
@@ -58,7 +59,7 @@
     private StringDiscoveryContext context;
     private int port;
 
-    @BeforeMethod
+    @BeforeEach
     public void         setup() throws Exception
     {
         context = new StringDiscoveryContext(new MockServiceDiscovery<String>(), new RandomStrategy<String>(), 1000);
@@ -96,7 +97,7 @@
         server.start();
     }
     
-    @AfterMethod
+    @AfterEach
     public void         teardown() throws Exception
     {
         server.stop();
@@ -126,21 +127,21 @@
             }
         };
         Client          client = Client.create(config);
-        WebResource     resource = client.resource("http://localhost:" + port);
+        WebResource     resource = client.resource("http://" + HOST + ":" + port);
         resource.path("/v1/service/test/" + service.getId()).type(MediaType.APPLICATION_JSON_TYPE).put(service);
 
         ServiceNames names = resource.path("/v1/service").get(ServiceNames.class);
-        Assert.assertEquals(names.getNames(), Lists.newArrayList("test"));
+        assertEquals(names.getNames(), Lists.newArrayList("test"));
 
         GenericType<ServiceInstances<String>> type = new GenericType<ServiceInstances<String>>(){};
         ServiceInstances<String> instances = resource.path("/v1/service/test").get(type);
-        Assert.assertEquals(instances.getServices().size(), 1);
-        Assert.assertEquals(instances.getServices().get(0), service);
+        assertEquals(instances.getServices().size(), 1);
+        assertEquals(instances.getServices().get(0), service);
 
         // Retrieve a single instance
         GenericType<ServiceInstance<String>> singleInstanceType = new GenericType<ServiceInstance<String>>(){};
         ServiceInstance<String>    instance = resource.path("/v1/service/test/" + service.getId()).get(singleInstanceType);
-        Assert.assertEquals(instance, service);
+        assertEquals(instance, service);
     }
 
     @Test
@@ -160,8 +161,8 @@
             }
         };
         Client          client = Client.create(config);
-        WebResource     resource = client.resource("http://localhost:" + port);
+        WebResource     resource = client.resource("http://" + HOST + ":" + port);
         ServiceNames names = resource.path("/v1/service").get(ServiceNames.class);
-        Assert.assertEquals(names.getNames(), Lists.<String>newArrayList());
+        assertEquals(names.getNames(), Lists.<String>newArrayList());
     }
 }
diff --git a/curator-x-discovery-server/src/test/java/org/apache/curator/x/discovery/server/jetty_resteasy/TestStringsWithRestEasy.java b/curator-x-discovery-server/src/test/java/org/apache/curator/x/discovery/server/jetty_resteasy/TestStringsWithRestEasy.java
index 13f1e14..a6682db 100644
--- a/curator-x-discovery-server/src/test/java/org/apache/curator/x/discovery/server/jetty_resteasy/TestStringsWithRestEasy.java
+++ b/curator-x-discovery-server/src/test/java/org/apache/curator/x/discovery/server/jetty_resteasy/TestStringsWithRestEasy.java
@@ -18,6 +18,7 @@
  */
 package org.apache.curator.x.discovery.server.jetty_resteasy;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import com.google.common.collect.Lists;
 import com.google.common.io.ByteSource;
 import com.google.common.io.CharStreams;
@@ -29,13 +30,12 @@
 import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher;
 import org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap;
 import org.jboss.resteasy.spi.ResteasyProviderFactory;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mortbay.jetty.Server;
 import org.mortbay.jetty.servlet.Context;
 import org.mortbay.jetty.servlet.ServletHolder;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
 import javax.ws.rs.core.MediaType;
 import java.io.BufferedReader;
 import java.io.ByteArrayInputStream;
@@ -50,10 +50,11 @@
 @SuppressWarnings("unchecked")
 public class TestStringsWithRestEasy
 {
+    private static final String HOST = "127.0.0.1";
     private Server server;
     private int port;
 
-    @BeforeMethod
+    @BeforeEach
     public void         setup() throws Exception
     {
         RestEasyApplication.singletonsRef.set(new RestEasySingletons());
@@ -71,7 +72,7 @@
         server.start();
     }
 
-    @AfterMethod
+    @AfterEach
     public void         teardown() throws Exception
     {
         server.stop();
@@ -92,31 +93,31 @@
         ByteArrayOutputStream           out = new ByteArrayOutputStream();
         restEasySingletons.serviceInstanceMarshallerSingleton.writeTo(service, null, null, null, null, null, out);
 
-        getJson("http://localhost:" + port + "/v1/service/test/" + service.getId(), new String(out.toByteArray()));
+        getJson("http://" + HOST + ":" + port + "/v1/service/test/" + service.getId(), new String(out.toByteArray()));
 
-        String json = getJson("http://localhost:" + port + "/v1/service", null);
+        String json = getJson("http://" + HOST + ":" + port + "/v1/service", null);
         ServiceNames names = restEasySingletons.serviceNamesMarshallerSingleton.readFrom(ServiceNames.class, null, null, MediaType.APPLICATION_JSON_TYPE, null, new ByteArrayInputStream(json.getBytes()));
-        Assert.assertEquals(names.getNames(), Lists.newArrayList("test"));
+        assertEquals(names.getNames(), Lists.newArrayList("test"));
 
-        json = getJson("http://localhost:" + port + "/v1/service/test", null);
+        json = getJson("http://" + HOST + ":" + port + "/v1/service/test", null);
         ServiceInstances<String> instances = restEasySingletons.serviceInstancesMarshallerSingleton.readFrom(null, null, null, null, null, new ByteArrayInputStream(json.getBytes()));
-        Assert.assertEquals(instances.getServices().size(), 1);
-        Assert.assertEquals(instances.getServices().get(0), service);
+        assertEquals(instances.getServices().size(), 1);
+        assertEquals(instances.getServices().get(0), service);
 
         // Retrieve single instance
-        json = getJson("http://localhost:" + port + "/v1/service/test/" + service.getId(), null);
+        json = getJson("http://" + HOST + ":" + port + "/v1/service/test/" + service.getId(), null);
         ServiceInstance<String> instance = restEasySingletons.serviceInstanceMarshallerSingleton.readFrom(null, null, null, null, null, new ByteArrayInputStream(json.getBytes()));
-        Assert.assertEquals(instance, service);
+        assertEquals(instance, service);
 
     }
 
     @Test
     public void     testEmptyServiceNames() throws Exception
     {
-        String          json = getJson("http://localhost:" + port + "/v1/service", null);
+        String          json = getJson("http://" + HOST + ":" + port + "/v1/service", null);
         ServiceNames    names = RestEasyApplication.singletonsRef.get().serviceNamesMarshallerSingleton.readFrom(ServiceNames.class, null, null, MediaType.APPLICATION_JSON_TYPE, null, new ByteArrayInputStream(json.getBytes()));
 
-        Assert.assertEquals(names.getNames(), Lists.<String>newArrayList());
+        assertEquals(names.getNames(), Lists.<String>newArrayList());
     }
 
     private String getJson(String urlStr, String body) throws IOException
diff --git a/curator-x-discovery/pom.xml b/curator-x-discovery/pom.xml
index 0fad922..b4e369e 100644
--- a/curator-x-discovery/pom.xml
+++ b/curator-x-discovery/pom.xml
@@ -63,8 +63,8 @@
         </dependency>
 
         <dependency>
-            <groupId>org.testng</groupId>
-            <artifactId>testng</artifactId>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
             <scope>test</scope>
         </dependency>
 
diff --git a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/ServiceCacheLeakTester.java b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/ServiceCacheLeakTester.java
index 3d357f6..14a05fe 100644
--- a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/ServiceCacheLeakTester.java
+++ b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/ServiceCacheLeakTester.java
@@ -25,9 +25,9 @@
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.curator.x.discovery.strategies.RandomStrategy;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
 
-@Test(groups = CuratorTestBase.zk35TestCompatibilityGroup)
+@Tag(CuratorTestBase.zk35TestCompatibilityGroup)
 public class ServiceCacheLeakTester
 {
     public static void main(String[] args) throws Exception
diff --git a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestJsonInstanceSerializer.java b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestJsonInstanceSerializer.java
index 0ed6c3d..0d9515e 100644
--- a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestJsonInstanceSerializer.java
+++ b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestJsonInstanceSerializer.java
@@ -18,14 +18,15 @@
  */
 package org.apache.curator.x.discovery;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
 import org.apache.curator.x.discovery.details.JsonInstanceSerializer;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
 
 public class TestJsonInstanceSerializer
 {
@@ -37,15 +38,15 @@
         byte[]                          bytes = serializer.serialize(instance);
 
         ServiceInstance<String>         rhs = serializer.deserialize(bytes);
-        Assert.assertEquals(instance, rhs);
-        Assert.assertEquals(instance.getId(), rhs.getId());
-        Assert.assertEquals(instance.getName(), rhs.getName());
-        Assert.assertEquals(instance.getPayload(), rhs.getPayload());
-        Assert.assertEquals(instance.getAddress(), rhs.getAddress());
-        Assert.assertEquals(instance.getPort(), rhs.getPort());
-        Assert.assertEquals(instance.getSslPort(), rhs.getSslPort());
-        Assert.assertEquals(instance.getUriSpec(), rhs.getUriSpec());
-        Assert.assertEquals(instance.isEnabled(), rhs.isEnabled());
+        assertEquals(instance, rhs);
+        assertEquals(instance.getId(), rhs.getId());
+        assertEquals(instance.getName(), rhs.getName());
+        assertEquals(instance.getPayload(), rhs.getPayload());
+        assertEquals(instance.getAddress(), rhs.getAddress());
+        assertEquals(instance.getPort(), rhs.getPort());
+        assertEquals(instance.getSslPort(), rhs.getSslPort());
+        assertEquals(instance.getUriSpec(), rhs.getUriSpec());
+        assertEquals(instance.isEnabled(), rhs.isEnabled());
     }
 
     @Test
@@ -58,7 +59,7 @@
         try
         {
             doubleSerializer.deserialize(bytes);
-            Assert.fail();
+            fail();
         }
         catch ( ClassCastException e )
         {
@@ -74,15 +75,15 @@
         byte[]                          bytes = serializer.serialize(instance);
 
         ServiceInstance<Void>           rhs = serializer.deserialize(bytes);
-        Assert.assertEquals(instance, rhs);
-        Assert.assertEquals(instance.getId(), rhs.getId());
-        Assert.assertEquals(instance.getName(), rhs.getName());
-        Assert.assertEquals(instance.getPayload(), rhs.getPayload());
-        Assert.assertEquals(instance.getAddress(), rhs.getAddress());
-        Assert.assertEquals(instance.getPort(), rhs.getPort());
-        Assert.assertEquals(instance.getSslPort(), rhs.getSslPort());
-        Assert.assertEquals(instance.getUriSpec(), rhs.getUriSpec());
-        Assert.assertEquals(instance.isEnabled(), rhs.isEnabled());
+        assertEquals(instance, rhs);
+        assertEquals(instance.getId(), rhs.getId());
+        assertEquals(instance.getName(), rhs.getName());
+        assertEquals(instance.getPayload(), rhs.getPayload());
+        assertEquals(instance.getAddress(), rhs.getAddress());
+        assertEquals(instance.getPort(), rhs.getPort());
+        assertEquals(instance.getSslPort(), rhs.getSslPort());
+        assertEquals(instance.getUriSpec(), rhs.getUriSpec());
+        assertEquals(instance.isEnabled(), rhs.isEnabled());
     }
 
     @Test
@@ -92,7 +93,7 @@
         byte[]                          bytes = "{}".getBytes("utf-8");
 
         ServiceInstance<Void>           instance = serializer.deserialize(bytes);
-        Assert.assertTrue(instance.isEnabled(), "Instance that has no 'enabled' should be assumed enabled");
+        assertTrue(instance.isEnabled(), "Instance that has no 'enabled' should be assumed enabled");
     }
 
     @Test
@@ -106,15 +107,15 @@
         byte[]                            bytes = serializer.serialize(instance);
 
         ServiceInstance<Object>           rhs = serializer.deserialize(bytes);
-        Assert.assertEquals(instance, rhs);
-        Assert.assertEquals(instance.getId(), rhs.getId());
-        Assert.assertEquals(instance.getName(), rhs.getName());
-        Assert.assertEquals(instance.getPayload(), rhs.getPayload());
-        Assert.assertEquals(instance.getAddress(), rhs.getAddress());
-        Assert.assertEquals(instance.getPort(), rhs.getPort());
-        Assert.assertEquals(instance.getSslPort(), rhs.getSslPort());
-        Assert.assertEquals(instance.getUriSpec(), rhs.getUriSpec());
-        Assert.assertEquals(instance.isEnabled(), rhs.isEnabled());
+        assertEquals(instance, rhs);
+        assertEquals(instance.getId(), rhs.getId());
+        assertEquals(instance.getName(), rhs.getName());
+        assertEquals(instance.getPayload(), rhs.getPayload());
+        assertEquals(instance.getAddress(), rhs.getAddress());
+        assertEquals(instance.getPort(), rhs.getPort());
+        assertEquals(instance.getSslPort(), rhs.getSslPort());
+        assertEquals(instance.getUriSpec(), rhs.getUriSpec());
+        assertEquals(instance.isEnabled(), rhs.isEnabled());
     }
 
 
@@ -129,15 +130,15 @@
         byte[]                            bytes = serializer.serialize(instance);
 
         ServiceInstance<Object>           rhs = serializer.deserialize(bytes);
-        Assert.assertEquals(instance, rhs);
-        Assert.assertEquals(instance.getId(), rhs.getId());
-        Assert.assertEquals(instance.getName(), rhs.getName());
-        Assert.assertEquals(instance.getPayload(), rhs.getPayload());
-        Assert.assertEquals(instance.getAddress(), rhs.getAddress());
-        Assert.assertEquals(instance.getPort(), rhs.getPort());
-        Assert.assertEquals(instance.getSslPort(), rhs.getSslPort());
-        Assert.assertEquals(instance.getUriSpec(), rhs.getUriSpec());
-        Assert.assertEquals(instance.isEnabled(), rhs.isEnabled());
+        assertEquals(instance, rhs);
+        assertEquals(instance.getId(), rhs.getId());
+        assertEquals(instance.getName(), rhs.getName());
+        assertEquals(instance.getPayload(), rhs.getPayload());
+        assertEquals(instance.getAddress(), rhs.getAddress());
+        assertEquals(instance.getPort(), rhs.getPort());
+        assertEquals(instance.getSslPort(), rhs.getSslPort());
+        assertEquals(instance.getUriSpec(), rhs.getUriSpec());
+        assertEquals(instance.isEnabled(), rhs.isEnabled());
     }
 
     @Test
@@ -150,15 +151,15 @@
         byte[]                             bytes = serializer.serialize(instance);
 
         ServiceInstance<Payload>           rhs = serializer.deserialize(bytes);
-        Assert.assertEquals(instance, rhs);
-        Assert.assertEquals(instance.getId(), rhs.getId());
-        Assert.assertEquals(instance.getName(), rhs.getName());
-        Assert.assertEquals(instance.getPayload(), rhs.getPayload());
-        Assert.assertEquals(instance.getAddress(), rhs.getAddress());
-        Assert.assertEquals(instance.getPort(), rhs.getPort());
-        Assert.assertEquals(instance.getSslPort(), rhs.getSslPort());
-        Assert.assertEquals(instance.getUriSpec(), rhs.getUriSpec());
-        Assert.assertEquals(instance.isEnabled(), rhs.isEnabled());
+        assertEquals(instance, rhs);
+        assertEquals(instance.getId(), rhs.getId());
+        assertEquals(instance.getName(), rhs.getName());
+        assertEquals(instance.getPayload(), rhs.getPayload());
+        assertEquals(instance.getAddress(), rhs.getAddress());
+        assertEquals(instance.getPort(), rhs.getPort());
+        assertEquals(instance.getSslPort(), rhs.getSslPort());
+        assertEquals(instance.getUriSpec(), rhs.getUriSpec());
+        assertEquals(instance.isEnabled(), rhs.isEnabled());
     }
 
     public static class Payload {
diff --git a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestLocalIpFilter.java b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestLocalIpFilter.java
index 2e2efa0..9648c9b 100644
--- a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestLocalIpFilter.java
+++ b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestLocalIpFilter.java
@@ -18,9 +18,10 @@
  */
 package org.apache.curator.x.discovery;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Lists;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
 import java.net.InetAddress;
 import java.net.NetworkInterface;
 import java.net.SocketException;
@@ -47,7 +48,7 @@
                 );
 
             List<InetAddress> allLocalIPs = Lists.newArrayList(ServiceInstanceBuilder.getAllLocalIPs());
-            Assert.assertEquals(allLocalIPs.size(), 0);
+            assertEquals(allLocalIPs.size(), 0);
         }
         finally
         {
@@ -55,6 +56,6 @@
         }
 
         List<InetAddress> allLocalIPs = Lists.newArrayList(ServiceInstanceBuilder.getAllLocalIPs());
-        Assert.assertTrue(allLocalIPs.size() > 0);
+        assertTrue(allLocalIPs.size() > 0);
     }
 }
diff --git a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestServiceCache.java b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestServiceCache.java
index 6d24586..b1a3526 100644
--- a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestServiceCache.java
+++ b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestServiceCache.java
@@ -19,6 +19,9 @@
 
 package org.apache.curator.x.discovery;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Lists;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -31,8 +34,9 @@
 import org.apache.curator.utils.CloseableUtils;
 import org.apache.curator.utils.Compatibility;
 import org.apache.curator.x.discovery.details.ServiceCacheListener;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.io.Closeable;
 import java.util.Collection;
 import java.util.Collections;
@@ -42,7 +46,7 @@
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 
-@Test(groups = CuratorTestBase.zk35TestCompatibilityGroup)
+@Tag(CuratorTestBase.zk35TestCompatibilityGroup)
 public class TestServiceCache extends BaseClassForTests
 {
     @Test
@@ -86,13 +90,13 @@
             discovery.registerService(instance2);
             discovery.registerService(instance3);
 
-            Assert.assertTrue(latch.await(10, TimeUnit.SECONDS));
+            assertTrue(latch.await(10, TimeUnit.SECONDS));
 
             ServiceCache<String> cache2 = discovery.serviceCacheBuilder().name("test").build();
             closeables.add(cache2);
             cache2.start();
 
-            Assert.assertEquals(cache2.getInstances().size(), 3);
+            assertEquals(cache2.getInstances().size(), 3);
         }
         finally
         {
@@ -131,17 +135,17 @@
             ServiceInstance<String> foundInstance = null;
             while ( foundInstance == null )
             {
-                Assert.assertTrue(count++ < 5);
+                assertTrue(count++ < 5);
                 foundInstance = serviceProvider.getInstance();
                 timing.sleepABit();
             }
-            Assert.assertEquals(foundInstance, instance);
+            assertEquals(foundInstance, instance);
 
             ServiceInstance<String> instance2 = ServiceInstance.<String>builder().address("foo").payload("thing").name("test").port(10064).build();
             discovery.registerService(instance2);
             timing.sleepABit();
             Collection<ServiceInstance<String>> allInstances = serviceProvider.getAllInstances();
-            Assert.assertEquals(allInstances.size(), 2);
+            assertEquals(allInstances.size(), 2);
         }
         finally
         {
@@ -190,10 +194,10 @@
             instance = ServiceInstance.<String>builder().payload("changed").name("test").port(10064).id(instance.getId()).build();
             discovery.updateService(instance);
 
-            Assert.assertTrue(latch.await(10, TimeUnit.SECONDS));
+            assertTrue(latch.await(10, TimeUnit.SECONDS));
 
-            Assert.assertEquals(cache.getInstances().size(), 1);
-            Assert.assertEquals(cache.getInstances().get(0).getPayload(), instance.getPayload());
+            assertEquals(cache.getInstances().size(), 1);
+            assertEquals(cache.getInstances().get(0).getPayload(), instance.getPayload());
         }
         finally
         {
@@ -242,14 +246,14 @@
             ServiceInstance<String> instance1 = ServiceInstance.<String>builder().payload("thing").name("test").port(10064).build();
             ServiceInstance<String> instance2 = ServiceInstance.<String>builder().payload("thing").name("test").port(10065).build();
             discovery.registerService(instance1);
-            Assert.assertTrue(semaphore.tryAcquire(10, TimeUnit.SECONDS));
+            assertTrue(semaphore.tryAcquire(10, TimeUnit.SECONDS));
 
             discovery.registerService(instance2);
-            Assert.assertTrue(semaphore.tryAcquire(3, TimeUnit.SECONDS));
+            assertTrue(semaphore.tryAcquire(3, TimeUnit.SECONDS));
 
             ServiceInstance<String> instance3 = ServiceInstance.<String>builder().payload("thing").name("another").port(10064).build();
             discovery.registerService(instance3);
-            Assert.assertFalse(semaphore.tryAcquire(3, TimeUnit.SECONDS));  // should not get called for a different service
+            assertFalse(semaphore.tryAcquire(3, TimeUnit.SECONDS));  // should not get called for a different service
         }
         finally
         {
@@ -281,7 +285,7 @@
             discovery.start();
 
             ExecuteCalledWatchingExecutorService exec = new ExecuteCalledWatchingExecutorService(Executors.newSingleThreadExecutor());
-            Assert.assertFalse(exec.isExecuteCalled());
+            assertFalse(exec.isExecuteCalled());
 
             ServiceCache<String> cache = discovery.serviceCacheBuilder().name("test").executorService(exec).build();
             closeables.add(cache);
@@ -305,9 +309,9 @@
 
             ServiceInstance<String> instance1 = ServiceInstance.<String>builder().payload("thing").name("test").port(10064).build();
             discovery.registerService(instance1);
-            Assert.assertTrue(semaphore.tryAcquire(10, TimeUnit.SECONDS));
+            assertTrue(semaphore.tryAcquire(10, TimeUnit.SECONDS));
 
-            Assert.assertTrue(exec.isExecuteCalled());
+            assertTrue(exec.isExecuteCalled());
         }
         finally
         {
diff --git a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestStrategies.java b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestStrategies.java
index 04bd052..1e85724 100644
--- a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestStrategies.java
+++ b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestStrategies.java
@@ -18,14 +18,16 @@
  */
 package org.apache.curator.x.discovery;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Lists;
 import org.apache.curator.x.discovery.details.InstanceProvider;
 import org.apache.curator.x.discovery.strategies.RandomStrategy;
 import org.apache.curator.x.discovery.strategies.RoundRobinStrategy;
 import org.apache.curator.x.discovery.strategies.StickyStrategy;
 import org.apache.commons.math.stat.descriptive.SummaryStatistics;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
 import java.util.List;
 
 public class TestStrategies
@@ -78,7 +80,7 @@
         {
             statistic.addValue(counts[i]);
         }
-        Assert.assertTrue(statistic.getStandardDeviation() <= (QTY * 2), "" + statistic.getStandardDeviation()); // meager check for even distribution
+        assertTrue(statistic.getStandardDeviation() <= (QTY * 2), "" + statistic.getStandardDeviation()); // meager check for even distribution
     }
 
     @Test
@@ -92,13 +94,13 @@
         for ( int i = 0; i < QTY; ++i )
         {
             ServiceInstance<Void> instance = strategy.getInstance(instanceProvider);
-            Assert.assertEquals(instance.getId(), Integer.toString(i));
+            assertEquals(instance.getId(), Integer.toString(i));
         }
 
         for ( int i = 0; i < (1234 * QTY); ++i )
         {
             ServiceInstance<Void> instance = strategy.getInstance(instanceProvider);
-            Assert.assertEquals(instance.getId(), Integer.toString(i % QTY));
+            assertEquals(instance.getId(), Integer.toString(i % QTY));
         }
     }
 
@@ -114,18 +116,18 @@
         int                             instanceNumber = strategy.getInstanceNumber();
         for ( int i = 0; i < 1000; ++i )
         {
-            Assert.assertEquals(strategy.getInstance(instanceProvider), theInstance);
+            assertEquals(strategy.getInstance(instanceProvider), theInstance);
         }
 
         // assert what happens when an instance goes down
         instanceProvider = new TestInstanceProvider(QTY, QTY);
-        Assert.assertFalse(strategy.getInstance(instanceProvider).equals(theInstance));
-        Assert.assertFalse(instanceNumber == strategy.getInstanceNumber());
+        assertFalse(strategy.getInstance(instanceProvider).equals(theInstance));
+        assertFalse(instanceNumber == strategy.getInstanceNumber());
 
         theInstance = strategy.getInstance(instanceProvider);
         for ( int i = 0; i < 1000; ++i )
         {
-            Assert.assertEquals(strategy.getInstance(instanceProvider), theInstance);
+            assertEquals(strategy.getInstance(instanceProvider), theInstance);
         }
     }
 }
diff --git a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestUriSpec.java b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestUriSpec.java
index 974e81c..3613df3 100644
--- a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestUriSpec.java
+++ b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/TestUriSpec.java
@@ -18,9 +18,9 @@
  */
 package org.apache.curator.x.discovery;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import com.google.common.collect.Maps;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
 import java.util.Iterator;
 import java.util.Map;
 
@@ -36,11 +36,11 @@
         builder.name("foo");
         builder.port(5);
         ServiceInstance<Void>               instance = builder.build();
-        Assert.assertEquals(spec.build(instance), "http://foo.com");
+        assertEquals(spec.build(instance), "http://foo.com");
 
         builder.sslPort(5);
         instance = builder.build();
-        Assert.assertEquals(spec.build(instance), "https://foo.com");
+        assertEquals(spec.build(instance), "https://foo.com");
     }
 
     @Test
@@ -60,7 +60,7 @@
 
         Map<String, Object>     m = Maps.newHashMap();
         m.put("scheme", "test");
-        Assert.assertEquals(spec.build(instance, m), "test://1.2.3.4:5:6/foo/bar/789/permanent");
+        assertEquals(spec.build(instance, m), "test://1.2.3.4:5:6/foo/bar/789/permanent");
     }
 
     @Test
@@ -79,7 +79,7 @@
         Map<String, Object>     m = Maps.newHashMap();
         m.put("one", 1);
         m.put("six", 6);
-        Assert.assertEquals(spec.build(m), "1two-three-{four}-five6");
+        assertEquals(spec.build(m), "1two-three-{four}-five6");
     }
 
     @Test
@@ -97,7 +97,7 @@
 
     private void    checkPart(UriSpec.Part p, String value, boolean isVariable)
     {
-        Assert.assertEquals(p.getValue(), value);
-        Assert.assertEquals(p.isVariable(), isVariable);
+        assertEquals(p.getValue(), value);
+        assertEquals(p.isVariable(), isVariable);
     }
 }
diff --git a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestDownInstanceManager.java b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestDownInstanceManager.java
index 0b60655..73b2038 100644
--- a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestDownInstanceManager.java
+++ b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestDownInstanceManager.java
@@ -18,10 +18,11 @@
  */
 package org.apache.curator.x.discovery.details;
 
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import org.apache.curator.x.discovery.DownInstancePolicy;
 import org.apache.curator.x.discovery.ServiceInstance;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
 import java.util.concurrent.TimeUnit;
 
 public class TestDownInstanceManager
@@ -36,12 +37,12 @@
         ServiceInstance<Void> instance2 = ServiceInstance.<Void>builder().name("hey").id("2").build();
 
         DownInstanceManager<Void> downInstanceManager = new DownInstanceManager<Void>(debugDownInstancePolicy);
-        Assert.assertTrue(downInstanceManager.apply(instance1));
-        Assert.assertTrue(downInstanceManager.apply(instance2));
+        assertTrue(downInstanceManager.apply(instance1));
+        assertTrue(downInstanceManager.apply(instance2));
 
         downInstanceManager.add(instance1);
-        Assert.assertFalse(downInstanceManager.apply(instance1));
-        Assert.assertTrue(downInstanceManager.apply(instance2));
+        assertFalse(downInstanceManager.apply(instance1));
+        assertTrue(downInstanceManager.apply(instance2));
     }
 
     @Test
@@ -51,16 +52,16 @@
         ServiceInstance<Void> instance2 = ServiceInstance.<Void>builder().name("hey").id("2").build();
 
         DownInstanceManager<Void> downInstanceManager = new DownInstanceManager<Void>(debugMultiDownInstancePolicy);
-        Assert.assertTrue(downInstanceManager.apply(instance1));
-        Assert.assertTrue(downInstanceManager.apply(instance2));
+        assertTrue(downInstanceManager.apply(instance1));
+        assertTrue(downInstanceManager.apply(instance2));
 
         downInstanceManager.add(instance1);
-        Assert.assertTrue(downInstanceManager.apply(instance1));
-        Assert.assertTrue(downInstanceManager.apply(instance2));
+        assertTrue(downInstanceManager.apply(instance1));
+        assertTrue(downInstanceManager.apply(instance2));
 
         downInstanceManager.add(instance1);
-        Assert.assertFalse(downInstanceManager.apply(instance1));
-        Assert.assertTrue(downInstanceManager.apply(instance2));
+        assertFalse(downInstanceManager.apply(instance1));
+        assertTrue(downInstanceManager.apply(instance2));
     }
 
     @Test
@@ -72,12 +73,12 @@
         DownInstanceManager<Void> downInstanceManager = new DownInstanceManager<Void>(debugDownInstancePolicy);
 
         downInstanceManager.add(instance1);
-        Assert.assertFalse(downInstanceManager.apply(instance1));
-        Assert.assertTrue(downInstanceManager.apply(instance2));
+        assertFalse(downInstanceManager.apply(instance1));
+        assertTrue(downInstanceManager.apply(instance2));
 
         Thread.sleep(debugDownInstancePolicy.getTimeoutMs());
 
-        Assert.assertTrue(downInstanceManager.apply(instance1));
-        Assert.assertTrue(downInstanceManager.apply(instance2));
+        assertTrue(downInstanceManager.apply(instance1));
+        assertTrue(downInstanceManager.apply(instance2));
     }
 }
diff --git a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestJsonInstanceSerializerCompatibility.java b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestJsonInstanceSerializerCompatibility.java
index 100e41d..1ceb9db 100644
--- a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestJsonInstanceSerializerCompatibility.java
+++ b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestJsonInstanceSerializerCompatibility.java
@@ -19,14 +19,16 @@
 
 package org.apache.curator.x.discovery.details;
 
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.curator.x.discovery.ServiceInstance;
 import org.apache.curator.x.discovery.ServiceType;
 import org.apache.curator.x.discovery.TestJsonInstanceSerializer;
 import org.apache.curator.x.discovery.UriSpec;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
 import java.net.URI;
 import java.util.Date;
 
@@ -42,7 +44,7 @@
         OldServiceInstance<TestJsonInstanceSerializer.Payload> oldInstance = new OldServiceInstance<TestJsonInstanceSerializer.Payload>("name", "id", "address", 10, 20, new TestJsonInstanceSerializer.Payload("test"), 0, ServiceType.DYNAMIC, new UriSpec("{a}/b/{c}"));
         ObjectMapper mapper = new ObjectMapper();
         byte[] oldBytes = mapper.writeValueAsBytes(oldInstance);
-        Assert.assertEquals(bytes, oldBytes, String.format("%s vs %s", new String(bytes), new String(oldBytes)));
+        assertArrayEquals(bytes, oldBytes, String.format("%s vs %s", new String(bytes), new String(oldBytes)));
     }
 
     @Test
@@ -53,7 +55,7 @@
         byte[] bytes = serializer.serialize(instance);
 
         instance = serializer.deserialize(bytes);
-        Assert.assertTrue(instance.isEnabled());    // passed false for enabled in the ctor but that is lost with compatibleSerializationMode
+        assertTrue(instance.isEnabled());    // passed false for enabled in the ctor but that is lost with compatibleSerializationMode
 
         ObjectMapper mapper = new ObjectMapper();
         JavaType type = mapper.getTypeFactory().constructType(OldServiceInstance.class);
@@ -61,15 +63,15 @@
         TestJsonInstanceSerializer.Payload.class.cast(rawServiceInstance.getPayload()); // just to verify that it's the correct type
         //noinspection unchecked
         OldServiceInstance<TestJsonInstanceSerializer.Payload> check = (OldServiceInstance<TestJsonInstanceSerializer.Payload>)rawServiceInstance;
-        Assert.assertEquals(check.getName(), instance.getName());
-        Assert.assertEquals(check.getId(), instance.getId());
-        Assert.assertEquals(check.getAddress(), instance.getAddress());
-        Assert.assertEquals(check.getPort(), instance.getPort());
-        Assert.assertEquals(check.getSslPort(), instance.getSslPort());
-        Assert.assertEquals(check.getPayload(), instance.getPayload());
-        Assert.assertEquals(check.getRegistrationTimeUTC(), instance.getRegistrationTimeUTC());
-        Assert.assertEquals(check.getServiceType(), instance.getServiceType());
-        Assert.assertEquals(check.getUriSpec(), instance.getUriSpec());
+        assertEquals(check.getName(), instance.getName());
+        assertEquals(check.getId(), instance.getId());
+        assertEquals(check.getAddress(), instance.getAddress());
+        assertEquals(check.getPort(), instance.getPort());
+        assertEquals(check.getSslPort(), instance.getSslPort());
+        assertEquals(check.getPayload(), instance.getPayload());
+        assertEquals(check.getRegistrationTimeUTC(), instance.getRegistrationTimeUTC());
+        assertEquals(check.getServiceType(), instance.getServiceType());
+        assertEquals(check.getUriSpec(), instance.getUriSpec());
     }
 
     @Test
@@ -81,16 +83,16 @@
 
         JsonInstanceSerializer<TestJsonInstanceSerializer.Payload> serializer = new JsonInstanceSerializer<TestJsonInstanceSerializer.Payload>(TestJsonInstanceSerializer.Payload.class);
         ServiceInstance<TestJsonInstanceSerializer.Payload> instance = serializer.deserialize(oldJson);
-        Assert.assertEquals(oldInstance.getName(), instance.getName());
-        Assert.assertEquals(oldInstance.getId(), instance.getId());
-        Assert.assertEquals(oldInstance.getAddress(), instance.getAddress());
-        Assert.assertEquals(oldInstance.getPort(), instance.getPort());
-        Assert.assertEquals(oldInstance.getSslPort(), instance.getSslPort());
-        Assert.assertEquals(oldInstance.getPayload(), instance.getPayload());
-        Assert.assertEquals(oldInstance.getRegistrationTimeUTC(), instance.getRegistrationTimeUTC());
-        Assert.assertEquals(oldInstance.getServiceType(), instance.getServiceType());
-        Assert.assertEquals(oldInstance.getUriSpec(), instance.getUriSpec());
-        Assert.assertTrue(instance.isEnabled());
+        assertEquals(oldInstance.getName(), instance.getName());
+        assertEquals(oldInstance.getId(), instance.getId());
+        assertEquals(oldInstance.getAddress(), instance.getAddress());
+        assertEquals(oldInstance.getPort(), instance.getPort());
+        assertEquals(oldInstance.getSslPort(), instance.getSslPort());
+        assertEquals(oldInstance.getPayload(), instance.getPayload());
+        assertEquals(oldInstance.getRegistrationTimeUTC(), instance.getRegistrationTimeUTC());
+        assertEquals(oldInstance.getServiceType(), instance.getServiceType());
+        assertEquals(oldInstance.getUriSpec(), instance.getUriSpec());
+        assertTrue(instance.isEnabled());
     }
 
     @Test
@@ -100,8 +102,8 @@
         byte[] newInstanceBytes = new ObjectMapper().writeValueAsBytes(newInstance);
         JsonInstanceSerializer<String> serializer = new JsonInstanceSerializer<String>(String.class);
         ServiceInstance<String> instance = serializer.deserialize(newInstanceBytes);
-        Assert.assertEquals(instance.getName(), "name");
-        Assert.assertEquals(instance.getPayload(), "hey");
-        Assert.assertEquals(instance.isEnabled(), false);
+        assertEquals(instance.getName(), "name");
+        assertEquals(instance.getPayload(), "hey");
+        assertEquals(instance.isEnabled(), false);
     }
 }
diff --git a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceCacheRace.java b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceCacheRace.java
index 9604c19..b6fdbc0 100644
--- a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceCacheRace.java
+++ b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceCacheRace.java
@@ -18,6 +18,7 @@
  */
 package org.apache.curator.x.discovery.details;
 
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Lists;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -32,16 +33,16 @@
 import org.apache.curator.x.discovery.ServiceDiscovery;
 import org.apache.curator.x.discovery.ServiceDiscoveryBuilder;
 import org.apache.curator.x.discovery.ServiceInstance;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.Test;
 import java.io.Closeable;
 import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executors;
 
-@Test(groups = CuratorTestBase.zk35TestCompatibilityGroup)
+@Tag(CuratorTestBase.zk35TestCompatibilityGroup)
 public class TestServiceCacheRace extends BaseClassForTests
 {
     private final Timing timing = new Timing();
@@ -92,7 +93,7 @@
                 }
             };
             closeableExecutorService.submit(proc);
-            Assert.assertTrue(timing.awaitLatch(cacheStartLatch));  // wait until ServiceCacheImpl's internal PathChildrenCache is started and primed
+            assertTrue(timing.awaitLatch(cacheStartLatch));  // wait until ServiceCacheImpl's internal PathChildrenCache is started and primed
 
             final CountDownLatch cacheChangedLatch = new CountDownLatch(1);
             ServiceCacheListener listener = new ServiceCacheListener()
@@ -112,11 +113,11 @@
             cache.addListener(listener);
             ServiceInstance<String> instance2 = ServiceInstance.<String>builder().payload("test").name("test").port(10065).build();
             discovery.registerService(instance2);   // cause ServiceCacheImpl's internal PathChildrenCache listener to get called which will clear the dataBytes
-            Assert.assertTrue(timing.awaitLatch(cacheChangedLatch));
+            assertTrue(timing.awaitLatch(cacheChangedLatch));
 
             cacheWaitLatch.countDown();
 
-            Assert.assertTrue(timing.awaitLatch(startCompletedLatch));
+            assertTrue(timing.awaitLatch(startCompletedLatch));
         }
         finally
         {
diff --git a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceDiscovery.java b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceDiscovery.java
index 7a23e16..f56acaa 100644
--- a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceDiscovery.java
+++ b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceDiscovery.java
@@ -19,6 +19,9 @@
 
 package org.apache.curator.x.discovery.details;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 import org.apache.curator.framework.CuratorFramework;
@@ -31,15 +34,16 @@
 import org.apache.curator.x.discovery.ServiceDiscovery;
 import org.apache.curator.x.discovery.ServiceDiscoveryBuilder;
 import org.apache.curator.x.discovery.ServiceInstance;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Semaphore;
 
-@Test(groups = CuratorTestBase.zk35TestCompatibilityGroup)
+@Tag(CuratorTestBase.zk35TestCompatibilityGroup)
 public class TestServiceDiscovery extends BaseClassForTests
 {
     private static final Comparator<ServiceInstance<Void>> comparator = new Comparator<ServiceInstance<Void>>()
@@ -78,7 +82,7 @@
             discovery.registerService(instance2);
 
             timing.acquireSemaphore(semaphore, 2);
-            Assert.assertEquals(discovery.queryForInstances("test").size(), 2);
+            assertEquals(discovery.queryForInstances("test").size(), 2);
 
             client.getZookeeperClient().getZooKeeper().getTestable().injectSessionExpiration();
             server.stop();
@@ -86,7 +90,7 @@
             server.restart();
 
             timing.acquireSemaphore(semaphore, 2);
-            Assert.assertEquals(discovery.queryForInstances("test").size(), 2);
+            assertEquals(discovery.queryForInstances("test").size(), 2);
         }
         finally
         {
@@ -120,7 +124,7 @@
             discovery.start();
 
             timing.acquireSemaphore(semaphore);
-            Assert.assertEquals(discovery.queryForInstances("test").size(), 1);
+            assertEquals(discovery.queryForInstances("test").size(), 1);
 
             client.getZookeeperClient().getZooKeeper().getTestable().injectSessionExpiration();
             server.stop();
@@ -128,7 +132,7 @@
             server.restart();
 
             timing.acquireSemaphore(semaphore);
-            Assert.assertEquals(discovery.queryForInstances("test").size(), 1);
+            assertEquals(discovery.queryForInstances("test").size(), 1);
         }
         finally
         {
@@ -153,12 +157,12 @@
             discovery = new ServiceDiscoveryImpl<String>(client, "/test", new JsonInstanceSerializer<String>(String.class), instance, false);
             discovery.start();
 
-            Assert.assertEquals(discovery.queryForInstances("test").size(), 1);
+            assertEquals(discovery.queryForInstances("test").size(), 1);
 
             client.getZookeeperClient().getZooKeeper().getTestable().injectSessionExpiration();
             Thread.sleep(timing.multiple(1.5).session());
 
-            Assert.assertEquals(discovery.queryForInstances("test").size(), 1);
+            assertEquals(discovery.queryForInstances("test").size(), 1);
         }
         finally
         {
@@ -193,7 +197,7 @@
             discovery.registerService(s2_i1);
             discovery.registerService(s2_i2);
 
-            Assert.assertEquals(Sets.newHashSet(discovery.queryForNames()), Sets.newHashSet(SERVICE_ONE, SERVICE_TWO));
+            assertEquals(Sets.newHashSet(discovery.queryForNames()), Sets.newHashSet(SERVICE_ONE, SERVICE_TWO));
 
             List<ServiceInstance<Void>> list = Lists.newArrayList();
             list.add(s1_i1);
@@ -201,7 +205,7 @@
             Collections.sort(list, comparator);
             List<ServiceInstance<Void>> queriedInstances = Lists.newArrayList(discovery.queryForInstances(SERVICE_ONE));
             Collections.sort(queriedInstances, comparator);
-            Assert.assertEquals(queriedInstances, list, String.format("Not equal l: %s - d: %s", list, queriedInstances));
+            assertEquals(queriedInstances, list, String.format("Not equal l: %s - d: %s", list, queriedInstances));
 
             list.clear();
 
@@ -210,7 +214,7 @@
             Collections.sort(list, comparator);
             queriedInstances = Lists.newArrayList(discovery.queryForInstances(SERVICE_TWO));
             Collections.sort(queriedInstances, comparator);
-            Assert.assertEquals(queriedInstances, list, String.format("Not equal 2: %s - d: %s", list, queriedInstances));
+            assertEquals(queriedInstances, list, String.format("Not equal 2: %s - d: %s", list, queriedInstances));
         }
         finally
         {
@@ -233,11 +237,11 @@
             discovery = ServiceDiscoveryBuilder.builder(String.class).basePath("/test").client(client).thisInstance(instance).build();
             discovery.start();
 
-            Assert.assertEquals(discovery.queryForNames(), Collections.singletonList("test"));
+            assertEquals(discovery.queryForNames(), Collections.singletonList("test"));
 
             List<ServiceInstance<String>> list = Lists.newArrayList();
             list.add(instance);
-            Assert.assertEquals(discovery.queryForInstances("test"), list);
+            assertEquals(discovery.queryForInstances("test"), list);
         }
         finally
         {
@@ -265,11 +269,11 @@
 
             server.restart();
             timing.sleepABit();
-            Assert.assertEquals(discovery.queryForNames(), Collections.singletonList("test"));
+            assertEquals(discovery.queryForNames(), Collections.singletonList("test"));
 
             List<ServiceInstance<String>> list = Lists.newArrayList();
             list.add(instance);
-            Assert.assertEquals(discovery.queryForInstances("test"), list);
+            assertEquals(discovery.queryForInstances("test"), list);
         }
         finally
         {
@@ -320,7 +324,7 @@
             discovery = ServiceDiscoveryBuilder.builder(String.class).basePath("/test").client(client).thisInstance(instance).serializer(slowSerializer).watchInstances(true).build();
             discovery.start();
 
-            Assert.assertFalse(discovery.queryForInstances(name).isEmpty(), "Service should start registered.");
+            assertFalse(discovery.queryForInstances(name).isEmpty(), "Service should start registered.");
 
             server.stop();
             server.restart();
@@ -330,7 +334,7 @@
 
             new Timing().sleepABit(); // Wait for the rest of registration to finish.
 
-            Assert.assertTrue(discovery.queryForInstances(name).isEmpty(), "Service should have unregistered.");
+            assertTrue(discovery.queryForInstances(name).isEmpty(), "Service should have unregistered.");
         }
         finally
         {
@@ -354,7 +358,7 @@
             discovery.start();
             discovery.unregisterService(instance);
 
-            Assert.assertEquals(((ServiceDiscoveryImpl)discovery).debugServicesQty(), 0);
+            assertEquals(((ServiceDiscoveryImpl)discovery).debugServicesQty(), 0);
         }
         finally
         {
diff --git a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceDiscoveryBuilder.java b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceDiscoveryBuilder.java
index fd0c438..d88b3c4 100644
--- a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceDiscoveryBuilder.java
+++ b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceDiscoveryBuilder.java
@@ -18,6 +18,10 @@
  */
 package org.apache.curator.x.discovery.details;
 
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
 import org.apache.curator.retry.RetryOneTime;
@@ -25,10 +29,10 @@
 import org.apache.curator.test.compatibility.CuratorTestBase;
 import org.apache.curator.x.discovery.ServiceDiscoveryBuilder;
 import org.apache.curator.x.discovery.ServiceInstance;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Test(groups = CuratorTestBase.zk35TestCompatibilityGroup)
+@Tag(CuratorTestBase.zk35TestCompatibilityGroup)
 public class TestServiceDiscoveryBuilder extends BaseClassForTests
 {
     @Test
@@ -38,8 +42,8 @@
         ServiceDiscoveryBuilder<Object> builder = ServiceDiscoveryBuilder.builder(Object.class).client(client);
         ServiceDiscoveryImpl<?> discovery = (ServiceDiscoveryImpl<?>) builder.basePath("/path").build();
 
-        Assert.assertNotNull(discovery.getSerializer(), "default serializer not set");
-        Assert.assertTrue(discovery.getSerializer() instanceof JsonInstanceSerializer, "default serializer not JSON");
+        assertNotNull(discovery.getSerializer(), "default serializer not set");
+        assertTrue(discovery.getSerializer() instanceof JsonInstanceSerializer, "default serializer not JSON");
     }
 
     @Test
@@ -63,7 +67,7 @@
         });
 
         ServiceDiscoveryImpl<?> discovery = (ServiceDiscoveryImpl<?>) builder.basePath("/path").build();
-        Assert.assertNotNull(discovery.getSerializer(), "default serializer not set");
-        Assert.assertFalse(discovery.getSerializer() instanceof JsonInstanceSerializer, "set serializer is JSON");
+        assertNotNull(discovery.getSerializer(), "default serializer not set");
+        assertFalse(discovery.getSerializer() instanceof JsonInstanceSerializer, "set serializer is JSON");
     }
 }
diff --git a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceProvider.java b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceProvider.java
index b743e07..033e8fa 100644
--- a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceProvider.java
+++ b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestServiceProvider.java
@@ -18,6 +18,8 @@
  */
 package org.apache.curator.x.discovery.details;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import java.io.Closeable;
 import java.util.Collections;
 import java.util.List;
@@ -32,12 +34,11 @@
 import org.apache.curator.x.discovery.ServiceDiscoveryBuilder;
 import org.apache.curator.x.discovery.ServiceInstance;
 import org.apache.curator.x.discovery.ServiceProvider;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
 import com.google.common.collect.Lists;
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
 
-@Test(groups = CuratorTestBase.zk35TestCompatibilityGroup)
+@Tag(CuratorTestBase.zk35TestCompatibilityGroup)
 public class TestServiceProvider extends BaseClassForTests
 {
 
@@ -60,11 +61,11 @@
             closeables.add(provider);
             provider.start();
 
-            Assert.assertEquals(provider.getInstance(), instance);
+            assertEquals(provider.getInstance(), instance);
 
             List<ServiceInstance<String>> list = Lists.newArrayList();
             list.add(instance);
-            Assert.assertEquals(provider.getAllInstances(), list);
+            assertEquals(provider.getAllInstances(), list);
         }
         finally
         {
@@ -96,8 +97,8 @@
             closeables.add(provider);
             provider.start();
 
-            Assert.assertEquals(provider.getInstance(), null);
-            Assert.assertTrue(provider.getAllInstances().isEmpty(), "Disabled instance still appears available via service provider");
+            assertEquals(provider.getInstance(), null);
+            assertTrue(provider.getAllInstances().isEmpty(), "Disabled instance still appears available via service provider");
         }
         finally
         {
diff --git a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestWatchedInstances.java b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestWatchedInstances.java
index 2d03c47..6c4d29f 100644
--- a/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestWatchedInstances.java
+++ b/curator-x-discovery/src/test/java/org/apache/curator/x/discovery/details/TestWatchedInstances.java
@@ -18,6 +18,8 @@
  */
 package org.apache.curator.x.discovery.details;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 import com.google.common.collect.Lists;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.CuratorFrameworkFactory;
@@ -28,8 +30,8 @@
 import org.apache.curator.x.discovery.ServiceDiscovery;
 import org.apache.curator.x.discovery.ServiceDiscoveryBuilder;
 import org.apache.curator.x.discovery.ServiceInstance;
-import org.testng.Assert;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
 import java.io.Closeable;
 import java.util.Arrays;
 import java.util.Collections;
@@ -59,11 +61,11 @@
             closeables.add(discovery);
             discovery.start();
 
-            Assert.assertEquals(discovery.queryForNames(), Arrays.asList("test"));
+            assertEquals(discovery.queryForNames(), Arrays.asList("test"));
 
             List<ServiceInstance<String>> list = Lists.newArrayList();
             list.add(instance);
-            Assert.assertEquals(discovery.queryForInstances("test"), list);
+            assertEquals(discovery.queryForInstances("test"), list);
 
             ServiceDiscoveryImpl<String> discoveryImpl = (ServiceDiscoveryImpl<String>)discovery;
             ServiceInstance<String> changedInstance = ServiceInstance.<String>builder()
@@ -79,8 +81,8 @@
             timing.sleepABit();
 
             ServiceInstance<String> registeredService = discoveryImpl.getRegisteredService(instance.getId());
-            Assert.assertNotNull(registeredService);
-            Assert.assertEquals(registeredService.getPayload(), "different");
+            assertNotNull(registeredService);
+            assertEquals(registeredService.getPayload(), "different");
         }
         finally
         {
diff --git a/pom.xml b/pom.xml
index 942dac8..b3949fe 100644
--- a/pom.xml
+++ b/pom.xml
@@ -52,6 +52,11 @@
     </organization>
 
     <properties>
+        <!-- maven properties -->
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        <dependency.locations.enabled>false</dependency.locations.enabled>
+
         <currentStableVersion>5.1.0</currentStableVersion>
 
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -85,7 +90,7 @@
         <guava-version>27.0.1-jre</guava-version>
         <guava-listenablefuture-version>1.0</guava-listenablefuture-version>
         <guava-failureaccess-version>1.0.1</guava-failureaccess-version>
-        <testng-version>6.14.3</testng-version>
+        <junit-version>5.6.2</junit-version>
         <swift-version>0.23.1</swift-version>
         <maven-shade-plugin-version>3.2.1</maven-shade-plugin-version>
         <slf4j-version>1.7.25</slf4j-version>
@@ -568,9 +573,15 @@
             </dependency>
 
             <dependency>
-                <groupId>org.testng</groupId>
-                <artifactId>testng</artifactId>
-                <version>${testng-version}</version>
+                <groupId>org.junit.jupiter</groupId>
+                <artifactId>junit-jupiter-api</artifactId>
+                <version>${junit-version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.junit.jupiter</groupId>
+                <artifactId>junit-jupiter-engine</artifactId>
+                <version>${junit-version}</version>
             </dependency>
 
             <dependency>
@@ -658,6 +669,12 @@
                 </plugin>
 
                 <plugin>
+                    <groupId>org.commonjava.maven.plugins</groupId>
+                    <artifactId>directory-maven-plugin</artifactId>
+                    <version>0.1</version>
+                </plugin>
+
+                <plugin>
                     <groupId>com.mycila.maven-license-plugin</groupId>
                     <artifactId>maven-license-plugin</artifactId>
                     <version>${maven-license-plugin-version}</version>
@@ -691,6 +708,12 @@
                     <artifactId>build-helper-maven-plugin</artifactId>
                     <version>${build-helper-maven-plugin-version}</version>
                 </plugin>
+
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-dependency-plugin</artifactId>
+                    <version>3.1.1</version>
+                </plugin>
             </plugins>
         </pluginManagement>
 
@@ -745,10 +768,12 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
+                <version>3.0.0-M5</version>
                 <configuration>
                     <threadCount>1</threadCount>
                     <reuseForks>false</reuseForks>
                     <redirectTestOutputToFile>true</redirectTestOutputToFile>
+                    <rerunFailingTestsCount>2</rerunFailingTestsCount>
                 </configuration>
             </plugin>
 
@@ -807,11 +832,30 @@
                 </executions>
             </plugin>
 
+            <!-- Directory plugin to find parent root directory absolute path -->
+            <plugin>
+                <groupId>org.commonjava.maven.plugins</groupId>
+                <artifactId>directory-maven-plugin</artifactId>
+                <version>0.1</version>
+                <executions>
+                    <execution>
+                        <id>directories</id>
+                        <goals>
+                            <goal>highest-basedir</goal>
+                        </goals>
+                        <phase>validate</phase>
+                        <configuration>
+                            <property>main.basedir</property>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+
             <plugin>
                 <groupId>com.mycila.maven-license-plugin</groupId>
                 <artifactId>maven-license-plugin</artifactId>
                 <configuration>
-                    <header>src/etc/header.txt</header>
+                    <header>${main.basedir}/src/etc/header.txt</header>
                     <excludes>
                         <exclude>**/*.confluence</exclude>
                         <exclude>**/*.confluence.vm</exclude>
@@ -996,6 +1040,12 @@
                     </execution>
                 </executions>
             </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <version>3.1.1</version>
+            </plugin>
         </plugins>
     </build>
 
