diff --git a/modules/vfs-class-loader/pom.xml b/modules/vfs-class-loader/pom.xml
index 15865b8..1ebcc44 100644
--- a/modules/vfs-class-loader/pom.xml
+++ b/modules/vfs-class-loader/pom.xml
@@ -89,11 +89,6 @@
       <scope>provided</scope>
     </dependency>
     <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
       <groupId>org.apache.hadoop</groupId>
       <artifactId>hadoop-client-minicluster</artifactId>
       <scope>test</scope>
@@ -110,6 +105,11 @@
       <artifactId>log4j-slf4j2-impl</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter-api</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
   <build>
     <pluginManagement>
diff --git a/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/AccumuloDFSBase.java b/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/AccumuloDFSBase.java
index c8a63e8..294c354 100644
--- a/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/AccumuloDFSBase.java
+++ b/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/AccumuloDFSBase.java
@@ -35,8 +35,8 @@
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hdfs.DFSConfigKeys;
 import org.apache.hadoop.hdfs.MiniDFSCluster;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
@@ -80,7 +80,7 @@
     }
   }
 
-  @BeforeClass
+  @BeforeAll
   public static void miniDfsClusterSetup() {
     System.setProperty("java.io.tmpdir", System.getProperty("user.dir") + "/target");
 
@@ -164,7 +164,7 @@
     return vfs;
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDownMiniDfsCluster() {
     if (null != cluster) {
       cluster.shutdown();
diff --git a/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/AccumuloVFSClassLoaderTest.java b/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/AccumuloVFSClassLoaderTest.java
index e86b296..5b63a7b 100644
--- a/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/AccumuloVFSClassLoaderTest.java
+++ b/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/AccumuloVFSClassLoaderTest.java
@@ -18,37 +18,36 @@
  */
 package org.apache.accumulo.classloader.vfs;
 
-import static org.junit.Assert.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 
 import java.io.File;
+import java.util.Objects;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.vfs2.FileObject;
 import org.apache.commons.vfs2.FileSystemException;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 @SuppressFBWarnings(value = "PATH_TRAVERSAL_IN", justification = "paths not set by user input")
 public class AccumuloVFSClassLoaderTest {
 
-  @Rule
-  public TemporaryFolder folder1 =
-      new TemporaryFolder(new File(System.getProperty("user.dir") + "/target"));
+  @TempDir
+  private static File tempDir;
   String folderPath;
 
-  @Before
+  @BeforeEach
   public void setup() throws Exception {
     System.setProperty(AccumuloVFSClassLoader.VFS_CLASSPATH_MONITOR_INTERVAL, "1");
     VFSManager.initialize();
 
-    folderPath = folder1.getRoot().toURI() + ".*";
+    folderPath = tempDir.toURI() + ".*";
 
-    FileUtils.copyURLToFile(this.getClass().getResource("/HelloWorld.jar"),
-        folder1.newFile("HelloWorld.jar"));
+    FileUtils.copyURLToFile(Objects.requireNonNull(this.getClass().getResource("/HelloWorld.jar")),
+        new File(tempDir, "HelloWorld.jar"));
   }
 
   FileObject[] createFileSystems(FileObject[] fos) throws FileSystemException {
@@ -66,7 +65,7 @@
 
   @Test
   public void testConstructor() throws Exception {
-    FileObject testDir = VFSManager.get().resolveFile(folder1.getRoot().toURI().toString());
+    FileObject testDir = VFSManager.get().resolveFile(tempDir.toURI().toString());
     FileObject[] dirContents = testDir.getChildren();
 
     AccumuloVFSClassLoader arvcl = new AccumuloVFSClassLoader(ClassLoader.getSystemClassLoader()) {
diff --git a/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/ClassPathPrinterTest.java b/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/ClassPathPrinterTest.java
index aa063bc..baf019b 100644
--- a/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/ClassPathPrinterTest.java
+++ b/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/ClassPathPrinterTest.java
@@ -18,40 +18,39 @@
  */
 package org.apache.accumulo.classloader.vfs;
 
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.File;
 import java.net.MalformedURLException;
 
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 @SuppressFBWarnings(value = "PATH_TRAVERSAL_IN", justification = "paths not set by user input")
 public class ClassPathPrinterTest {
 
-  @Rule
-  public TemporaryFolder folder1 =
-      new TemporaryFolder(new File(System.getProperty("user.dir") + "/target"));
+  @TempDir
+  private static File tempDir;
 
   private final ClassLoader parent = ClassPathPrinterTest.class.getClassLoader();
 
   private static void assertPattern(String output, String pattern, boolean shouldMatch) {
     if (shouldMatch) {
-      assertTrue("Pattern " + pattern + " did not match output: " + output,
-          output.matches(pattern));
+      assertTrue(output.matches(pattern),
+          "Pattern " + pattern + " did not match output: " + output);
     } else {
-      assertFalse("Pattern " + pattern + " should not match output: " + output,
-          output.matches(pattern));
+      assertFalse(output.matches(pattern),
+          "Pattern " + pattern + " should not match output: " + output);
     }
   }
 
   @Test
   public void testPrintClassPath() throws Exception {
-    File conf = folder1.newFile("accumulo.properties");
+    File conf = new File(tempDir, "accumulo.properties");
+    assertTrue(conf.isFile() || conf.createNewFile());
     VFSManager.initialize();
 
     AccumuloVFSClassLoader cl = new AccumuloVFSClassLoader(parent) {
diff --git a/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/VfsClassLoaderTest.java b/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/VfsClassLoaderTest.java
index e5a5cd1..a3bbb4e 100644
--- a/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/VfsClassLoaderTest.java
+++ b/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/VfsClassLoaderTest.java
@@ -18,9 +18,9 @@
  */
 package org.apache.accumulo.classloader.vfs;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+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 java.net.URL;
 import java.util.Arrays;
@@ -34,10 +34,10 @@
 import org.apache.commons.vfs2.impl.VFSClassLoader;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -49,23 +49,23 @@
   private static FileSystem hdfs = null;
   private static DefaultFileSystemManager vfs = null;
 
-  @BeforeClass
+  @BeforeAll
   public static void setup() throws Exception {
 
     // miniDfsClusterSetup();
 
     hdfs = getCluster().getFileSystem();
-    assertTrue("Unable to create: " + TEST_DIR, hdfs.mkdirs(TEST_DIR));
+    assertTrue(hdfs.mkdirs(TEST_DIR), "Unable to create: " + TEST_DIR);
 
     vfs = getDefaultFileSystemManager();
 
   }
 
-  @Before
+  @BeforeEach
   public void before() throws Exception {
     // Copy jar file to TEST_DIR
     URL jarPath = VfsClassLoaderTest.class.getResource("/HelloWorld.jar");
-    assertNotNull("Unable to find HelloWorld.jar", jarPath);
+    assertNotNull(jarPath, "Unable to find HelloWorld.jar");
     Path src = new Path(jarPath.toURI().toString());
     Path dst = new Path(TEST_DIR, src.getName());
     LOG.info("Copying {} to {}", src, dst);
@@ -76,7 +76,7 @@
   public void testGetClass() throws Exception {
 
     FileObject testDir = vfs.resolveFile(TEST_DIR.toUri().toString());
-    assertNotNull("Unable to resolve test dir via VFS", testDir);
+    assertNotNull(testDir, "Unable to resolve test dir via VFS");
     FileObject[] dirContents = testDir.getChildren();
     LOG.info("Test directory contents according to VFS: {}", Arrays.toString(dirContents));
 
@@ -134,7 +134,7 @@
 
   }
 
-  @AfterClass
+  @AfterAll
   public static void tearDown() throws Exception {
     hdfs.delete(TEST_DIR, true);
     tearDownMiniDfsCluster();
diff --git a/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/context/ReloadingVFSContextClassLoaderFactoryTest.java b/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/context/ReloadingVFSContextClassLoaderFactoryTest.java
index 4846b3c..0bb9dd2 100644
--- a/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/context/ReloadingVFSContextClassLoaderFactoryTest.java
+++ b/modules/vfs-class-loader/src/test/java/org/apache/accumulo/classloader/vfs/context/ReloadingVFSContextClassLoaderFactoryTest.java
@@ -20,10 +20,10 @@
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.nio.file.StandardOpenOption.WRITE;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+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 java.io.BufferedWriter;
 import java.io.File;
@@ -36,10 +36,10 @@
 import org.apache.accumulo.classloader.vfs.context.ReloadingVFSContextClassLoaderFactory.ContextConfig;
 import org.apache.accumulo.classloader.vfs.context.ReloadingVFSContextClassLoaderFactory.Contexts;
 import org.apache.commons.io.FileUtils;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
+import org.junit.jupiter.api.io.TempDir;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -96,16 +96,15 @@
     }
   }
 
-  @Rule
-  public TemporaryFolder TEMP =
-      new TemporaryFolder(new File(System.getProperty("user.dir") + "/target"));
+  @TempDir
+  private static File tempDir;
 
   private static final Contexts c = new Contexts();
 
   private static File foo = new File(System.getProperty("user.dir") + "/target/foo");
   private static File bar = new File(System.getProperty("user.dir") + "/target/bar");
 
-  @BeforeClass
+  @BeforeAll
   public static void setup() throws Exception {
 
     assertTrue(foo.mkdir());
@@ -148,14 +147,19 @@
   }
 
   @Test
-  public void testCreation() throws Exception {
+  public void testCreation(TestInfo testInfo) throws Exception {
 
     FileUtils.copyURLToFile(this.getClass().getResource("/HelloWorld.jar"),
         new File(foo, "HelloWorld.jar"));
     FileUtils.copyURLToFile(this.getClass().getResource("/HelloWorld.jar"),
         new File(bar, "HelloWorld2.jar"));
 
-    File f = TEMP.newFile();
+    String testMethodName = testInfo.getTestMethod().get().getName();
+    File testSubDir = new File(tempDir, testMethodName);
+    assertTrue(testSubDir.isDirectory() || testSubDir.mkdir());
+
+    File f = new File(testSubDir, "configFile");
+    assertTrue(f.isFile() || f.createNewFile());
     f.deleteOnExit();
     Gson g = new Gson();
     String contexts = g.toJson(c);
@@ -180,7 +184,7 @@
   }
 
   @Test
-  public void testReloading() throws Exception {
+  public void testReloading(TestInfo testInfo) throws Exception {
 
     System.setProperty(AccumuloVFSClassLoader.VFS_CLASSPATH_MONITOR_INTERVAL, "1");
 
@@ -189,7 +193,12 @@
     FileUtils.copyURLToFile(this.getClass().getResource("/HelloWorld.jar"),
         new File(bar, "HelloWorld2.jar"));
 
-    File f = TEMP.newFile();
+    String testMethodName = testInfo.getTestMethod().get().getName();
+    File testSubDir = new File(tempDir, testMethodName);
+    assertTrue(testSubDir.isDirectory() || testSubDir.mkdir());
+
+    File f = new File(testSubDir, "configFile");
+    assertTrue(f.isFile() || f.createNewFile());
     f.deleteOnExit();
     Gson g = new Gson();
     String contexts = g.toJson(c);
diff --git a/pom.xml b/pom.xml
index 03d27fd..c584472 100644
--- a/pom.xml
+++ b/pom.xml
@@ -171,12 +171,6 @@
         <scope>provided</scope>
       </dependency>
       <dependency>
-        <groupId>junit</groupId>
-        <artifactId>junit</artifactId>
-        <version>4.13.2</version>
-        <scope>test</scope>
-      </dependency>
-      <dependency>
         <groupId>org.apache.accumulo</groupId>
         <artifactId>accumulo-start</artifactId>
         <version>2.1.0</version>
@@ -206,6 +200,12 @@
         <version>2.19.0</version>
         <scope>test</scope>
       </dependency>
+      <dependency>
+        <groupId>org.junit.jupiter</groupId>
+        <artifactId>junit-jupiter-api</artifactId>
+        <version>5.9.1</version>
+        <scope>test</scope>
+      </dependency>
     </dependencies>
   </dependencyManagement>
   <build>
@@ -229,6 +229,16 @@
           </configuration>
         </plugin>
         <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-surefire-plugin</artifactId>
+          <version>3.0.0-M6</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-failsafe-plugin</artifactId>
+          <version>3.0.0-M6</version>
+        </plugin>
+        <plugin>
           <groupId>com.github.ekryd.sortpom</groupId>
           <artifactId>sortpom-maven-plugin</artifactId>
           <version>2.12.0</version>
@@ -340,11 +350,19 @@
                   </module>
                   <module name="RegexpSinglelineJava">
                     <property name="format" value="junit[.]framework[.]TestCase" />
-                    <property name="message" value="Use JUnit4+ @Test annotation instead of TestCase" />
+                    <property name="message" value="Use JUnit5+ @Test annotation instead of TestCase" />
                   </module>
                   <module name="RegexpSinglelineJava">
-                    <property name="format" value="import org[.]junit[.]Assert;" />
-                    <property name="message" value="Use static imports for Assert.* methods for consistency" />
+                    <property name="format" value="org[.]junit[.](?!jupiter)" />
+                    <property name="message" value="Use JUnit5 (JUnit Jupiter) instead of JUnit4 (or lower)" />
+                  </module>
+                  <module name="RegexpSinglelineJava">
+                    <property name="format" value="org[.]junit[.]jupiter[.]api[.]Assertions;" />
+                    <property name="message" value="Use static imports for Assertions.* methods for consistency" />
+                  </module>
+                  <module name="RegexpSinglelineJava">
+                    <property name="format" value="org[.]junit[.]jupiter[.]api[.]Assumptions;" />
+                    <property name="message" value="Use static imports for Assumptions.* methods for consistency" />
                   </module>
                   <module name="OuterTypeFilename" />
                   <module name="AvoidStarImport" />
