diff --git a/nucleus/pom.xml b/nucleus/pom.xml
index a724c84..ae65b3c 100644
--- a/nucleus/pom.xml
+++ b/nucleus/pom.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
 
-	Copyright (c) 2021 Contributors to the Eclipse Foundation
+    Copyright (c) 2021-2022 Contributors to the Eclipse Foundation
     Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
 
     This program and the accompanying materials are made available under the
@@ -74,6 +74,7 @@
         <module>diagnostics</module>
         <module>resources</module>
         <module>featuresets</module>
+        <module>tests</module>
     </modules>
 
     <scm>
diff --git a/nucleus/tests/admin/src/addon/modules/test-progress-status-commands/osgi.bundle b/nucleus/tests/admin-adon/osgi.bundle
similarity index 100%
rename from nucleus/tests/admin/src/addon/modules/test-progress-status-commands/osgi.bundle
rename to nucleus/tests/admin-adon/osgi.bundle
diff --git a/nucleus/tests/admin/src/addon/modules/test-progress-status-commands/pom.xml b/nucleus/tests/admin-adon/pom.xml
similarity index 96%
rename from nucleus/tests/admin/src/addon/modules/test-progress-status-commands/pom.xml
rename to nucleus/tests/admin-adon/pom.xml
index bfcb847..9dcd67e 100644
--- a/nucleus/tests/admin/src/addon/modules/test-progress-status-commands/pom.xml
+++ b/nucleus/tests/admin-adon/pom.xml
@@ -22,8 +22,7 @@
     <parent>
         <groupId>org.glassfish.main.tests</groupId>
         <artifactId>nucleus-tests</artifactId>
-        <version>@project.version@</version>
-        <relativePath>../../../../../pom.xml</relativePath>
+        <version>6.2.6-SNAPSHOT</version>
     </parent>
     <artifactId>test-progress-status-commands</artifactId>
     <name>Progress status - Test Commands</name>
diff --git a/nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressComplexCommand.java b/nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressComplexCommand.java
similarity index 100%
rename from nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressComplexCommand.java
rename to nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressComplexCommand.java
diff --git a/nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressCustomCommand.java b/nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressCustomCommand.java
similarity index 100%
rename from nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressCustomCommand.java
rename to nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressCustomCommand.java
diff --git a/nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressDoubleTotalsCommand.java b/nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressDoubleTotalsCommand.java
similarity index 100%
rename from nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressDoubleTotalsCommand.java
rename to nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressDoubleTotalsCommand.java
diff --git a/nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressExecOtherCommand.java b/nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressExecOtherCommand.java
similarity index 100%
rename from nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressExecOtherCommand.java
rename to nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressExecOtherCommand.java
diff --git a/nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressFailInHalfCommand.java b/nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressFailInHalfCommand.java
similarity index 97%
rename from nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressFailInHalfCommand.java
rename to nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressFailInHalfCommand.java
index 969c298..029930e 100644
--- a/nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressFailInHalfCommand.java
+++ b/nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressFailInHalfCommand.java
@@ -27,7 +27,8 @@
 import org.glassfish.hk2.api.PerLookup;
 import org.jvnet.hk2.annotations.Service;
 
-/** Basic progress status example.
+/**
+ * Basic progress status example.
  * Contains 10 steps
  *
  * @author mmares
diff --git a/nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressFullAnnotCommand.java b/nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressFullAnnotCommand.java
similarity index 100%
rename from nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressFullAnnotCommand.java
rename to nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressFullAnnotCommand.java
diff --git a/nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressPayloadCommand.java b/nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressPayloadCommand.java
similarity index 100%
rename from nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressPayloadCommand.java
rename to nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressPayloadCommand.java
diff --git a/nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressSimpleCommand.java b/nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressSimpleCommand.java
similarity index 100%
rename from nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressSimpleCommand.java
rename to nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressSimpleCommand.java
diff --git a/nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressStepBackCommand.java b/nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressStepBackCommand.java
similarity index 100%
rename from nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressStepBackCommand.java
rename to nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressStepBackCommand.java
diff --git a/nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressWithSupplementCommand.java b/nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressWithSupplementCommand.java
similarity index 100%
rename from nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/ProgressWithSupplementCommand.java
rename to nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/ProgressWithSupplementCommand.java
diff --git a/nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/SupplementAfter.java b/nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/SupplementAfter.java
similarity index 100%
rename from nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/SupplementAfter.java
rename to nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/SupplementAfter.java
diff --git a/nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/SupplementBefore.java b/nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/SupplementBefore.java
similarity index 100%
rename from nucleus/tests/admin/src/addon/modules/test-progress-status-commands/src/main/java/com/sun/enterprise/tests/progress/SupplementBefore.java
rename to nucleus/tests/admin-adon/src/main/java/com/sun/enterprise/tests/progress/SupplementBefore.java
diff --git a/nucleus/tests/admin/pom.xml b/nucleus/tests/admin/pom.xml
index 46d5848..d927abf 100644
--- a/nucleus/tests/admin/pom.xml
+++ b/nucleus/tests/admin/pom.xml
@@ -17,39 +17,6 @@
 
 -->
 
-<!--
-INSTRUCTIONS for running nucleus admin dev tests.
-
-To run all of the tests using the staged nucleus build in distributions/nucleus:
-    mvn test
-
-To run just one test:
-    mvn -Dtest=MiscCommandsTest,NucleusStartStopTest test
-
-Some tests require testing libraries/modules in running distribution. Please do
-NOT start test against running instance.
-
-To run tests based on your own install:
-    mvn -Dnucleus.home=...somedirectory/nucleus test
-
-To see the output of a test run, look in the target/surefire-reports directory.
-The TEST-TestSuite.xml file is especially useful.
-
-INSTRUCTIONS for adding tests.
-
-Copy one of the existing test files, such as MiscCommandsTest.java.  Then add
-tests.  The file will automatically be picked up as part of the suite. There is
-no need to modify this pom.xml file or any other configuration file. Useful
-utilities are in the NucleusTestUtils class.
-
-Test suit contains place for additional modules/libraries with testing content
-that are copied into the Nucleus before start and removed after stop:
-- src/addon/module/* -> <Nucleus>/modules
-(If you need to add your testing module to different directory in nucleus than
-modify org.glassfish.nucleus.admin.NucleusStartStopTest static initializer
-of COPY_LIB map constant.)
-
--->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
@@ -81,7 +48,6 @@
             <artifactId>jersey-hk2</artifactId>
             <scope>test</scope>
         </dependency>
-
         <dependency>
             <groupId>org.glassfish.main.admin</groupId>
             <artifactId>rest-client</artifactId>
@@ -101,6 +67,29 @@
             <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
+
+        <dependency>
+            <groupId>org.glassfish.main.distributions</groupId>
+            <artifactId>glassfish</artifactId>
+            <type>zip</type>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.main.tests</groupId>
+            <artifactId>test-progress-status-commands</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>jakarta.xml.bind</groupId>
             <artifactId>jakarta.xml.bind-api</artifactId>
@@ -114,30 +103,32 @@
     <build>
         <plugins>
             <plugin>
-                <artifactId>maven-invoker-plugin</artifactId>
-                <configuration>
-                    <pomIncludes>
-                        <pomInclude>modules/*/pom.xml</pomInclude>
-                        <pomInclude>asadmin/*/pom.xml</pomInclude>
-                    </pomIncludes>
-                    <goals>
-                        <goal>clean</goal>
-                        <goal>package</goal>
-                    </goals>
-                    <projectsDirectory>${basedir}/src/addon/</projectsDirectory>
-                    <cloneProjectsTo>${project.build.directory}/addon</cloneProjectsTo>
-                </configuration>
+                <artifactId>maven-dependency-plugin</artifactId>
                 <executions>
                     <execution>
-                        <id>build-addons</id>
-                        <phase>process-test-resources</phase>
+                        <id>unpack-glassfish</id>
                         <goals>
-                            <goal>run</goal>
+                            <goal>unpack-dependencies</goal>
                         </goals>
+                        <configuration>
+                            <includeArtifactIds>glassfish</includeArtifactIds>
+                            <excludeTransitive>true</excludeTransitive>
+                            <outputDirectory>${project.build.directory}</outputDirectory>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>copy-addon</id>
+                        <goals>
+                            <goal>copy-dependencies</goal>
+                        </goals>
+                        <configuration>
+                            <includeArtifactIds>test-progress-status-commands</includeArtifactIds>
+                            <excludeTransitive>true</excludeTransitive>
+                            <outputDirectory>${project.build.directory}/glassfish6/glassfish/modules</outputDirectory>
+                        </configuration>
                     </execution>
                 </executions>
             </plugin>
-
             <plugin>
                 <artifactId>maven-surefire-plugin</artifactId>
                 <configuration>
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/ClusterTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/ClusterTest.java
index 566259d..dc1b66b 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/ClusterTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/ClusterTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,38 +17,46 @@
 
 package org.glassfish.nucleus.admin;
 
-import static org.glassfish.tests.utils.NucleusTestUtils.getURL;
-import static org.glassfish.tests.utils.NucleusTestUtils.matchString;
-import static org.glassfish.tests.utils.NucleusTestUtils.nadmin;
-import static org.testng.AssertJUnit.assertTrue;
+import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
+import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.ExtendWith;
 
-import org.testng.annotations.Test;
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.getURL;
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadmin;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.stringContainsInOrder;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
- *
  * @author Tom Mueller
  */
-@Test(testName = "ClusterTest", enabled = true)
+@TestMethodOrder(OrderAnnotation.class)
+@ExtendWith(DomainLifecycleExtension.class)
 public class ClusterTest {
 
-    final String tn = "QLCluster";
-    final String port1 = "55123";
-    final String port2 = "55124";
-    final String cname = "eec1";
-    final String i1name = "eein1-with-a-very-very-very-long-name";
-    final String i2name = "eein2";
-    String i1url = "http://localhost:" + port1;
-    String i2url = "http://localhost:" + port2;
+    private final String tn = "QLCluster";
+    private final String port1 = "55123";
+    private final String port2 = "55124";
+    private final String cname = "eec1";
+    private final String i1name = "eein1-with-a-very-very-very-long-name";
+    private final String i2name = "eein2";
+    private final String i1url = "http://localhost:" + port1;
+    private final String i2url = "http://localhost:" + port2;
 
     @Test
+    @Order(1)
     public void createClusterTest() {
         // create a cluster and two instances
-        assertTrue("create cluster", nadmin("create-cluster", cname));
+        assertTrue(nadmin("create-cluster", cname), "create cluster");
     }
 
-    @Test(dependsOnMethods = { "createClusterTest" })
+    @Test
+    @Order(2)
     public void createInstancesTest() {
-        assertTrue("create instance1",
+        assertTrue(
             nadmin("create-local-instance", "--cluster", cname, "--systemproperties",
                         "HTTP_LISTENER_PORT=" + port1 + ":" +
                         "HTTP_SSL_LISTENER_PORT=18181:" +
@@ -57,47 +66,52 @@
                         "IIOP_SSL_MUTUALAUTH_PORT=13801:" +
                         "JMS_PROVIDER_PORT=18686:" +
                         "ASADMIN_LISTENER_PORT=14848",
-                        i1name));
+                        i1name), "create instance1");
 
-        assertTrue("create instance2",
+        assertTrue(
             nadmin("create-local-instance", "--cluster", cname, "--systemproperties",
                     "HTTP_LISTENER_PORT=" + port2 +
                     ":HTTP_SSL_LISTENER_PORT=28181:IIOP_SSL_LISTENER_PORT=23800:" +
                     "IIOP_LISTENER_PORT=23700:JMX_SYSTEM_CONNECTOR_PORT=27676:IIOP_SSL_MUTUALAUTH_PORT=23801:" +
                     "JMS_PROVIDER_PORT=28686:ASADMIN_LISTENER_PORT=24848",
-                    i2name));
+                    i2name), "create instance2");
     }
 
-    @Test(dependsOnMethods = { "createInstancesTest" })
+    @Test
+    @Order(3)
     public void startInstancesTest() {
         // start the instances
-        assertTrue("start instance1", nadmin("start-local-instance", i1name));
-        assertTrue("start instance2", nadmin("start-local-instance", i2name));
+        assertTrue(nadmin("start-local-instance", i1name), "start instance1");
+        assertTrue(nadmin("start-local-instance", i2name), "start instance2");
     }
 
-    @Test(dependsOnMethods = { "startInstancesTest" })
+    @Test
+    @Order(4)
     public void checkClusterTest() {
         // check that the instances are there
-        assertTrue("list-instances", nadmin("list-instances"));
-        assertTrue("getindex1", matchString("GlassFish Server", getURL(i1url)));
-        assertTrue("getindex2", matchString("GlassFish Server", getURL(i2url)));
+        assertTrue(nadmin("list-instances"), "list-instances");
+        assertThat(getURL(i1url), stringContainsInOrder("GlassFish Server"));
+        assertThat(getURL(i2url), stringContainsInOrder("GlassFish Server"));
     }
 
-    @Test(dependsOnMethods = { "checkClusterTest" })
+    @Test
+    @Order(5)
     public void stopInstancesTest() {
         // stop and delete the instances and cluster
-        assertTrue("stop instance1", nadmin("stop-local-instance", "--kill", i1name));
-        assertTrue("stop instance2", nadmin("stop-local-instance", "--kill", i2name));
+        assertTrue(nadmin("stop-local-instance", "--kill", i1name), "stop instance1");
+        assertTrue(nadmin("stop-local-instance", "--kill", i2name), "stop instance2");
     }
 
-    @Test(dependsOnMethods = { "stopInstancesTest" })
+    @Test
+    @Order(6)
     public void deleteInstancesTest() {
-        assertTrue("delete instance1", nadmin("delete-local-instance", i1name));
-        assertTrue("delete instance2", nadmin("delete-local-instance", i2name));
+        assertTrue(nadmin("delete-local-instance", i1name), "delete instance1");
+        assertTrue(nadmin("delete-local-instance", i2name), "delete instance2");
     }
 
-    @Test(dependsOnMethods = { "deleteInstancesTest" })
+    @Test
+    @Order(7)
     public void deleteClusterTest() {
-        assertTrue("delete cluster", nadmin("delete-cluster", cname));
+        assertTrue(nadmin("delete-cluster", cname), "delete cluster");
     }
 }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/MiscCommandsTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/MiscCommandsTest.java
index 6067b94..1771a4b 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/MiscCommandsTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/MiscCommandsTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,29 +17,40 @@
 
 package org.glassfish.nucleus.admin;
 
-import static org.glassfish.tests.utils.NucleusTestUtils.*;
-import static org.testng.AssertJUnit.assertTrue;
-import org.testng.annotations.Test;
+import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
+import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadmin;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 
 /**
- *
  * @author Tom Mueller
  */
-@Test(testName="MiscCommandsTest")
+@ExtendWith(DomainLifecycleExtension.class)
+@TestMethodOrder(OrderAnnotation.class)
 public class MiscCommandsTest {
 
+    @Test
+    @Order(1)
     public void uptime() {
         assertTrue(nadmin("uptime"));
     }
 
+    @Test
+    @Order(1)
     public void version1() {
         assertTrue(nadmin("version"));
     }
 
+    @Test
+    @Order(100)
     public void version2() {
         assertTrue(nadmin("stop-domain"));
         assertTrue(nadmin("version", "--local"));
-        assertTrue(nadmin("start-domain"));
     }
-
 }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/NucleusStartStopTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/NucleusStartStopTest.java
deleted file mode 100644
index edabfbf..0000000
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/NucleusStartStopTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.nucleus.admin;
-
-import static org.glassfish.tests.utils.NucleusTestUtils.getNucleusRoot;
-import static org.glassfish.tests.utils.NucleusTestUtils.nadmin;
-import static org.testng.AssertJUnit.assertNotNull;
-import static org.testng.AssertJUnit.assertTrue;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.channels.FileChannel;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.testng.ITestContext;
-import org.testng.annotations.AfterSuite;
-import org.testng.annotations.BeforeSuite;
-
-public class NucleusStartStopTest {
-
-    private static final String TEST_LIBS_KEY = "TEST_LIBS";
-    private static final Map<String, String> COPY_LIB;
-    static {
-        Map<String, String> map = new HashMap<>();
-        map.put("modules", "modules");
-        COPY_LIB = Collections.unmodifiableMap(map);
-    }
-
-    @BeforeSuite
-    public void setUp(ITestContext context) throws IOException {
-        // Copy testing libraries into Nucleus distribution
-        Collection<File> testLibs = new ArrayList<File>();
-        context.setAttribute(TEST_LIBS_KEY, testLibs);
-        String basedir = System.getProperty("basedir");
-        assertNotNull(basedir);
-
-        File addondir = new File(basedir, "target/addon");
-        for (Map.Entry<String, String> copyLibEntry : COPY_LIB.entrySet()) {
-            copyLibraries(
-                new File(addondir, copyLibEntry.getKey()),
-                new File(getNucleusRoot(), copyLibEntry.getValue()),
-                testLibs);
-        }
-
-        // Start
-        assertTrue(nadmin("start-domain"));
-    }
-
-    @AfterSuite(alwaysRun = true)
-    public void tearDown(ITestContext context) {
-        try {
-            assertTrue(nadmin("stop-domain"));
-        } finally {
-            @SuppressWarnings("unchecked")
-            Collection<File> libs = (Collection<File>) context.getAttribute(TEST_LIBS_KEY);
-            if (libs != null) {
-                for (File lib : libs) {
-                    if (lib.exists()) {
-                        try {
-                            lib.delete();
-                        } catch (Exception ex) {
-                            System.out.println("Can not delete " + lib.getAbsolutePath());
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    private void copyLibraries(File src, File dest, Collection<File> copiedLibs) throws IOException {
-        if (src.exists() && src.isDirectory()) {
-            File[] dirs = src.listFiles(f -> f.isDirectory());
-
-            for (File dir : dirs) {
-                File target = new File(dir, "target");
-                if (target.exists() && target.isDirectory()) {
-                    File[] jars = target.listFiles(f-> f.isFile() && f.getName().toLowerCase().endsWith(".jar"));
-
-                    for (File jar : jars) {
-                        File destinationFile = new File(dest, jar.getName());
-                        copiedLibs.add(destinationFile);
-                        copy(jar, destinationFile);
-
-                        System.out.println("TESTING LIBRARY: " + destinationFile.getAbsolutePath());
-                    }
-                }
-            }
-        }
-    }
-
-    private static void copy(File src, File dest) throws IOException {
-        if (!dest.exists()) {
-            dest.createNewFile();
-        }
-
-        try (FileChannel sch = new FileInputStream(src).getChannel();  FileChannel dch = new FileOutputStream(dest).getChannel()) {
-            dch.transferFrom(sch, 0, sch.size());
-        }
-    }
-
-}
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/OSGiCommandsTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/OSGiCommandsTest.java
index 36faf61..35bab2a 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/OSGiCommandsTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/OSGiCommandsTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2013, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,43 +17,52 @@
 
 package org.glassfish.nucleus.admin;
 
-import org.glassfish.api.admin.AccessRequired;
-import org.glassfish.tests.utils.NucleusTestUtils;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.io.*;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import static org.glassfish.tests.utils.NucleusTestUtils.nadmin;
-import static org.glassfish.tests.utils.NucleusTestUtils.nadminWithOutput;
-import static org.testng.AssertJUnit.assertEquals;
-import static org.testng.AssertJUnit.assertFalse;
-import static org.testng.AssertJUnit.assertTrue;
+import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
+import org.glassfish.nucleus.test.tool.NucleusTestUtils;
+import org.glassfish.nucleus.test.tool.NucleusTestUtils.NadminReturn;
+import org.hamcrest.collection.IsEmptyCollection;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadmin;
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadminWithOutput;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.not;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 
 /**
  * @author sanjeeb.sahoo@oracle.com
  */
-@Test
+@ExtendWith(DomainLifecycleExtension.class)
 public class OSGiCommandsTest {
 
+    @Test
     public void basicOsgiCmd() {
         assertTrue(nadmin("osgi", "lb"));
     }
 
     private List<String> runCmd(String... cmd) throws Exception {
-        NucleusTestUtils.NadminReturn value = nadminWithOutput(cmd);
+        NadminReturn value = nadminWithOutput(cmd);
         if (!value.returnValue) {
             throw new Exception("Cmd failed: \n" + value.outAndErr);
         }
-        List<String> output = new ArrayList<String>();
+        List<String> output = new ArrayList<>();
         for (String line : value.out.split("\\n")) {
             line = line.trim();
-            if (line.isEmpty() || line.startsWith("nadmin") || line.startsWith("Command")) continue;
+            if (line.isEmpty() || line.startsWith("nadmin") || line.startsWith("Command")) {
+                continue;
+            }
             output.add(line);
         }
         return output;
@@ -68,7 +78,7 @@
 
     private Set<String> listCmdSessions() throws Exception {
         List<String> sessions = runCmd("osgi", "--session", "list");
-        return new HashSet<String>(sessions);
+        return new HashSet<>(sessions);
     }
 
     /**
@@ -76,33 +86,38 @@
      * It creates sessions, lists them, executes commands against each session and finally stops them.
      * @throws Exception
      */
+    @Test
     public void osgiCmdSession() throws Exception {
         // Create some sessions
-        Set<String> sessions = new HashSet<String>();
-        for (int i = 0 ; i < 3; ++i) {
+        Set<String> sessions = new HashSet<>();
+        for (int i = 0; i < 3; ++i) {
             sessions.add(newCmdSession());
         }
 
         // Let's list them to make sure list operation works.
         final Set<String> actual = listCmdSessions();
-        assertEquals("listed sessions do not match with created sessions", sessions, actual);
+        assertEquals(sessions, actual, "listed sessions do not match with created sessions");
 
-        // Let's set the same variable in each command session with a different value and make sure the variables
+        // Let's set the same variable in each command session with a different value and make sure
+        // the variables
         // are scoped to sessions.
         for (String sessionId : sessions) {
-            runCmd("osgi", "--session", "execute", "--session-id", sessionId, "var=" + sessionId);
+            List<String> result = runCmd("osgi", "--session", "execute", "--session-id", sessionId, "var=" + sessionId);
+            assertThat(result, IsEmptyCollection.empty());
         }
         for (String sessionId : sessions) {
-            String value = runCmd("osgi", "--session", "execute", "--session-id", sessionId, "echo $var").get(0);
-            assertEquals(sessionId, value);
+            List<String> result = runCmd("osgi", "--session", "execute", "--session-id", sessionId, "echo $var");
+            assertThat(result, not(IsEmptyCollection.empty()));
+            assertEquals(sessionId, result.get(0));
         }
 
         // Let's stop all sessions.
         for (String sessionId : sessions) {
-            runCmd("osgi", "--session", "stop", "--session-id", sessionId);
+            List<String> result = runCmd("osgi", "--session", "stop", "--session-id", sessionId);
+            assertThat(result, IsEmptyCollection.empty());
         }
         sessions = listCmdSessions();
-        assertTrue("Not all sessions closed properly: " + sessions, sessions.isEmpty());
+        assertTrue(sessions.isEmpty(), "Not all sessions closed properly: " + sessions);
     }
 
     /**
@@ -110,6 +125,7 @@
      * a list of shell commands to be executed.
      * @throws IOException
      */
+    @Test
     public void osgiShell() throws IOException {
         File cmdFile = File.createTempFile("osgi-commands", ".txt");
         cmdFile.deleteOnExit();
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/RestTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/RestTest.java
index f73e62c..fd3985e 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/RestTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/RestTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -18,52 +19,66 @@
 
 import java.io.DataOutputStream;
 import java.io.IOException;
+import java.net.Authenticator;
 import java.net.HttpURLConnection;
+import java.net.PasswordAuthentication;
 import java.net.URL;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
+import org.glassfish.nucleus.test.tool.NucleusTestUtils;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
-@Test
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@ExtendWith(DomainLifecycleExtension.class)
 public class RestTest {
 
-    public void testManagementEndpoint() {
+    @Test
+    public void testManagementEndpoint() throws Exception {
+        HttpURLConnection connection = getConnection("http://localhost:4848/management/domain.xml");
         try {
-            HttpURLConnection connection = getConnection("http://localhost:4848/management/domain.xml");
             assertEquals(200, connection.getResponseCode());
-        } catch (Exception e) {
-            fail(e.getMessage());
+        } finally {
+            connection.disconnect();
         }
     }
 
-    public void testMonitoringEndpoint() {
+    @Test
+    public void testMonitoringEndpoint() throws Exception {
+        HttpURLConnection connection = getConnection("http://localhost:4848/monitoring/domain.xml");
         try {
-            HttpURLConnection connection = getConnection("http://localhost:4848/monitoring/domain.xml");
             assertEquals(200, connection.getResponseCode());
-        } catch (Exception e) {
-            fail(e.getMessage());
+        } finally {
+            connection.disconnect();
         }
     }
 
-    public void testAdminCommandEndpoint() {
+    @Test
+    public void testAdminCommandEndpoint() throws Exception {
+        HttpURLConnection connection = getConnection("http://localhost:4848/management/domain/version.xml");
         try {
-            HttpURLConnection connection = getConnection("http://localhost:4848/management/domain/version.xml");
             assertEquals(200, connection.getResponseCode());
-        } catch (Exception e) {
-            fail(e.getMessage());
+        } finally {
+            connection.disconnect();
         }
     }
 
-    public void testChildConfigBeanEndpoint() {
+    @Test
+    public void testChildConfigBeanEndpoint() throws Exception {
+        HttpURLConnection connection = getConnection("http://localhost:4848/management/domain/applications.xml");
         try {
-            HttpURLConnection connection = getConnection("http://localhost:4848/management/domain/applications.xml");
             assertEquals(200, connection.getResponseCode());
-        } catch (Exception e) {
-            fail(e.getMessage());
+        } finally {
+            connection.disconnect();
         }
     }
 
-    public void testPostGetDelete() {
-        deleteNode(); // This should almost always fail, so we don't check the status. Just need to clean up from any prior runs
+    @Test
+    public void testPostGetDelete() throws Exception {
+        // FIXME: causes HTTP 500 without any log
+        assertThat(deleteNode(), greaterThanOrEqualTo(400));
         assertEquals(200, createNode());
         assertEquals(200, getNode());
         assertEquals(200, deleteNode());
@@ -73,69 +88,55 @@
         HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
         connection.setRequestProperty("X-GlassFish-3", "true");
         connection.setRequestProperty("X-Requested-By", "dummy");
+        connection.setAuthenticator(new DasAuthenticator());
         return connection;
     }
 
-    private int createNode() {
-        HttpURLConnection connection = null;
+    private int createNode() throws IOException {
+        String parameters = "name=myConfigNode";
+        HttpURLConnection connection = getConnection("http://localhost:4848/management/domain/nodes/create-node-config");
         try {
-            String parameters = "name=myConfigNode";
-            connection = getConnection("http://localhost:4848/management/domain/nodes/create-node-config");
             connection.setRequestMethod("POST");
             connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
-            connection.setRequestProperty("Content-Length", "" + Integer.toString(parameters.getBytes().length));
+            connection.setRequestProperty("Content-Length", Integer.toString(parameters.getBytes().length));
             connection.setUseCaches(false);
             connection.setDoInput(true);
             connection.setDoOutput(true);
             connection.setRequestProperty("Content-Language", "en-US");
-            DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
-            wr.writeBytes(parameters);
-            wr.flush();
-            wr.close();
-            return connection.getResponseCode();
-        } catch (Exception ex) {
-            fail(ex.getMessage());
-        } finally {
-            if (connection != null) {
-                connection.disconnect();
+            try (DataOutputStream wr = new DataOutputStream(connection.getOutputStream())) {
+                wr.writeBytes(parameters);
             }
+            return connection.getResponseCode();
+        } finally {
+            connection.disconnect();
         }
-
-        return -1;
     }
 
-    private int getNode() {
-        HttpURLConnection connection = null;
+    private int getNode() throws IOException {
+        HttpURLConnection connection = getConnection("http://localhost:4848/management/domain/nodes/node/myConfigNode");
         try {
-            connection = getConnection("http://localhost:4848/management/domain/nodes/node/myConfigNode");
             return connection.getResponseCode();
-        } catch (Exception ex) {
-            fail(ex.getMessage());
         } finally {
-            if (connection != null) {
-                connection.disconnect();
-            }
+            connection.disconnect();
         }
-
-        return -1;
     }
 
-    private int deleteNode() {
-        HttpURLConnection connection = null;
+    private int deleteNode() throws IOException {
+        HttpURLConnection connection = getConnection("http://localhost:4848/management/domain/nodes/delete-node-config?id=myConfigNode");
         try {
-            connection = getConnection("http://localhost:4848/management/domain/nodes/delete-node-config?name=myConfigNode");
             connection.setRequestMethod("DELETE");
             connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
             connection.setDoOutput(true);
             return connection.getResponseCode();
-        } catch (Exception ex) {
-            fail(ex.getMessage());
         } finally {
-            if (connection != null) {
-                connection.disconnect();
-            }
+            connection.disconnect();
         }
+    }
 
-        return -1;
+    private static class DasAuthenticator extends Authenticator {
+        @Override
+        protected PasswordAuthentication getPasswordAuthentication() {
+            return new PasswordAuthentication(NucleusTestUtils.ADMIN_USER, NucleusTestUtils.ADMIN_PASSWORD.toCharArray());
+        }
     }
 }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/DetachAttachTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/DetachAttachTest.java
index 92e064e..fe64fec 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/DetachAttachTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/DetachAttachTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -18,103 +19,115 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.io.File;
 import java.util.StringTokenizer;
 import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.ThreadFactory;
-import static org.glassfish.tests.utils.NucleusTestUtils.*;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.AfterTest;
-import org.testng.annotations.Test;
+
+import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
+import org.glassfish.nucleus.test.tool.NucleusTestUtils.NadminReturn;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.deleteJobsFile;
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.deleteOsgiDirectory;
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadmin;
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadminWithOutput;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.stringContainsInOrder;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
- *
  * @author martinmares
  */
-@Test(testName="DetachAttachTest")
+@ExtendWith(DomainLifecycleExtension.class)
 public class DetachAttachTest {
-    private static File nucleusRoot  = getNucleusRoot();
 
-    @AfterTest
+    @AfterEach
     public void cleanUp() throws Exception {
         nadmin("stop-domain");
-        JobManagerTest.deleteJobsFile();
-        //osgi-cache workaround
-        File osgiCacheDir = new File(nucleusRoot, "domains"+File.separator+"domain1"+File.separator+"osgi-cache");
-        deleteDirectoryContents(osgiCacheDir);
+        deleteJobsFile();
+        deleteOsgiDirectory();
         nadmin("start-domain");
     }
 
-    // Test disabled till intermittent failures are fixed
-    @Test(enabled = false)
-    public void uptimePeriodically() throws InterruptedException {
-        Set<String> ids = new HashSet<String>();
+    @Test
+    public void uptimePeriodically() throws Exception {
+        Set<String> ids = new HashSet<>();
         for (int i = 0; i < 3; i++) {
             System.out.println("detachAndAttachUptimePeriodically(): round " + i);
-            NadminReturn result = nadminWithOutput("--detach", "--terse", "uptime");
-            assertTrue(result.returnValue);
-            String id = parseJobIdFromEchoTerse(result.out);
-            assertTrue(ids.add(id)); //Must be unique
+            final String id;
+            {
+                NadminReturn result = nadminWithOutput("--detach", "--terse", "uptime");
+                assertTrue(result.returnValue);
+                id = parseJobIdFromEchoTerse(result.out);
+                assertTrue(ids.add(id));
+            }
             Thread.sleep(1000L);
-            //Now attach
-            result = nadminWithOutput("--terse", "attach", id);
-            assertTrue(result.returnValue);
-            assertTrue(result.out.contains("uptime"));
+            {
+                NadminReturn result = nadminWithOutput("--terse", "attach", id);
+                assertTrue(result.returnValue);
+                assertTrue(result.out.contains("uptime"));
+            }
         }
     }
 
-    public void commandWithProgressStatus() throws InterruptedException {
+
+    @Test
+    public void commandWithProgressStatus() throws Exception {
         NadminReturn result = nadminWithOutput("--detach", "--terse", "progress-custom", "6x1");
         assertTrue(result.returnValue);
         String id = parseJobIdFromEchoTerse(result.out);
         Thread.sleep(2000L);
-        //Now attach running
+        // Now attach running
         result = nadminWithOutput("attach", id);
         assertTrue(result.returnValue);
-        assertTrue(result.out.contains("progress-custom"));
+        assertThat(result.out, stringContainsInOrder("progress-custom"));
         List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.out);
         assertFalse(prgs.isEmpty());
         assertTrue(prgs.get(0).getValue() > 0);
         assertEquals(100, prgs.get(prgs.size() - 1).getValue());
-        //Now attach finished - must NOT exists - seen progress job is removed
+        // Now attach finished - must NOT exist - seen progress job is removed
         result = nadminWithOutput("attach", id);
         assertFalse(result.returnValue);
     }
 
-    public void detachOnesAttachMulti() throws InterruptedException, ExecutionException {
+
+    @Test
+    public void detachOnesAttachMulti() throws Exception {
         ExecutorService pool = Executors.newCachedThreadPool(new ThreadFactory() {
-                                            @Override
-                                            public Thread newThread(Runnable r) {
-                                                Thread result = new Thread(r);
-                                                result.setDaemon(true);
-                                                return result;
-                                            }
-                                        });
-        //Execute command with progress status suport
+            @Override
+            public Thread newThread(Runnable r) {
+                Thread result = new Thread(r);
+                result.setDaemon(true);
+                return result;
+            }
+        });
         NadminReturn result = nadminWithOutput("--detach", "--terse", "progress-custom", "8x1");
         assertTrue(result.returnValue);
         final String id = parseJobIdFromEchoTerse(result.out);
         Thread.sleep(1500L);
-        //Now attach
-        final int _attach_count = 3;
-        Collection<Callable<NadminReturn>> attaches = new ArrayList<Callable<NadminReturn>>(_attach_count);
-        for (int i = 0; i < _attach_count; i++) {
+        final int attachCount = 3;
+        Collection<Callable<NadminReturn>> attaches = new ArrayList<>(attachCount);
+        for (int i = 0; i < attachCount; i++) {
             attaches.add(new Callable<NadminReturn>() {
-                    @Override
-                    public NadminReturn call() throws Exception {
-                        return nadminWithOutput("attach", id);
-                    }
-                });
+                @Override
+                public NadminReturn call() throws Exception {
+                    return nadminWithOutput("attach", id);
+                }
+            });
         }
         List<Future<NadminReturn>> results = pool.invokeAll(attaches);
-        //Test results
         for (Future<NadminReturn> fRes : results) {
             NadminReturn res = fRes.get();
             assertTrue(res.returnValue);
@@ -127,32 +140,8 @@
     }
 
     private String parseJobIdFromEchoTerse(String str) {
-        StringTokenizer stok = new StringTokenizer(str, "\n\r");
-        assertTrue(stok.hasMoreTokens());
-        stok.nextToken();
-        //Id is second non empty line
-        assertTrue(stok.hasMoreTokens());
-        String result = stok.nextToken().trim();
-        assertFalse(result.isEmpty());
-        assertFalse(result.contains(" ")); //With space does not look like ID but like some error message
-        return result;
+        List<Object> stok = Collections.list(new StringTokenizer(str));
+        assertThat(stok, hasSize(1));
+        return (String) stok.get(0);
     }
-
-    static class NadminCallable implements Callable<NadminReturn> {
-
-        private final String[] args;
-
-        public NadminCallable(String... args) {
-            this.args = args;
-        }
-
-        @Override
-        public NadminReturn call() throws Exception {
-            throw new UnsupportedOperationException("Not supported yet.");
-        }
-
-
-
-    }
-
 }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/JobManagerTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/JobManagerTest.java
index b6d16b6..1474268 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/JobManagerTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/JobManagerTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,172 +17,91 @@
 
 package org.glassfish.nucleus.admin.progress;
 
-import java.io.File;
-import java.lang.InterruptedException;
-import java.lang.Thread;
+import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.ExtendWith;
 
-import static org.glassfish.tests.utils.NucleusTestUtils.*;
-import  org.glassfish.tests.utils.NucleusTestUtils;
-import static org.testng.AssertJUnit.assertTrue;
-import org.testng.annotations.AfterTest;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.deleteJobsFile;
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.deleteOsgiDirectory;
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadmin;
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadminDetachWithOutput;
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadminWithOutput;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.stringContainsInOrder;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * This tests the functionality of JobManager, list-jobs
+ *
  * @author Bhakti Mehta
+ * @author David Matejcek
  */
-@Test(testName="JobManagerTest", enabled=true)
+@TestMethodOrder(OrderAnnotation.class)
+@ExtendWith(DomainLifecycleExtension.class)
 public class JobManagerTest {
-    private static File nucleusRoot  = NucleusTestUtils.getNucleusRoot();
 
-    private final String COMMAND1 = "progress-simple";
+    private static final String COMMAND_PROGRESS_SIMPLE = "progress-simple";
 
-    @BeforeTest
+    @BeforeEach
     public void setUp() throws Exception {
         nadmin("stop-domain");
-        //delete jobs.xml incase there were other jobs run
         deleteJobsFile();
-        //osgi-cache workaround
-        File osgiCacheDir = new File(nucleusRoot, "domains"+File.separator+"domain1"+File.separator+"osgi-cache");
-        deleteDirectoryContents(osgiCacheDir);
-        nadmin("start-domain");
-
-
+        deleteOsgiDirectory();
+        assertTrue(nadmin("start-domain"), "start-domain failed");
     }
 
-    @AfterTest
-    public void cleanUp() throws Exception {
-        nadmin("stop-domain");
-        nadmin("start-domain");
-
-    }
-
-    @Test(enabled=true)
+    @Test
+    @Order(1)
     public void noJobsTest() {
-        nadmin("stop-domain");
-        //delete jobs.xml incase there were other jobs run
-        deleteJobsFile();
-        nadmin("start-domain");
-        String result = null;
-        result = nadminWithOutput("list-jobs").outAndErr;
-        assertTrue(matchString("Nothing to list", result));
-
-
-    }
-
-    @Test(dependsOnMethods = { "noJobsTest" },enabled=true)
-    public void runJobTest() {
-        String result = null;
-
-        NadminReturn result1 = nadminWithOutput("--terse", "progress-simple");
-        assertTrue(result1.returnValue);
-        //check list-jobs
-        result = nadminWithOutput("list-jobs").out;
-        assertTrue( result.contains(COMMAND1) && result.contains("COMPLETED"));
-        //check list-jobs with id 1
-        result = nadminWithOutput("list-jobs","1").out;
-        assertTrue( result.contains(COMMAND1) && result.contains("COMPLETED"));
-        //shutdown server
-        assertTrue( nadmin("stop-domain"));
-        //restart
-        assertTrue( nadmin("start-domain"));
-        //check jobs
-        result = nadminWithOutput("list-jobs","1").out;
-        assertTrue( result.contains(COMMAND1) && result.contains("COMPLETED"));
-        nadmin("start-domain");
-
-    }
-
-    @Test(dependsOnMethods = { "runJobTest" }, enabled=true)
-       public void runDetachTest() {
-           String result = null;
-           //shutdown server
-           assertTrue( nadmin("stop-domain"));
-
-           //delete the jobs file
-           deleteJobsFile();
-
-           //restart
-           assertTrue( nadmin("start-domain"));
-           result = nadminDetachWithOutput( COMMAND1).out;
-           //Detached job id is returned
-           assertTrue( result.contains("Job ID: "));
-
-           //list-jobs
-           result = nadminWithOutput("list-jobs","1").out;
-           assertTrue( result.contains(COMMAND1) );
-           //attach to the job
-           assertTrue(nadmin("attach", "1"));
-
-           //list-jobs   and it should be purged since the user
-           //starting is the same as the user who attached to it
-           result = nadminWithOutput("list-jobs").outAndErr;
-           assertTrue(matchString("Nothing to list", result));
-
-           //delete the jobs file
-           deleteJobsFile();
-
-
-
-       }
-
-       @Test(dependsOnMethods = { "runDetachTest" }, enabled=false)
-       public void runConfigureManagedJobsTest() throws InterruptedException {
-           try {
-               String result = null;
-               //shutdown server
-               assertTrue( nadmin("stop-domain"));
-
-               //delete the jobs file
-               deleteJobsFile();
-
-               //restart
-               assertTrue( nadmin("start-domain"));
-               //configure-managed-jobs
-               assertTrue( nadmin("configure-managed-jobs","--job-retention-period=6s","--cleanup-initial-delay=2s",
-                       "--cleanup-poll-interval=2s"));
-               assertTrue(COMMAND1, nadmin(COMMAND1));
-
-
-               //list-jobs
-               result = nadminWithOutput("list-jobs","1").out;
-               assertTrue( result.contains(COMMAND1) );
-               //shutdown server
-               assertTrue( nadmin("stop-domain"));
-
-               //start server
-               assertTrue( nadmin("start-domain"));
-               Thread.sleep(5000L);
-
-               //list-jobs there should be none since the configure-managed-jobs command will purge it
-               result = nadminWithOutput("list-jobs").outAndErr;
-               assertTrue(matchString("Nothing to list", result));
-
-           } finally {
-                //reset configure-managed-jobs
-                assertTrue( nadmin("configure-managed-jobs","--job-retention-period=24h","--cleanup-initial-delay=20m",
-                   "--cleanup-poll-interval=20m"));
-           }
-           //delete the jobs file
-           deleteJobsFile();
-
-
-
-       }
-
-    /**
-     * This will delete the jobs.xml file
-     */
-    public static void deleteJobsFile() {
-        File configDir = new File(nucleusRoot,"domains/domain1/config");
-        File jobsFile = new File (configDir,"jobs.xml");
-        System.out.println("Deleting.. " + jobsFile);
-        if (jobsFile!= null && jobsFile.exists()) {
-            jobsFile.delete();
-        }
+        assertThat(nadminWithOutput("list-jobs").outAndErr, stringContainsInOrder("Nothing to list"));
     }
 
 
+    @Test
+    @Order(2)
+    public void jobSurvivesRestart() throws Exception {
+        assertTrue(nadminWithOutput("--terse", "progress-simple").returnValue);
+        assertThat(nadminWithOutput("list-jobs").out, stringContainsInOrder(COMMAND_PROGRESS_SIMPLE, "COMPLETED"));
+        assertThat(nadminWithOutput("list-jobs", "1").out, stringContainsInOrder(COMMAND_PROGRESS_SIMPLE, "COMPLETED"));
+
+        assertTrue(nadmin("stop-domain"));
+        assertTrue(nadmin("start-domain"));
+        assertThat(nadminWithOutput("list-jobs", "1").out, stringContainsInOrder(COMMAND_PROGRESS_SIMPLE, "COMPLETED"));
+    }
+
+
+    @Test
+    @Order(3)
+    public void detachAndAttach() throws Exception {
+        assertThat(nadminDetachWithOutput(COMMAND_PROGRESS_SIMPLE).out, stringContainsInOrder("Job ID: "));
+        assertThat(nadminWithOutput("list-jobs", "1").out, stringContainsInOrder(COMMAND_PROGRESS_SIMPLE));
+        assertTrue(nadmin("attach", "1"));
+
+        // list-jobs and it should be purged since the user
+        // starting is the same as the user who attached to it
+        assertThat(nadminWithOutput("list-jobs").outAndErr, stringContainsInOrder("Nothing to list"));
+    }
+
+
+    @Test
+    @Order(4)
+    public void runConfigureManagedJobsTest() throws Exception {
+        assertTrue(nadmin("configure-managed-jobs", "--job-retention-period=60s", "--cleanup-initial-delay=1s", "--cleanup-poll-interval=1s"));
+        assertTrue(nadmin(COMMAND_PROGRESS_SIMPLE), COMMAND_PROGRESS_SIMPLE + " failed to start");
+        assertThat(nadminWithOutput("list-jobs", "1").out, stringContainsInOrder(COMMAND_PROGRESS_SIMPLE));
+
+        // FIXME: Random race condition on Linux caused by some bug in restart-domain; 4848 port is then blocked for start-domain in setUp();
+        assertTrue(nadmin("stop-domain"));
+        assertTrue(nadmin("start-domain"));
+        assertThat(nadminWithOutput("list-jobs", "1").out, stringContainsInOrder(COMMAND_PROGRESS_SIMPLE));
+
+        assertTrue(nadmin("configure-managed-jobs", "--job-retention-period=1s", "--cleanup-initial-delay=1s", "--cleanup-poll-interval=1s"));
+        Thread.sleep(2100L);
+        assertThat(nadminWithOutput("list-jobs").outAndErr, stringContainsInOrder("Nothing to list"));
+        assertTrue(nadmin("configure-managed-jobs", "--job-retention-period=1h", "--cleanup-initial-delay=5m", "--cleanup-poll-interval=20m"));
+    }
 }
-
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressMessage.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressMessage.java
index 88f391d..ed36b1c 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressMessage.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressMessage.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -17,26 +18,31 @@
 package org.glassfish.nucleus.admin.progress;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.StringTokenizer;
+import java.util.function.Predicate;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
-/** Parse progress status message.
+/**
+ * Parse progress status message.
  *
  * @author martinmares
  */
 public class ProgressMessage {
 
-    private static final Pattern RGXP = Pattern.compile(" *(\\d+)(%)?:(.+:)?(.*)");
+    private static final Pattern PATTERN = Pattern.compile("[ ]*(\\d+)(%)?:(.+:)?(.*)");
+    private static final Predicate<String> PREDICATE = PATTERN.asMatchPredicate();
 
     private final int value;
     private final boolean percentage;
     private final String scope;
     private final String message;
 
-    public ProgressMessage(String txt) throws IllegalArgumentException {
-        Matcher matcher = RGXP.matcher(txt);
+    private ProgressMessage(String txt) throws IllegalArgumentException {
+        Matcher matcher = PATTERN.matcher(txt);
         if (!matcher.matches()) {
             throw new IllegalArgumentException("Arg txt is not progress message");
         }
@@ -70,23 +76,15 @@
     }
 
     public static List<ProgressMessage> grepProgressMessages(String txt) {
-        StringTokenizer stok = new StringTokenizer(txt, "\n\r");
-        List<ProgressMessage> result = new ArrayList<ProgressMessage>();
-        while (stok.hasMoreTokens()) {
-            String line = stok.nextToken();
-            try {
-                result.add(new ProgressMessage(line));
-            } catch (Exception ex) {
-                //System.out.println(ex);
-            }
-        }
-        return result;
+        StringTokenizer stok = new StringTokenizer(txt, System.lineSeparator());
+        return Collections.list(stok).stream().map(Object::toString).filter(PREDICATE).map(ProgressMessage::new)
+            .collect(Collectors.toList());
     }
 
     /** Unique only that not equal with previous.
      */
     public static String[] uniqueMessages(List<ProgressMessage> pms) {
-        List<String> messages = new ArrayList<String>();
+        List<String> messages = new ArrayList<>();
         for (ProgressMessage pm : pms) {
             if (pm.getMessage() != null &&
                     (messages.isEmpty() || !pm.getMessage().equals(messages.get(messages.size() - 1)))) {
@@ -105,9 +103,8 @@
         for (ProgressMessage pm : pms) {
             if (pm.getValue() < lastVal) {
                 return false;
-            } else {
-                lastVal = pm.getValue();
             }
+            lastVal = pm.getValue();
         }
         return true;
     }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusBasicTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusBasicTest.java
index 93ab234..4e0047c 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusBasicTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusBasicTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,22 +17,25 @@
 
 package org.glassfish.nucleus.admin.progress;
 
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.Iterator;
 import java.util.List;
-import static org.glassfish.tests.utils.NucleusTestUtils.*;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+
+import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
+import org.glassfish.nucleus.test.tool.NucleusTestUtils.NadminReturn;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadminWithOutput;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
- *
  * @author martinmares
  */
-@Test(testName="ProgressStatusBasicTest")
+@ExtendWith(DomainLifecycleExtension.class)
 public class ProgressStatusBasicTest {
 
+    @Test
     public void simple() {
         NadminReturn result = nadminWithOutput("progress-simple");
         assertTrue(result.returnValue);
@@ -44,6 +48,7 @@
         assertTrue(ProgressMessage.isNonDecreasing(prgs));
     }
 
+    @Test
     public void simpleNoTotal() {
         NadminReturn result = nadminWithOutput("progress-simple", "--nototalsteps");
         assertTrue(result.returnValue);
@@ -59,6 +64,7 @@
         assertTrue(ProgressMessage.isNonDecreasing(prgs));
     }
 
+    @Test
     public void simpleSpecInAnnotation() {
         NadminReturn result = nadminWithOutput("progress-full-annotated");
         assertTrue(result.returnValue);
@@ -72,28 +78,11 @@
         assertEquals("annotated:", prgs.get(5).getScope());
     }
 
+    @Test
     public void simpleTerse() {
         NadminReturn result = nadminWithOutput("--terse", "progress-simple");
         assertTrue(result.returnValue);
         List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.out);
         assertTrue(prgs.isEmpty());
     }
-
-//    public void commandWithPayloud() throws IOException {
-//        File tmp = File.createTempFile(String.valueOf(System.currentTimeMillis()) + "ms_", "test");
-//        FileWriter writer = null;
-//        try {
-//            writer = new FileWriter(tmp);
-//            writer.write("This is testing file for nucleus admin tests.\n");
-//            writer.write("Created - " + System.currentTimeMillis() + "\n");
-//            writer.close();
-//            NadminReturn result = nadminWithOutput("progress-payload", tmp.getCanonicalPath());
-//            assertTrue(result.returnValue);
-//            List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.out);
-//            assertTrue(prgs.size() > 0);
-//        } finally {
-//            try {tmp.delete();} catch (Exception ex) {}
-//        }
-//    }
-
 }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusComplexTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusComplexTest.java
index e926ac1..c92044b 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusComplexTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusComplexTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,28 +17,31 @@
 
 package org.glassfish.nucleus.admin.progress;
 
+import java.util.List;
+
+import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
+import org.glassfish.nucleus.test.tool.NucleusTestUtils;
+import org.glassfish.nucleus.test.tool.NucleusTestUtils.NadminReturn;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
 import static org.glassfish.nucleus.admin.progress.ProgressMessage.grepProgressMessages;
 import static org.glassfish.nucleus.admin.progress.ProgressMessage.isNonDecreasing;
 import static org.glassfish.nucleus.admin.progress.ProgressMessage.uniqueMessages;
-import static org.glassfish.tests.utils.NucleusTestUtils.nadminWithOutput;
-import static org.testng.AssertJUnit.assertEquals;
-import static org.testng.AssertJUnit.assertFalse;
-import static org.testng.AssertJUnit.assertTrue;
-import static org.testng.internal.junit.ArrayAsserts.assertArrayEquals;
-
-import java.util.List;
-
-import org.glassfish.tests.utils.NucleusTestUtils;
-import org.glassfish.tests.utils.NucleusTestUtils.NadminReturn;
-import org.testng.annotations.Test;
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadminWithOutput;
+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;
 
 /**
- *
  * @author martinmares
  */
-@Test(testName = "ProgressStatusComplexTest")
+@ExtendWith(DomainLifecycleExtension.class)
 public class ProgressStatusComplexTest {
 
+    @Test
     public void executeCommandFromCommand() {
         NadminReturn result = nadminWithOutput("progress-exec-other");
 
@@ -50,7 +54,8 @@
             uniqueMessages(grepProgressMessages(result.out)));
     }
 
-    @Test(enabled = false)
+    @Test
+    @Disabled
     public void executeCommandWithSupplements() {
         NadminReturn result = nadminWithOutput("progress-supplement");
         assertTrue(result.returnValue);
@@ -70,7 +75,8 @@
     }
 
     // Test disabled till intermittent failures are fixed
-    @Test(enabled = false)
+    @Test
+    @Disabled
     public void executeVeryComplexCommand() {
         NucleusTestUtils.NadminReturn result = nadminWithOutput("progress-complex");
 
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusFailTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusFailTest.java
index 7f04b89..b6890ee 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusFailTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusFailTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -17,17 +18,23 @@
 package org.glassfish.nucleus.admin.progress;
 
 import java.util.List;
-import org.testng.annotations.Test;
-import static org.glassfish.tests.utils.NucleusTestUtils.*;
-import static org.testng.AssertJUnit.*;
+
+import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
+import org.glassfish.nucleus.test.tool.NucleusTestUtils.NadminReturn;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadminWithOutput;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 
 /**
- *
  * @author martinmares
  */
-@Test(testName="ProgressStatusFailTest")
+@ExtendWith(DomainLifecycleExtension.class)
 public class ProgressStatusFailTest {
 
+    @Test
     public void failDuringExecution() {
         NadminReturn result = nadminWithOutput("progress-fail-in-half");
         assertFalse(result.returnValue);
@@ -36,6 +43,7 @@
         assertEquals(50, prgs.get(prgs.size() - 1).getValue());
     }
 
+    @Test
     public void timeout() {
         NadminReturn result = nadminWithOutput(6 * 1000, "progress-custom", "3x1", "1x8", "2x1");
         assertFalse(result.returnValue);
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusSpecialTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusSpecialTest.java
index 5d4063d..3825f7d 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusSpecialTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusSpecialTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -18,17 +19,23 @@
 
 import java.util.Iterator;
 import java.util.List;
-import static org.glassfish.tests.utils.NucleusTestUtils.*;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+
+import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
+import org.glassfish.nucleus.test.tool.NucleusTestUtils.NadminReturn;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadminWithOutput;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
- *
  * @author martinmares
  */
-@Test(testName="ProgressStatusSpecialTest")
+@ExtendWith(DomainLifecycleExtension.class)
 public class ProgressStatusSpecialTest {
 
+    @Test
     public void stepBackCommand() {
         NadminReturn result = nadminWithOutput("progress-step-back");
         assertTrue(result.returnValue);
@@ -54,6 +61,7 @@
         assertTrue(prg.getValue() < 80);
     }
 
+    @Test
     public void doubleTotalCommand() {
         NadminReturn result = nadminWithOutput("progress-double-totals");
         assertTrue(result.returnValue);
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ApplicationTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ApplicationTest.java
index 508d122..5abb8de 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ApplicationTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ApplicationTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,30 +17,27 @@
 
 package org.glassfish.nucleus.admin.rest;
 
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
+import jakarta.ws.rs.core.Response;
+
 import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.net.MalformedURLException;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.HashMap;
 import java.util.Map;
-import jakarta.ws.rs.core.Response;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 /**
- *
  * @author jasonlee
  */
+@Disabled("Missing test application")
 public class ApplicationTest extends RestTestBase {
-    public static final String BASE_JDBC_RESOURCE_URL = "/domain/resources/jdbc-resource";
-    public static final String URL_APPLICATION_DEPLOY = "/domain/applications/application";
-    public static final String URL_CODI_SAMPLE = "http://java.net/jira/secure/attachment/44850/GlassfishIssues.war";
-    public static final String URL_CREATE_INSTANCE = "/domain/create-instance";
 
-    @Test(enabled=false)
+    @Test
     public void testApplicationDeployment() throws URISyntaxException {
         final String appName = "testApp" + generateRandomString();
 
@@ -55,30 +53,7 @@
         }
     }
 
-//    @Test(enabled=false)
-    public void deployCodiApp() throws URISyntaxException, MalformedURLException, IOException {
-        try {
-            final String appName = "testApp" + generateRandomString();
-
-            Map<String, String> params = new HashMap<String, String>();
-            params.put("name", "CloudBeesDS");
-            params.put("poolName", "DerbyPool");
-
-            Response response = post (BASE_JDBC_RESOURCE_URL, params);
-            assertTrue(isSuccess(response));
-
-            Map<String, String> deployedApp = deployApp(downloadFile(new URL(URL_CODI_SAMPLE)), appName, appName);
-            assertEquals(appName, deployedApp.get("name"));
-
-            assertEquals("/" + appName, deployedApp.get("contextRoot"));
-
-            undeployApp(appName);
-        } finally {
-            delete(BASE_JDBC_RESOURCE_URL + "/CloudBeesDS");
-        }
-    }
-
-    @Test(enabled=false)
+    @Test
     public void testApplicationDisableEnable() throws URISyntaxException {
         final String appName = "testApp" + generateRandomString();
 
@@ -88,18 +63,18 @@
         assertEquals("/" + appName, deployedApp.get("contextRoot"));
 
         try {
-            String appUrl = "http://localhost:" + instancePort + "/" + appName;
+            String appUrl = getBaseAdminUrl() + appName;
             Response response = get(appUrl);
             assertEquals ("Test", response.readEntity(String.class).trim());
 
             response = post(URL_APPLICATION_DEPLOY + "/" + appName + "/disable");
-            checkStatusForSuccess(response);
+            checkStatus(response);
 
             response = get(appUrl);
-            assertFalse("Response was " + response.getStatus(), isSuccess(response));
+            assertEquals(404, response.getStatus());
 
             response = post(URL_APPLICATION_DEPLOY + "/" + appName + "/enable");
-            checkStatusForSuccess(response);
+            checkStatus(response);
 
             response = get(appUrl);
             assertEquals ("Test", response.readEntity(String.class).trim());
@@ -108,19 +83,19 @@
         }
     }
 
-    @Test(enabled=false)
+    @Test
     public void listSubComponents() throws URISyntaxException {
         final String appName = "testApp" + generateRandomString();
 
         try {
             deployApp(getFile("stateless-simple.ear"), appName, appName);
             Response response = get(URL_APPLICATION_DEPLOY +"/" + appName + "/list-sub-components?id=" + appName);
-            checkStatusForSuccess(response);
+            checkStatus(response);
             String subComponents = response.readEntity(String.class);
             assertTrue(subComponents.contains("stateless-simple.war"));
 
             response = get(URL_APPLICATION_DEPLOY +"/" + appName + "/list-sub-components?id=stateless-simple.war&appname=" + appName);
-            checkStatusForSuccess(response);
+            checkStatus(response);
             subComponents = response.readEntity(String.class);
             assertTrue(subComponents.contains("GreeterServlet"));
         } finally {
@@ -128,150 +103,97 @@
         }
     }
 
-    @Test(enabled=false)
+    @Test
     public void testCreatingAndDeletingApplicationRefs() throws URISyntaxException {
         final String instanceName = "instance_" + generateRandomString();
         final String appName = "testApp" + generateRandomString();
-        final String appRefUrl = "/domain/servers/server/" + instanceName + "/application-ref";
+        final String appRefUrl = "domain/servers/server/" + instanceName + "/application-ref";
 
-        Map<String, String> newInstance = new HashMap<String, String>() {{
+        Map<String, String> newInstance = new HashMap<>() {{
             put("id", instanceName);
             put("node", "localhost-domain1");
         }};
-        Map<String, String> applicationRef = new HashMap<String, String>() {{
+        Map<String, String> applicationRef = new HashMap<>() {{
             put("id", appName);
             put("target", instanceName);
         }};
 
         try {
             Response response = post(URL_CREATE_INSTANCE, newInstance);
-            checkStatusForSuccess(response);
+            checkStatus(response);
 
             deployApp(getFile("test.war"), appName, appName);
 
             response = post (appRefUrl, applicationRef);
-            checkStatusForSuccess(response);
+            checkStatus(response);
 
             response = get(appRefUrl + "/" + appName);
-            checkStatusForSuccess(response);
+            checkStatus(response);
 
             response = delete(appRefUrl + "/" + appName, new HashMap<String, String>() {{ put("target", instanceName); }});
-            checkStatusForSuccess(response);
+            checkStatus(response);
         } finally {
-            Response response = delete("/domain/servers/server/" + instanceName + "/delete-instance");
-            checkStatusForSuccess(response);
-            response = get("/domain/servers/server/" + instanceName);
-            assertFalse(isSuccess(response));
+            Response response = delete("domain/servers/server/" + instanceName + "/delete-instance");
+            checkStatus(response);
+            response = get("domain/servers/server/" + instanceName);
+            assertEquals(404, response.getStatus());
             undeployApp(appName);
         }
     }
 
-    @Test(enabled=false)
+    @Test
     public void testGetContextRoot() throws URISyntaxException {
         final String appName = "testApp" + generateRandomString();
 
         try {
             Map<String, String> deployedApp = deployApp(getFile("stateless-simple.ear"), appName, appName);
             assertEquals(appName, deployedApp.get("name"));
-            Map<String, String> contextRootPayload = new HashMap<String, String>() {{
+            Map<String, String> contextRootPayload = new HashMap<>() {{
                 put("appname", appName);
                 put("modulename", "stateless-simple.war");
             }};
 
-            Response response = get("/domain/applications/application/" +appName + "/get-context-root", contextRootPayload);
-            checkStatusForSuccess(response);
+            Response response = get("domain/applications/application/" +appName + "/get-context-root", contextRootPayload);
+            checkStatus(response);
             assertTrue(response.readEntity(String.class).contains("helloworld"));
         } finally {
             undeployApp(appName);
         }
     }
 
-//    @Test(enabled=false)
+    @Test
     public void testUndeploySubActionWarnings() throws URISyntaxException {
         final String appName = "testApp" + generateRandomString();
         final String serverName = "in" + generateRandomNumber();
         try {
-            Response response = post ("/domain/create-instance", new HashMap<String, String>() {{
+            Response response = post ("domain/create-instance", new HashMap<String, String>() {{
                 put("id", serverName);
                 put("node", "localhost-domain1");
             }});
-            checkStatusForSuccess(response);
+            checkStatus(response);
 
-            response = post("/domain/servers/server/" + serverName + "/start-instance");
-            checkStatusForSuccess(response);
+            response = post("domain/servers/server/" + serverName + "/start-instance");
+            checkStatus(response);
 
             deployApp(getFile("test.war"), appName, appName);
             addAppRef(appName, serverName);
 
-            response = post("/domain/servers/server/" + serverName + "/stop-instance");
-            checkStatusForSuccess(response);
+            response = post("domain/servers/server/" + serverName + "/stop-instance");
+            checkStatus(response);
 
-            response = delete ("/domain/applications/application/"+appName, new HashMap<String, String>() {{
+            response = delete ("domain/applications/application/"+appName, new HashMap<String, String>() {{
                 put("target", "domain");
             }});
             assertTrue(response.readEntity(String.class).contains("WARNING: Instance " + serverName + " seems to be offline"));
         } finally {
-            delete ("/domain/applications/application/" + appName, new HashMap<String, String>() {{
+            delete ("domain/applications/application/" + appName, new HashMap<String, String>() {{
                 put("target", "domain");
             }});
         }
     }
 
-    protected File getFile(String fileName) throws URISyntaxException {
+    private File getFile(String fileName) throws URISyntaxException {
         final URL resource = getClass().getResource("/" + fileName);
         return new File(resource.toURI());
     }
-
-    protected File downloadFile(URL url) throws IOException {
-        String urlText = url.getFile();
-        String fileName = urlText.substring(urlText.lastIndexOf("/")+1);
-        File file = new File(fileName);
-        file.deleteOnExit();
-        BufferedInputStream in = new BufferedInputStream(url.openStream());
-        FileOutputStream fos = new FileOutputStream(file);
-        BufferedOutputStream bout = new BufferedOutputStream(fos, 1024);
-        byte data[] = new byte[8192];
-        int read = in.read(data, 0, 8192);
-        while (read >= 0) {
-            bout.write(data, 0, read);
-            data = new byte[8192];
-            read = in.read(data, 0, 8192);
-        }
-        bout.close();
-        in.close();
-
-        return file;
-    }
-
-    public Map<String, String> deployApp (final String fileName, final String contextRoot, final String name) throws URISyntaxException {
-        return deployApp(getFile(fileName), contextRoot, name);
-    }
-
-    public Map<String, String> deployApp (final File archive, final String contextRoot, final String name) {
-        Map<String, Object> app = new HashMap<String, Object>() {{
-            put("id", archive);
-            put("contextroot", contextRoot);
-            put("name", name);
-        }};
-
-        Response response = postWithUpload(URL_APPLICATION_DEPLOY, app);
-        checkStatusForSuccess(response);
-
-        return getEntityValues(get(URL_APPLICATION_DEPLOY + "/" + app.get("name")));
-    }
-
-    public void addAppRef(final String applicationName, final String targetName){
-        Response cr = post("/domain/servers/server/" + targetName + "/application-ref", new HashMap<String,String>() {{
-            put("id", applicationName);
-            put("target", targetName);
-        }});
-        checkStatusForSuccess(cr);
-    }
-
-    public Response undeployApp(String appName) {
-        Response response = delete(URL_APPLICATION_DEPLOY + "/" + appName);
-        checkStatusForSuccess(response);
-
-        return response;
-    }
 }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/AuthRealmTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/AuthRealmTest.java
index 47d11bf..281092d 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/AuthRealmTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/AuthRealmTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,37 +17,67 @@
 
 package org.glassfish.nucleus.admin.rest;
 
-import java.util.HashMap;
+import com.sun.enterprise.security.auth.realm.certificate.CertificateRealm;
+import com.sun.enterprise.security.auth.realm.file.FileRealm;
+import com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm;
+import com.sun.enterprise.security.auth.realm.ldap.LDAPRealm;
+import com.sun.enterprise.security.auth.realm.pam.PamRealm;
+import com.sun.enterprise.security.auth.realm.solaris.SolarisRealm;
+
+import jakarta.ws.rs.core.Response;
+
 import java.util.List;
 import java.util.Map;
-import jakarta.ws.rs.core.Response;
+import java.util.stream.Stream;
+
 import org.glassfish.admin.rest.client.utils.MarshallingUtils;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.containsInAnyOrder;
+import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.collection.IsMapWithSize.aMapWithSize;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 public class AuthRealmTest extends RestTestBase {
-    public static final String URL_LIST_GROUP_NAMES = "/domain/configs/config/server-config/security-service/auth-realm/admin-realm/list-group-names";
-    public static final String URL_SUPPORTS_USER_MANAGEMENT = "/domain/configs/config/server-config/security-service/auth-realm/admin-realm/supports-user-management";
-    public static final String URL_LIST_ADMIN_REALM_USERS = "/domain/configs/config/server-config/security-service/auth-realm/admin-realm/list-users";
-    public static final String URL_LIST_FILE_USERS = "/domain/configs/config/server-config/security-service/auth-realm/file/list-users";
-    public static final String URL_CREATE_USER = "/domain/configs/config/server-config/security-service/auth-realm/file/create-user";
-    public static final String URL_DELETE_USER = "/domain/configs/config/server-config/security-service/auth-realm/file/delete-user";
-    public static final String URL_AUTH_REALM_CLASS_NAMES = "/domain/list-predefined-authrealm-classnames";
+    private static final String URL_LIST_GROUP_NAMES = "domain/configs/config/server-config/security-service/auth-realm/admin-realm/list-group-names";
+    private static final String URL_SUPPORTS_USER_MANAGEMENT = "domain/configs/config/server-config/security-service/auth-realm/admin-realm/supports-user-management";
+    private static final String URL_LIST_ADMIN_REALM_USERS = "domain/configs/config/server-config/security-service/auth-realm/admin-realm/list-users";
+    private static final String URL_LIST_FILE_USERS = "domain/configs/config/server-config/security-service/auth-realm/file/list-users";
+    private static final String URL_CREATE_USER = "domain/configs/config/server-config/security-service/auth-realm/file/create-user";
+    private static final String URL_DELETE_USER = "domain/configs/config/server-config/security-service/auth-realm/file/delete-user";
+    private static final String URL_AUTH_REALM_CLASS_NAMES = "domain/list-predefined-authrealm-classnames";
 
-    // Disable this test for now...
-//    @Test
+    @Test
     public void testListGroupNames() {
-        Response response = get(URL_LIST_GROUP_NAMES, new HashMap<String, String>() {{
-            put("userName", "admin");
-            put("realmName", "admin-realm");
-        }});
-        checkStatusForSuccess(response);
+        Response response = get(URL_LIST_GROUP_NAMES, Map.of("userName", "admin", "realmName", "admin-realm"));
+        assertEquals(200, response.getStatus());
         final String entity = response.readEntity(String.class);
         Map responseMap = MarshallingUtils.buildMapFromDocument(entity);
-        Map extraProperties = (Map)responseMap.get("extraProperties");
-        List<String> groups = (List<String>)extraProperties.get("groups");
+        Map extraProperties = (Map) responseMap.get("extraProperties");
+        List<String> groups = (List<String>) extraProperties.get("groups");
+        assertThat(groups, containsInAnyOrder("asadmin"));
+    }
 
-        assertTrue(groups.size() > 0);
+    @Test
+    public void testListAdminUsers() {
+        Response response = get(URL_LIST_ADMIN_REALM_USERS);
+        assertEquals(200, response.getStatus());
+        final String entity = response.readEntity(String.class);
+        Map<String, ?> responseMap = MarshallingUtils.buildMapFromDocument(entity);
+        assertThat(responseMap.toString(), responseMap, aMapWithSize(5));
+        Map<String, ?> extraProperties = (Map<String, ?>) responseMap.get("extraProperties");
+        assertThat(extraProperties.toString(), extraProperties, aMapWithSize(3));
+        List<Map<String, List<String>>> users = (List<Map<String, List<String>>>) extraProperties.get("users");
+        assertThat(users, hasSize(1));
+        Map<String, ?> userAdmin = users.get(0);
+        assertThat(userAdmin, aMapWithSize(2));
+        assertThat((String) userAdmin.get("name"), equalTo("admin"));
+        assertThat((List<String>) userAdmin.get("groups"), contains("asadmin"));
     }
 
     @Test
@@ -55,30 +86,35 @@
         assertEquals("true", groups.get(0));
     }
 
-//    @Test
+
+    @Test
     public void testUserManagement() {
         final String userName = "user" + generateRandomString();
-        Map<String, String> newUser = new HashMap<String, String>() {{
-           put ("id", userName);
-           put ("AS_ADMIN_USERPASSWORD", "password");
-        }};
-
-        Response response = post(URL_CREATE_USER, newUser);
-        assertTrue(isSuccess(response));
-
-        List<String> values = getCommandResults(get(URL_LIST_FILE_USERS));
-        assertTrue(values.contains(userName));
-
-        response = delete(URL_DELETE_USER, newUser);
-        assertTrue(isSuccess(response));
-
-        values = getCommandResults(get(URL_LIST_FILE_USERS));
-        assertFalse(values.contains(userName));
+        {
+            Response response = post(URL_CREATE_USER, Map.of("id", userName, "AS_ADMIN_USERPASSWORD", "password"));
+            assertEquals(200, response.getStatus());
+        }
+        {
+            List<String> values = getCommandResults(get(URL_LIST_FILE_USERS));
+            assertThat(values, hasItem(userName));
+        }
+        {
+            Response response = delete(URL_DELETE_USER, Map.of("id", userName));
+            assertEquals(200, response.getStatus());
+        }
+        {
+            List<String> values = getCommandResults(get(URL_LIST_FILE_USERS));
+            assertThat(values, not(hasItem(userName)));
+        }
     }
 
+
     @Test
     public void testListAuthRealmClassNames() {
         List<String> classNameList = getCommandResults(get(URL_AUTH_REALM_CLASS_NAMES));
-        assertTrue(!classNameList.isEmpty());
+        assertThat(classNameList.toString(), classNameList, hasSize(6));
+        String[] realms = Stream.of(JDBCRealm.class, PamRealm.class, CertificateRealm.class, FileRealm.class,
+            LDAPRealm.class, SolarisRealm.class).map(Class::getName).toArray(String[]::new);
+        assertThat(classNameList, containsInAnyOrder(realms));
     }
 }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ClusterTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ClusterTest.java
index 7fef091..243b19a 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ClusterTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ClusterTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,20 +17,18 @@
 
 package org.glassfish.nucleus.admin.rest;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 import jakarta.ws.rs.core.Response;
-import org.glassfish.admin.rest.client.utils.MarshallingUtils;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+
+import java.util.Map;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
- *
  * @author jasonlee
  */
 public class ClusterTest extends RestTestBase {
-    public static final String URL_CLUSTER = "/domain/clusters/cluster";
 
     @Test
     public void testClusterCreationAndDeletion() {
@@ -45,90 +44,16 @@
     @Test
     public void testListLifecycleModules() {
         final String clusterName = "cluster_" + generateRandomString();
-        Map<String, String> newCluster = new HashMap<String, String>() {
-            {
-                put("id", clusterName);
-            }
-        };
-
-        Response response = post(URL_CLUSTER, newCluster);
-        checkStatusForSuccess(response);
+        Response response = post(URL_CLUSTER, Map.of("id", clusterName));
+        checkStatus(response);
 
         response = get(URL_CLUSTER + "/" + clusterName + "/list-lifecycle-modules");
-        checkStatusForSuccess(response);
+        checkStatus(response);
 
-        response = delete(URL_CLUSTER + "/" + clusterName); // + "/delete-cluster");
-        checkStatusForSuccess(response);
+        response = delete(URL_CLUSTER + "/" + clusterName);
+        checkStatus(response);
 
         response = get(URL_CLUSTER + "/" + clusterName);
-        checkStatusForFailure(response);
-
-    }
-
-    public String createCluster() {
-        final String clusterName = "cluster_" + generateRandomString();
-        createCluster(clusterName);
-
-        return clusterName;
-    }
-
-    public void createCluster(final String clusterName) {
-        Map<String, String> newCluster = new HashMap<String, String>() {
-            {
-                put("id", clusterName);
-            }
-        };
-
-        Response response = post(URL_CLUSTER, newCluster);
-        checkStatusForSuccess(response);
-    }
-
-    public void startCluster(String clusterName) {
-        Response response = post(URL_CLUSTER + "/" + clusterName + "/start-cluster");
-        checkStatusForSuccess(response);
-    }
-
-    public void stopCluster(String clusterName) {
-        Response response = post(URL_CLUSTER + "/" + clusterName + "/stop-cluster");
-        checkStatusForSuccess(response);
-    }
-
-    public void createClusterInstance(final String clusterName, final String instanceName) {
-        Response response = post("/domain/create-instance", new HashMap<String, String>() {
-            {
-                put("cluster", clusterName);
-                put("id", instanceName);
-                put("node", "localhost-domain1");
-            }
-        });
-        checkStatusForSuccess(response);
-    }
-
-    public void deleteCluster(String clusterName) {
-        Response response = get(URL_CLUSTER + "/" + clusterName + "/list-instances");
-        Map body = MarshallingUtils.buildMapFromDocument(response.readEntity(String.class));
-        Map extraProperties = (Map) body.get("extraProperties");
-        if (extraProperties != null) {
-            List<Map<String, String>> instanceList = (List<Map<String, String>>) extraProperties.get("instanceList");
-            if ((instanceList != null) && (!instanceList.isEmpty())) {
-                for (Map<String, String> instance : instanceList) {
-                    String status = instance.get("status");
-                    String instanceName = instance.get("name");
-                    if (!"NOT_RUNNING".equalsIgnoreCase(status)) {
-                        response = post("/domain/servers/server/" + instanceName + "/stop-instance");
-                        checkStatusForSuccess(response);
-                    }
-                    response = delete("/domain/servers/server/" + instanceName + "/delete-instance");
-                    checkStatusForSuccess(response);
-                }
-            }
-        }
-
-
-        response = delete(URL_CLUSTER + "/" + clusterName);// + "/delete-cluster");
-        checkStatusForSuccess(response);
-
-//        response = get(URL_CLUSTER + "/" + clusterName);
-//        checkStatusForFailure(response);
+        assertEquals(404, response.getStatus());
     }
 }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ConfigTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ConfigTest.java
index ccd5edb..945aaf3 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ConfigTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ConfigTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -19,21 +20,24 @@
 import jakarta.ws.rs.core.MultivaluedHashMap;
 import jakarta.ws.rs.core.MultivaluedMap;
 import jakarta.ws.rs.core.Response;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+
+import org.junit.jupiter.api.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
- *
  * @author jasonlee
  */
 public class ConfigTest extends RestTestBase {
 
-    public static final String BASE_CONFIGS_URL = "/domain/configs";
+    public static final String BASE_CONFIGS_URL = "domain/configs";
 
     @Test
     public void testConfigCopy() {
         String configName = "config-" + generateRandomString();
-        MultivaluedMap formData = new MultivaluedHashMap();
+        MultivaluedHashMap<String, String> formData = new MultivaluedHashMap<>();
         formData.add("id", "default-config");
         formData.add("id", configName);
         createAndVerifyConfig(configName, formData);
@@ -41,28 +45,28 @@
     }
 
     @Test
-    public void duplicateCopyShouldFail() {
-        MultivaluedMap formData = new MultivaluedHashMap();
+    public void duplicitCopyShouldFail() {
+        MultivaluedHashMap<String, String> formData = new MultivaluedHashMap<>();
         formData.add("id", "default-config");
         formData.add("id", "server-config");
-
         Response response = post(BASE_CONFIGS_URL + "/copy-config", formData);
-        assertFalse(isSuccess(response));
+        // FIXME: causes HTTP 500 without any log
+        assertThat(response.getStatus(), greaterThanOrEqualTo(400));
     }
 
-    public void createAndVerifyConfig(String configName, MultivaluedMap configData) {
+    public void createAndVerifyConfig(String configName, MultivaluedMap<String, String> configData) {
         Response response = post(BASE_CONFIGS_URL + "/copy-config", configData);
-        checkStatusForSuccess(response);
+        checkStatus(response);
 
         response = get(BASE_CONFIGS_URL + "/config/" + configName);
-        checkStatusForSuccess(response);
+        checkStatus(response);
     }
 
     public void deleteAndVerifyConfig(String configName) {
         Response response = post(BASE_CONFIGS_URL + "/config/" + configName + "/delete-config");
-        checkStatusForSuccess(response);
+        checkStatus(response);
 
         response = get(BASE_CONFIGS_URL + "/config/" + configName);
-        assertFalse(isSuccess(response));
+        assertEquals(404, response.getStatus());
     }
 }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/DomainTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/DomainTest.java
index 7e2ebbb..1b24391 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/DomainTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/DomainTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,43 +17,37 @@
 
 package org.glassfish.nucleus.admin.rest;
 
-import java.io.IOException;
+import jakarta.ws.rs.core.Response;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
-import jakarta.ws.rs.core.Response;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 public class DomainTest extends RestTestBase {
+
     @Test
-    public void testDomainGet() throws IOException {
-        Map payload = new HashMap();
+    public void testDomainGet() throws Exception {
         Map<String, String> current = getEntityValues(get("/domain"));
 
         // Select a random locale so we're not setting the locale to its current value
-        List<String> locales = new ArrayList<String>() {{
-            add("en_US");
-            add("en");
-            add("de_DE");
-            add("_GB");
-            add("en_US_WIN");
-            add("de__POSIX");
-            add("fr__MAC");
-        }};
+        List<String> locales = new ArrayList<>(List.of("en_US", "en", "de_DE", "_GB", "en_US_WIN", "de__POSIX", "fr__MAC"));
         locales.remove(current.get("locale"));
         final int random = new Random().nextInt(locales.size());
         String newLocale = locales.get(random);
 
+        Map<String, String> payload = new HashMap<>();
         payload.put("locale", newLocale);
-
-        Response response = post("/domain", payload);
-        assertTrue(isSuccess(response));
+        Response response = post("domain", payload);
+        assertEquals(200, response.getStatus());
 
         // Reload the domain and make sure our new locale was saved
-        Map<String, String> map = getEntityValues(this.get("/domain"));
+        Map<String, String> map = getEntityValues(this.get("domain"));
         assertEquals(newLocale, map.get("locale"));
     }
 }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ElementStarTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ElementStarTest.java
index b5bd9bc..780a569 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ElementStarTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ElementStarTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2011, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,56 +17,62 @@
 
 package org.glassfish.nucleus.admin.rest;
 
+import jakarta.ws.rs.core.Response;
+
 import java.net.URISyntaxException;
 import java.util.HashMap;
 import java.util.Map;
-import jakarta.ws.rs.core.Response;
-import static org.testng.AssertJUnit.*;
-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 static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * This class tests the changes to the handling of @Element("*") instances
  * @author jasonlee
  */
 public class ElementStarTest extends RestTestBase {
-    protected static final String URL_CREATE_INSTANCE = "/domain/create-instance";
+    protected static final String URL_CREATE_INSTANCE = "domain/create-instance";
 
     protected String instanceName1;
     protected String instanceName2;
 
-    @BeforeMethod
+    @BeforeEach
     public void before() {
         instanceName1 = "instance_" + generateRandomString();
         instanceName2 = "instance_" + generateRandomString();
 
         Response response = post(URL_CREATE_INSTANCE, new HashMap<String, String>() {{ put("id", instanceName1); put("node", "localhost-domain1"); }});
-        checkStatusForSuccess(response);
+        checkStatus(response);
         response = post(URL_CREATE_INSTANCE, new HashMap<String, String>() {{ put("id", instanceName2); put("node", "localhost-domain1"); }});
-        checkStatusForSuccess(response);
+        checkStatus(response);
     }
 
-    @AfterMethod
+    @AfterEach
     public void after() {
-        Response response = delete("/domain/servers/server/" + instanceName1 + "/delete-instance"); // TODO: This url should be fixed
-        checkStatusForSuccess(response);
-        response = delete("/domain/servers/server/" + instanceName2 + "/delete-instance");
-        checkStatusForSuccess(response);
+        Response response = delete("domain/servers/server/" + instanceName1 + "/delete-instance"); // FIXME: This url should be fixed
+        checkStatus(response);
+        response = delete("domain/servers/server/" + instanceName2 + "/delete-instance");
+        checkStatus(response);
     }
 
-    @Test(enabled=false)
+    @Test
+    @Disabled("Unavailable webapp")
     public void testApplications() throws URISyntaxException {
-        ApplicationTest at = getTestClass(ApplicationTest.class);
         final String app1 = "app" + generateRandomString();
         final String app2 = "app" + generateRandomString();
 
-        at.deployApp("test.war", app1, app1);
-        at.deployApp("test.war", app2, app2);
-        at.addAppRef(app1, instanceName1);
-        at.addAppRef(app2, instanceName1);
+        // FIXME: we need some example webapp
+//        deployApp("test.war", app1, app1);
+//        deployApp("test.war", app2, app2);
+        addAppRef(app1, instanceName1);
+        addAppRef(app2, instanceName1);
 
-        Response response = get("/domain/servers/server/"+instanceName1+"/application-ref");
+        Response response = get("domain/servers/server/" + instanceName1 + "/application-ref");
         Map<String, String> children = this.getChildResources(response);
         assertEquals(2, children.size());
     }
@@ -73,28 +80,29 @@
     @Test
     public void testResources() {
         // The DAS should already have two resource-refs (jdbc/__TimerPool and jdbc/__default)
-        Response response = get ("/domain/servers/server/server/resource-ref");
+        Response response = get ("domain/servers/server/server/resource-ref");
         Map<String, String> children = this.getChildResources(response);
         assertTrue(children.size() >= 2);
     }
 
-    @Test(enabled=false)
+    @Test
+    @Disabled
     public void testLoadBalancerConfigs() {
         final String lbName = "lbconfig-" + generateRandomString();
-        Response response = post ("/domain/lb-configs/lb-config/",
+        Response response = post ("domain/lb-configs/lb-config/",
                 new HashMap<String, String>() {{
                     put("id", lbName);
                     put("target", instanceName1);
                 }});
-        checkStatusForSuccess(response);
+        checkStatus(response);
 
-        response = post("/domain/lb-configs/lb-config/" + lbName + "/create-http-lb-ref",
+        response = post("domain/lb-configs/lb-config/" + lbName + "/create-http-lb-ref",
                 new HashMap<String,String>() {{
                     put ("id", instanceName2);
                 }});
-        checkStatusForSuccess(response);
+        checkStatus(response);
 
-        response = get ("/domain/lb-configs/lb-config/" + lbName + "/server-ref");
+        response = get ("domain/lb-configs/lb-config/" + lbName + "/server-ref");
         Map<String, String> children = this.getChildResources(response);
         assertTrue(!children.isEmpty());
     }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ExceptionFilterTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ExceptionFilterTest.java
deleted file mode 100644
index ef4a7e0..0000000
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ExceptionFilterTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-package org.glassfish.nucleus.admin.rest;
-
-import org.testng.annotations.Test;
-
-/**
- *
- * @author jdlee
- */
-@Test(enabled = false)
-public class ExceptionFilterTest {
-    public void testExceptionFiler() {
-        // TODO
-    }
-}
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ExternalResourceTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ExternalResourceTest.java
index 7f93ef2..50a5671 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ExternalResourceTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ExternalResourceTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,34 +17,42 @@
 
 package org.glassfish.nucleus.admin.rest;
 
+import jakarta.ws.rs.core.Response;
+
 import java.util.HashMap;
 import java.util.Map;
-import jakarta.ws.rs.core.Response;
-import org.testng.annotations.Test;
+
+import org.glassfish.resources.custom.factory.PrimitivesAndStringFactory;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
 
 /**
- *
  * @author jasonlee
  */
+@Disabled
 public class ExternalResourceTest extends RestTestBase {
-    protected static final String URL_EXTERNAL_RESOURCE = "/domain/resources/external-jndi-resource";
-    @Test(enabled=false)
+
+    protected static final String URL_EXTERNAL_RESOURCE = "domain/resources/external-jndi-resource";
+
+    @Test
     public void createAndDeleteExternalResource() {
         final String resourceName = "resource_" + generateRandomString();
-        final String jndiName = "jndi/"+resourceName;
-        Map<String, String> newResource = new HashMap<String, String>() {{
-            put("id", resourceName);
-            put("jndilookupname", jndiName);
-            put("factoryClass", "org.glassfish.resources.custom.factory.PrimitivesAndStringFactory");
-            put("restype", "java.lang.Double");
-        }};
-        Response response = post (URL_EXTERNAL_RESOURCE, newResource);
-        checkStatusForSuccess(response);
+        final String jndiName = "jndi/" + resourceName;
+        Map<String, String> newResource = new HashMap<>() {
+            {
+                put("id", resourceName);
+                put("jndilookupname", jndiName);
+                put("factoryClass", PrimitivesAndStringFactory.class.getName());
+                put("restype", Double.class.getName());
+            }
+        };
+        Response response = post(URL_EXTERNAL_RESOURCE, newResource);
+        checkStatus(response);
 
         response = get(URL_EXTERNAL_RESOURCE + "/" + resourceName);
-        checkStatusForSuccess(response);
+        checkStatus(response);
 
         response = delete(URL_EXTERNAL_RESOURCE + "/" + resourceName);
-        checkStatusForSuccess(response);
+        checkStatus(response);
     }
 }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/JdbcTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/JdbcTest.java
index 188c9a9..74a5130 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/JdbcTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/JdbcTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,51 +17,55 @@
 
 package org.glassfish.nucleus.admin.rest;
 
+import jakarta.ws.rs.core.Response;
+
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import jakarta.ws.rs.core.Response;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
 
 /**
- *
  * @author jasonlee
  */
+@Disabled
 public class JdbcTest extends RestTestBase {
-    public static final String BASE_JDBC_RESOURCE_URL = "/domain/resources/jdbc-resource";
-    public static final String BASE_JDBC_CONNECTION_POOL_URL = "/domain/resources/jdbc-connection-pool";
+    public static final String BASE_JDBC_RESOURCE_URL = "domain/resources/jdbc-resource";
+    public static final String BASE_JDBC_CONNECTION_POOL_URL = "domain/resources/jdbc-connection-pool";
 
-    @Test(enabled=false)
+    @Test
     public void testReadingPoolEntity() {
         Map<String, String> entity = getEntityValues(get(BASE_JDBC_CONNECTION_POOL_URL + "/__TimerPool"));
         assertEquals("__TimerPool", entity.get("name"));
     }
 
-    @Test(enabled=false)
+    @Test
     public void testCreateAndDeletePool() {
         String poolName = "TestPool" + generateRandomString();
-        Map<String, String> params = new HashMap<String, String>();
+        Map<String, String> params = new HashMap<>();
         params.put("name", poolName);
         params.put("datasourceClassname","org.apache.derby.jdbc.ClientDataSource");
         Response response = post(BASE_JDBC_CONNECTION_POOL_URL, params);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
 
         Map<String, String> entity = getEntityValues(get(BASE_JDBC_CONNECTION_POOL_URL + "/"+poolName));
         assertNotSame(0, entity.size());
 
         response = delete(BASE_JDBC_CONNECTION_POOL_URL+"/"+poolName, new HashMap<String, String>());
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
 
         response = get(BASE_JDBC_CONNECTION_POOL_URL + "/" + poolName);
         assertEquals(404, response.getStatus());
     }
 
-//    @Test(enabled=false)
-    // TODO: Disabled until 13348 is resolved
+    @Test
     public void testCreateResourceWithBackslash() {
         String poolName = "TestPool\\" + generateRandomString();
         String encodedPoolName = poolName;
@@ -69,44 +74,44 @@
         } catch (UnsupportedEncodingException ex) {
             Logger.getLogger(JdbcTest.class.getName()).log(Level.SEVERE, null, ex);
         }
-        Map<String, String> params = new HashMap<String, String>();
+        Map<String, String> params = new HashMap<>();
         params.put("name", poolName);
         params.put("poolName", "DerbyPool");
 
         Response response = post (BASE_JDBC_RESOURCE_URL, params);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
 
         Map<String, String> entity = getEntityValues(get(BASE_JDBC_CONNECTION_POOL_URL + "/" + encodedPoolName));
         assertNotSame(0, entity.size());
 
         response = delete("/" + encodedPoolName, new HashMap<String, String>());
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
 
         response = get(BASE_JDBC_CONNECTION_POOL_URL + "/" + encodedPoolName);
         assertEquals(404, response.getStatus());
     }
 
-    @Test(enabled=false)
+    @Test
     public void createDuplicateResource() {
         final String resourceName = "jdbc/__default";
-        Map<String, String> params = new HashMap<String, String>() {{
+        Map<String, String> params = new HashMap<>() {{
            put("id", resourceName);
            put("poolName", "DerbyPool");
         }};
 
         Response response = post (BASE_JDBC_RESOURCE_URL, params);
-        assertFalse(isSuccess(response));
+        assertEquals(404, response.getStatus());
     }
 
-    @Test(enabled=false)
+    @Test
     public void createDuplicateConnectionPool() {
         final String poolName = "DerbyPool";
-        Map<String, String> params = new HashMap<String, String>() {{
+        Map<String, String> params = new HashMap<>() {{
            put("id", poolName);
            put("datasourceClassname", "org.apache.derby.jdbc.ClientDataSource");
         }};
 
         Response response = post (BASE_JDBC_CONNECTION_POOL_URL, params);
-        assertFalse(isSuccess(response));
+        assertEquals(404, response.getStatus());
     }
 }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/JmsTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/JmsTest.java
index 0712cbc..88d085b 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/JmsTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/JmsTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,40 +17,44 @@
 
 package org.glassfish.nucleus.admin.rest;
 
+import jakarta.ws.rs.core.Response;
+
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.util.HashMap;
 import java.util.Map;
-import jakarta.ws.rs.core.Response;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
- * Created by IntelliJ IDEA.
- * User: jasonlee
- * Date: May 26, 2010
- * Time: 2:28:27 PM
- * To change this template use File | Settings | File Templates.
+ * @author jasonlee
+ * @since May 26, 2010
  */
+@Disabled
 public class JmsTest extends RestTestBase {
-    static final String URL_ADMIN_OBJECT_RESOURCE = "/domain/resources/admin-object-resource";
-    static final String URL_CONNECTOR_CONNECTION_POOL = "/domain/resources/connector-connection-pool";
-    static final String URL_CONNECTOR_RESOURCE = "/domain/resources/connector-resource";
-    static final String URL_JMS_HOST = "/domain/configs/config/server-config/jms-service/jms-host";
-    static final String URL_SEVER_JMS_DEST = "/domain/servers/server/server";
+    static final String URL_ADMIN_OBJECT_RESOURCE = "domain/resources/admin-object-resource";
+    static final String URL_CONNECTOR_CONNECTION_POOL = "domain/resources/connector-connection-pool";
+    static final String URL_CONNECTOR_RESOURCE = "domain/resources/connector-resource";
+    static final String URL_JMS_HOST = "domain/configs/config/server-config/jms-service/jms-host";
+    static final String URL_SEVER_JMS_DEST = "domain/servers/server/server";
     static final String DEST_TYPE = "topic";
 
-    @Test(enabled=false)
+    @Test
     public void testJmsConnectionFactories() {
         final String poolName = "JmsConnectionFactory" + generateRandomString();
-        Map<String, String> ccp_attrs = new HashMap<String, String>() {
+        Map<String, String> ccp_attrs = new HashMap<>() {
             {
                 put("name", poolName);
                 put("connectiondefinition", "jakarta.jms.ConnectionFactory");
                 put("raname", "jmsra");
             }
         };
-        Map<String, String> cr_attrs = new HashMap<String, String>() {
+        Map<String, String> cr_attrs = new HashMap<>() {
             {
                 put("id", poolName);
                 put("poolname", poolName);
@@ -58,7 +63,7 @@
 
         // Create connection pool
         Response response = post(URL_CONNECTOR_CONNECTION_POOL, ccp_attrs);
-        checkStatusForSuccess(response);
+        checkStatus(response);
 
         // Check connection pool creation
         Map<String, String> pool = getEntityValues(get(URL_CONNECTOR_CONNECTION_POOL + "/" + poolName));
@@ -66,7 +71,7 @@
 
         // Create connector resource
         response = post(URL_CONNECTOR_RESOURCE, cr_attrs);
-        checkStatusForSuccess(response);
+        checkStatus(response);
 
         // Check connector resource
         Map<String, String> resource = getEntityValues(get(URL_CONNECTOR_RESOURCE + "/" + poolName));
@@ -78,7 +83,7 @@
                 put("description", poolName);
             }
         });
-        checkStatusForSuccess(response);
+        checkStatus(response);
 
         pool = getEntityValues(get(URL_CONNECTOR_CONNECTION_POOL + "/" + poolName));
         assertTrue(pool.get("description").equals(poolName));
@@ -89,7 +94,7 @@
                 put("description", poolName);
             }
         });
-        checkStatusForSuccess(response);
+        checkStatus(response);
 
         resource = getEntityValues(get(URL_CONNECTOR_RESOURCE + "/" + poolName));
         assertTrue(pool.get("description").equals(poolName));
@@ -100,10 +105,10 @@
                 put("cascade", "true");
             }
         });
-        checkStatusForSuccess(response);
+        checkStatus(response);
     }
 
-    @Test(enabled=false)
+    @Test
     public void testJmsDestinationResources() {
         final String jndiName = "jndi/" + generateRandomString();
         String encodedJndiName = jndiName;
@@ -112,7 +117,7 @@
         } catch (UnsupportedEncodingException e) {
         }
 
-        Map<String, String> attrs = new HashMap<String, String>() {
+        Map<String, String> attrs = new HashMap<>() {
             {
                 put("id", jndiName);
                 put("raname", "jmsra");
@@ -121,16 +126,16 @@
         };
 
         Response response = post(URL_ADMIN_OBJECT_RESOURCE, attrs);
-        checkStatusForSuccess(response);
+        checkStatus(response);
 
         Map<String, String> entity = getEntityValues(get(URL_ADMIN_OBJECT_RESOURCE + "/" + encodedJndiName));
         assertFalse(entity.isEmpty());
 
         response = delete(URL_ADMIN_OBJECT_RESOURCE + "/" + encodedJndiName);
-        checkStatusForSuccess(response);
+        checkStatus(response);
     }
 
-    @Test(enabled=false)
+    @Test
     public void testJmsPhysicalDestination() {
         final String destName = "jmsDest" + generateRandomString();
         final int maxNumMsgs = generateRandomNumber(500);
@@ -138,13 +143,13 @@
 
         createJmsPhysicalDestination(destName, DEST_TYPE, URL_SEVER_JMS_DEST);
 
-        final HashMap<String, String> newDest = new HashMap<String, String>() {
+        final HashMap<String, String> newDest = new HashMap<>() {
             {
                 put("id", destName);
                 put("desttype", DEST_TYPE);
             }
         };
-        Map<String, String> destProps = new HashMap<String, String>() {
+        Map<String, String> destProps = new HashMap<>() {
             {
                 putAll(newDest);
                 put("property", "MaxNumMsgs=" + maxNumMsgs + ":ConsumerFlowLimit=" + consumerFlowLimit);
@@ -152,12 +157,12 @@
         };
 
         Response response = get(URL_SEVER_JMS_DEST + "/__get-jmsdest", newDest);
-        checkStatusForSuccess(response);
+        checkStatus(response);
 
         response = post(URL_SEVER_JMS_DEST + "/__update-jmsdest", destProps);
-        checkStatusForSuccess(response);
+        checkStatus(response);
         response = get(URL_SEVER_JMS_DEST + "/__get-jmsdest", newDest);
-        checkStatusForSuccess(response);
+        checkStatus(response);
         Map<String, String> entity = this.getEntityValues(response);
         assertEquals(maxNumMsgs, entity.get("MaxNumMsgs"));
         assertEquals(consumerFlowLimit, entity.get("ConsumerFlowLimit"));
@@ -165,7 +170,7 @@
         deleteJmsPhysicalDestination(destName, URL_SEVER_JMS_DEST);
     }
 
-    @Test(enabled=false)
+    @Test
     public void testJmsPhysicalDestionationsWithClusters() {
         final String destName = "jmsDest" + generateRandomString();
         ClusterTest ct = getTestClass(ClusterTest.class);
@@ -176,7 +181,7 @@
         try {
 
             createJmsPhysicalDestination(destName, "topic", endpoint);
-            final HashMap<String, String> newDest = new HashMap<String, String>() {
+            final HashMap<String, String> newDest = new HashMap<>() {
                 {
                     put("id", destName);
                     put("desttype", DEST_TYPE);
@@ -184,10 +189,10 @@
             };
 
             Response response = get(endpoint + "/__get-jmsdest", newDest);
-            checkStatusForSuccess(response);
+            checkStatus(response);
 
             response = get(URL_SEVER_JMS_DEST + "/__get-jmsdest", newDest);
-            checkStatusForFailure(response);
+            checkStatus(response);
         }
         finally {
             deleteJmsPhysicalDestination(destName, endpoint);
@@ -196,15 +201,15 @@
         }
     }
 
-    @Test(enabled=false)
+    @Test
     public void testJmsPing() {
         String results = get(URL_SEVER_JMS_DEST + "/jms-ping").readEntity(String.class);
         assertTrue(results.contains("JMS-ping command executed successfully"));
     }
 
-    @Test(enabled=false)
+    @Test
     public void testJmsFlush() {
-        Map<String, String> payload = new HashMap<String, String>() {
+        Map<String, String> payload = new HashMap<>() {
             {
                 put("id", "mq.sys.dmq");
                 put("destType", "queue");
@@ -212,13 +217,13 @@
         };
 
         Response response = post(URL_SEVER_JMS_DEST + "/flush-jmsdest", payload);
-        checkStatusForSuccess(response);
+        checkStatus(response);
     }
 
-    @Test(enabled=false)
+    @Test
     public void testJmsHosts() {
         final String jmsHostName = "jmshost" + generateRandomString();
-        Map<String, String> newHost = new HashMap<String, String>() {
+        Map<String, String> newHost = new HashMap<>() {
             {
                 put("id", jmsHostName);
                 put("adminPassword", "admin");
@@ -230,7 +235,7 @@
 
         // Test create
         Response response = post(URL_JMS_HOST, newHost);
-        checkStatusForSuccess(response);
+        checkStatus(response);
 
         // Test edit
         Map<String, String> entity = getEntityValues(get(URL_JMS_HOST + "/" + jmsHostName));
@@ -238,17 +243,17 @@
         assertEquals(jmsHostName, entity.get("name"));
         entity.put("port", "8686");
         response = post(URL_JMS_HOST + "/" + jmsHostName, entity);
-        checkStatusForSuccess(response);
+        checkStatus(response);
         entity = getEntityValues(get(URL_JMS_HOST + "/" + jmsHostName));
         assertEquals("8686", entity.get("port"));
 
         // Test delete
         response = delete(URL_JMS_HOST + "/" + jmsHostName);
-        checkStatusForSuccess(response);
+        checkStatus(response);
     }
 
     public void createJmsPhysicalDestination(final String destName, final String type, String endpoint) {
-        final Map<String, String> newDest = new HashMap<String, String>() {
+        final Map<String, String> newDest = new HashMap<>() {
             {
                 put("id", destName);
                 put("desttype", type);
@@ -258,11 +263,11 @@
         // Test Create
         Response response = post(endpoint + "/create-jmsdest", newDest);
         // This command returns 200 instead of 201, for some reason.  Odd.
-        checkStatusForSuccess(response);
+        checkStatus(response);
     }
 
     public void deleteJmsPhysicalDestination(final String destName, String endpoint) {
-        final HashMap<String, String> newDest = new HashMap<String, String>() {
+        final HashMap<String, String> newDest = new HashMap<>() {
             {
                 put("id", destName);
                 put("desttype", DEST_TYPE);
@@ -271,7 +276,7 @@
 
         // Test deletion
         Response response = delete(endpoint + "/delete-jmsdest", newDest); // You POST to commands
-        checkStatusForSuccess(response);
+        checkStatus(response);
 
         response = get(endpoint + "__get-jmsdest", newDest);
         assertFalse(response.getStatus() == 200);
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/JobsResourceTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/JobsResourceTest.java
index 249a2fe..122aa0e 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/JobsResourceTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/JobsResourceTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,37 +17,42 @@
 
 package org.glassfish.nucleus.admin.rest;
 
-import java.util.Locale;
 import jakarta.ws.rs.core.Response;
+
+import java.util.Locale;
+
 import org.codehaus.jettison.json.JSONArray;
 import org.codehaus.jettison.json.JSONException;
 import org.codehaus.jettison.json.JSONObject;
 import org.glassfish.admin.rest.Constants;
 import org.glassfish.admin.rest.composite.CompositeUtil;
 import org.glassfish.admin.rest.resources.composite.Job;
-import static org.glassfish.tests.utils.NucleusTestUtils.nadminWithOutput;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadminWithOutput;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
- *
  * @author jdlee
  */
-@Test(testName="JobsResourceTest")
 public class JobsResourceTest extends RestTestBase {
-    public static final String URL_JOBS = "/jobs";
+    public static final String URL_JOBS = "jobs";
 
+    @Test
     public void testJobsListing() {
-        assertTrue(isSuccess(get(URL_JOBS)));
+        assertEquals(200, get(URL_JOBS).getStatus());
     }
 
+    @Test
     public void testGetJob() throws JSONException {
         // make sure we have at least one job
         issueDetachedCommand();
 
         // verify getting the collection
         Response response = get(URL_JOBS);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
 
         // verify the overall structure
         JSONObject json = response.readEntity(JSONObject.class);
@@ -71,7 +77,7 @@
         // verify the job it refers to by following the link.
         // it should only have a parent link
         response = get(uri);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
         json = response.readEntity(JSONObject.class);
         JSONObject item = json.getJSONObject("item");
         verifyItem(jobId, item);
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/JvmOptionsTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/JvmOptionsTest.java
index 95fb0ae..542149c 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/JvmOptionsTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/JvmOptionsTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,40 +17,47 @@
 
 package org.glassfish.nucleus.admin.rest;
 
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 import jakarta.ws.rs.core.MultivaluedHashMap;
 import jakarta.ws.rs.core.MultivaluedMap;
 import jakarta.ws.rs.core.Response;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import org.glassfish.admin.rest.client.utils.MarshallingUtils;
-import static org.testng.AssertJUnit.*;
-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 static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.hamcrest.Matchers.hasSize;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
- *
  * @author jasonlee
  */
 public class JvmOptionsTest extends RestTestBase {
-    protected static final String URL_SERVER_JVM_OPTIONS = "/domain/configs/config/server-config/java-config/jvm-options";
-    protected static final String URL_DEFAULT_JVM_OPTIONS = "/domain/configs/config/default-config/java-config/jvm-options";
+    private static final String URL_SERVER_JVM_OPTIONS = "domain/configs/config/server-config/java-config/jvm-options";
+    private static final String URL_DEFAULT_JVM_OPTIONS = "domain/configs/config/default-config/java-config/jvm-options";
 
-    protected static final String URL_SERVER_CONFIG_CREATE_PROFILER = "/domain/configs/config/server-config/java-config/create-profiler";
-    protected static final String URL_SERVER_CONFIG_DELETE_PROFILER = "/domain/configs/config/server-config/java-config/profiler/delete-profiler";
-    protected static final String URL_SERVER_CONFIG_PROFILER_JVM_OPTIONS = "/domain/configs/config/server-config/java-config/profiler/jvm-options";
+    private static final String URL_SERVER_CONFIG_CREATE_PROFILER = "domain/configs/config/server-config/java-config/create-profiler";
+    private static final String URL_SERVER_CONFIG_DELETE_PROFILER = "domain/configs/config/server-config/java-config/profiler/delete-profiler";
+    private static final String URL_SERVER_CONFIG_PROFILER_JVM_OPTIONS = "/domain/configs/config/server-config/java-config/profiler/jvm-options";
 
-    protected static final String URL_DEFAULT_CONFIG_CREATE_PROFILER = "/domain/configs/config/default-config/java-config/create-profiler";
-    protected static final String URL_DEFAULT_CONFIG_DELETE_PROFILER = "/domain/configs/config/default-config/java-config/profiler/delete-profiler";
-    protected static final String URL_DEFAULT_CONFIG_PROFILER_JVM_OPTIONS = "/domain/configs/config/default-config/java-config/profiler/jvm-options";
+    private static final String URL_DEFAULT_CONFIG_CREATE_PROFILER = "domain/configs/config/default-config/java-config/create-profiler";
+    private static final String URL_DEFAULT_CONFIG_DELETE_PROFILER = "domain/configs/config/default-config/java-config/profiler/delete-profiler";
+    private static final String URL_DEFAULT_CONFIG_PROFILER_JVM_OPTIONS = "domain/configs/config/default-config/java-config/profiler/jvm-options";
 
     private ConfigTest configTest;
     private String testConfigName;
     private String URL_TEST_CONFIG;
     private String URL_TEST_CONFIG_JVM_OPTIONS;
 
-    @BeforeMethod
+    @BeforeEach
     public void createConfig() {
         if (configTest == null) {
             configTest = getTestClass(ConfigTest.class);
@@ -62,11 +70,11 @@
         }};
         configTest.createAndVerifyConfig(testConfigName, formData);
 
-        URL_TEST_CONFIG = "/domain/configs/config/" + testConfigName;
+        URL_TEST_CONFIG = "domain/configs/config/" + testConfigName;
         URL_TEST_CONFIG_JVM_OPTIONS = URL_TEST_CONFIG + "/java-config/jvm-options";
     }
 
-    @AfterMethod
+    @AfterEach
     public void deleteConfig() {
         configTest.deleteAndVerifyConfig(testConfigName);
     }
@@ -75,27 +83,27 @@
     @Test
     public void getJvmOptions() {
         Response response = get(URL_SERVER_JVM_OPTIONS);
-        assertTrue(isSuccess(response));
-        Map<String, Object> responseMap = MarshallingUtils.buildMapFromDocument(response.readEntity(String.class));
+        assertEquals(200, response.getStatus());
+        Map<String, ?> responseMap = MarshallingUtils.buildMapFromDocument(response.readEntity(String.class));
         List<String> jvmOptions = (List<String>)((Map)responseMap.get("extraProperties")).get("leafList");
-        assertTrue(jvmOptions.size() > 0);
+        assertThat(jvmOptions, hasSize(greaterThan(10)));
     }
 
     @Test
     public void createAndDeleteOptions() {
         final String option1Name = "-Doption" + generateRandomString();
-        Map<String, String> newOptions = new HashMap<String, String>() {{
+        Map<String, String> newOptions = new HashMap<>() {{
             put(option1Name, "someValue");
         }};
 
         Response response = post(URL_TEST_CONFIG_JVM_OPTIONS, newOptions);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
         response = get(URL_TEST_CONFIG_JVM_OPTIONS);
         List<String> jvmOptions = getJvmOptions(response);
         assertTrue(jvmOptions.contains(option1Name+"=someValue"));
 
         response = delete(URL_TEST_CONFIG_JVM_OPTIONS, newOptions);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
         response = get(URL_TEST_CONFIG_JVM_OPTIONS);
         jvmOptions = getJvmOptions(response);
         assertFalse(jvmOptions.contains(option1Name+"=someValue"));
@@ -106,18 +114,18 @@
     public void createAndDeleteOptionsWithBackslashes() {
         final String optionName = "-Dfile" + generateRandomString();
         final String optionValue = "C:\\ABC\\DEF\\";
-        Map<String, String> newOptions = new HashMap<String, String>() {{
+        Map<String, String> newOptions = new HashMap<>() {{
             put(optionName, escape(optionValue));
         }};
 
         Response response = post(URL_TEST_CONFIG_JVM_OPTIONS, newOptions);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
         response = get(URL_TEST_CONFIG_JVM_OPTIONS);
         List<String> jvmOptions = getJvmOptions(response);
         assertTrue(jvmOptions.contains(optionName+"="+optionValue));
 
         response = delete(URL_TEST_CONFIG_JVM_OPTIONS, newOptions);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
         response = get(URL_TEST_CONFIG_JVM_OPTIONS);
         jvmOptions = getJvmOptions(response);
         assertFalse(jvmOptions.contains(optionName+"="+optionValue));
@@ -127,13 +135,13 @@
     public void createAndDeleteOptionsWithoutValues() {
         final String option1Name = "-Doption" + generateRandomString();
         final String option2Name = "-Doption" + generateRandomString();
-        Map<String, String> newOptions = new HashMap<String, String>() {{
+        Map<String, String> newOptions = new HashMap<>() {{
             put(option1Name, "");
             put(option2Name, "");
         }};
 
         Response response = post(URL_TEST_CONFIG_JVM_OPTIONS, newOptions);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
         response = get(URL_TEST_CONFIG_JVM_OPTIONS);
         List<String> jvmOptions = getJvmOptions(response);
         assertTrue(jvmOptions.contains(option1Name));
@@ -142,7 +150,7 @@
         assertFalse(jvmOptions.contains(option2Name+"="));
 
         response = delete(URL_TEST_CONFIG_JVM_OPTIONS, newOptions);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
         response = get(URL_TEST_CONFIG_JVM_OPTIONS);
         jvmOptions = getJvmOptions(response);
         assertFalse(jvmOptions.contains(option1Name));
@@ -153,14 +161,14 @@
     public void testIsolatedOptionsCreationOnNewConfig() {
         final String optionName = "-Doption" + generateRandomString();
 
-        Map<String, String> newOptions = new HashMap<String, String>() {{
+        Map<String, String> newOptions = new HashMap<>() {{
             put(optionName, "");
             put("target", testConfigName);
         }};
 
         // Test new config to make sure option is there
         Response response = post(URL_TEST_CONFIG_JVM_OPTIONS, newOptions);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
         response = get(URL_TEST_CONFIG_JVM_OPTIONS);
         List<String> jvmOptions = getJvmOptions(response);
         assertTrue(jvmOptions.contains(optionName));
@@ -175,11 +183,11 @@
     public void testProfilerJvmOptions() {
         final String profilerName = "profiler" + generateRandomString();
         final String optionName = "-Doption" + generateRandomString();
-        Map<String, String> attrs = new HashMap<String, String>() {{
+        Map<String, String> attrs = new HashMap<>() {{
             put("name", profilerName);
             put("target", testConfigName);
         }};
-        Map<String, String> newOptions = new HashMap<String, String>() {{
+        Map<String, String> newOptions = new HashMap<>() {{
 //            put("target", testConfigName);
 //            put("profiler", "true");
             put(optionName, "");
@@ -188,10 +196,10 @@
         deleteProfiler(URL_TEST_CONFIG + "/java-config/profiler/delete-profiler", testConfigName, false);
 
         Response response = post(URL_TEST_CONFIG + "/java-config/create-profiler", attrs);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
 
         response = post(URL_TEST_CONFIG + "/java-config/profiler/jvm-options", newOptions);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
 
         response = get(URL_TEST_CONFIG + "/java-config/profiler/jvm-options");
         List<String> jvmOptions = getJvmOptions(response);
@@ -204,39 +212,38 @@
     public void testJvmOptionWithColon() {
         final String optionName = "-XX:MaxPermSize";
         final String optionValue = "152m";
-        Map<String, String> newOptions = new HashMap<String, String>() {{
+        Map<String, String> newOptions = new HashMap<>() {{
             put(escape(optionName), optionValue);
         }};
 
         Response response = post(URL_TEST_CONFIG_JVM_OPTIONS, newOptions);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
         response = get(URL_TEST_CONFIG_JVM_OPTIONS);
-//        assertTrue(isSuccess(response));
+//        assertEquals(200, response.getStatus());
         List<String> jvmOptions = getJvmOptions(response);
         assertTrue(jvmOptions.contains(optionName+"="+optionValue));
 
         response = delete(URL_TEST_CONFIG_JVM_OPTIONS, newOptions);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
         response = get(URL_TEST_CONFIG_JVM_OPTIONS);
         jvmOptions = getJvmOptions(response);
         assertFalse(jvmOptions.contains(optionName+"="+optionValue));
     }
 
-    protected void deleteProfiler(final String url, final String target, final boolean failOnError) {
-        Response response = delete (url, new HashMap() {{ put ("target", target); }});
+    private void deleteProfiler(final String url, final String target, final boolean failOnError) {
+        Response response = delete(url, Map.of("target", target));
         if (failOnError) {
-            assertTrue(isSuccess(response));
+            assertEquals(200, response.getStatus());
         }
     }
 
-    protected List<String> getJvmOptions(Response response) {
-        Map<String, Object> responseMap = MarshallingUtils.buildMapFromDocument(response.readEntity(String.class));
+    private List<String> getJvmOptions(Response response) {
+        Map<String, ?> responseMap = MarshallingUtils.buildMapFromDocument(response.readEntity(String.class));
         List<String> jvmOptions = (List<String>)((Map)responseMap.get("extraProperties")).get("leafList");
-
         return jvmOptions;
     }
 
-    protected String escape(String part) {
+    private String escape(String part) {
         String changed = part
                 .replace("\\", "\\\\")
                 .replace(":", "\\:");
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/MetadataTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/MetadataTest.java
index 2e11a93..24afd79 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/MetadataTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/MetadataTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,24 +17,28 @@
 
 package org.glassfish.nucleus.admin.rest;
 
-import java.util.Map;
 import jakarta.ws.rs.core.Response;
+
+import java.util.Map;
+
 import org.glassfish.admin.rest.client.utils.MarshallingUtils;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
- *
  * @author jasonlee
  */
 public class MetadataTest extends RestTestBase {
-    protected static final String URL_CONFIG = "/domain/configs/config.json";
-    protected static final String URL_UPTIMECOMMAND = "/domain/uptime.json";
+    private static final String URL_CONFIG = "domain/configs/config.json";
+    private static final String URL_UPTIMECOMMAND = "domain/uptime.json";
 
     @Test
     public void configParameterTest() {
         Response response = options(URL_CONFIG);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
         // Really dumb test.  Should be good enough for now
 
         Map extraProperties = MarshallingUtils.buildMapFromDocument(response.readEntity(String.class));
@@ -47,7 +52,7 @@
     @Test
     public void UpTimeMetadaDataTest() {
         Response response = options(URL_UPTIMECOMMAND);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
 
         Map extraProperties = MarshallingUtils.buildMapFromDocument(response.readEntity(String.class));
         assertNotNull(extraProperties);
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/MonitoringTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/MonitoringTest.java
index 5a5f98b..42a40a9 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/MonitoringTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/MonitoringTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2011, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -17,17 +18,23 @@
 package org.glassfish.nucleus.admin.rest;
 
 
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Response.Status;
+
 import java.util.HashMap;
 import java.util.Map;
-import jakarta.ws.rs.core.Response;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
 
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
- *
  * @author Mitesh Meswani
  */
+@Disabled
 public class MonitoringTest extends RestTestBase {
     private static final String MONITORING_RESOURCE_URL = "/domain/configs/config/server-config/monitoring-service/module-monitoring-levels";
     private static final String JDBC_CONNECTION_POOL_URL = "/domain/resources/jdbc-connection-pool";
@@ -39,11 +46,11 @@
         return CONTEXT_ROOT_MONITORING;
     }
 
-    @Test(enabled=false)
+    @Test
     public void initializeMonitoring() {
         // Enable monitoring
         String url = getManagementURL(MONITORING_RESOURCE_URL);
-        Map<String, String> payLoad = new HashMap<String, String>() {
+        Map<String, String> payLoad = new HashMap<>() {
             {
                 put("ThreadPool", "HIGH");
                 put("Orb", "HIGH");
@@ -64,16 +71,16 @@
             }
         };
         Response response = post(url, payLoad);
-        checkStatusForSuccess(response);
+        assertEquals(200, response.getStatus());
     }
 
     /**
      * Objective - Verify that basic monitoring is working
      * Strategy - Call /monitoring/domain and assert that "server" is present as child element
      */
-    @Test(enabled=false)
+    @Test
     public void testBaseURL() {
-        Map<String, String> entity = getChildResources(get("/domain")); // monitoring/domain
+        Map<String, String> entity = getChildResources(get("domain")); // monitoring/domain
         assertNotNull(entity.get("server"));
     }
 
@@ -81,7 +88,7 @@
      * Objective - Verify that resources with dot work
      * Strategy - create a resource with "." in name and then try to access it
      */
-    @Test(enabled=false)
+    @Test
     public void testDot() {
         // Step 1- Create a resource with "."
         final String POOL_NAME = "poolNameWith.dot";
@@ -91,7 +98,7 @@
         delete(url);
 
         url = getManagementURL(JDBC_CONNECTION_POOL_URL);
-        Map<String, String> payLoad = new HashMap<String, String>() {
+        Map<String, String> payLoad = new HashMap<>() {
             {
                 put("name", POOL_NAME);
                 put("resType", "javax.sql.DataSource");
@@ -99,7 +106,7 @@
             }
         };
         Response response = post(url, payLoad);
-        checkStatusForSuccess(response);
+        assertEquals(200, response.getStatus());
 
 
         // Step 2- Ping the connection pool to generate some monitoring data
@@ -109,25 +116,25 @@
         get(url, payLoad);
 
        // Step 3 - Access monitoring tree to assert it is accessible
-        response = get("/domain/server/resources/"+ POOL_NAME);
-        checkStatusForSuccess(response);
+        response = get("domain/server/resources/"+ POOL_NAME);
+        assertEquals(200, response.getStatus());
         Map<String, String> responseEntity = getEntityValues(response);
-        assertTrue("No Monitoring data found for pool " + POOL_NAME, responseEntity.size() > 0 );
+        assertTrue(responseEntity.size() > 0, "No Monitoring data found for pool " + POOL_NAME);
     }
 
     /**
      * Objective - Verify that invalid resources returns 404
      * Strategy - Request an invalid resource under monitoring and ensure that 404 is returned
      */
-    @Test(enabled=false)
+    @Test
     public void testInvalidResource() {
-        Response response = get("/domain/server/foo");
-        assertTrue("Did not receive ", response.getStatus() == jakarta.ws.rs.core.Response.Status.NOT_FOUND.getStatusCode() ) ;
+        Response response = get("domain/server/foo");
+        assertEquals(Status.NOT_FOUND.getStatusCode(), response.getStatus(), "Did not receive ");
     }
 
 
     private String getManagementURL(String targetResourceURL) {
-        return getBaseUrl() + CONTEXT_ROOT_MANAGEMENT + targetResourceURL;
+        return getBaseAdminUrl() + CONTEXT_ROOT_MANAGEMENT + targetResourceURL;
 
     }
 
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/NetworkListenerTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/NetworkListenerTest.java
index 25721ce..d51c7d9 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/NetworkListenerTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/NetworkListenerTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,22 +17,28 @@
 
 package org.glassfish.nucleus.admin.rest;
 
+import jakarta.ws.rs.core.Response;
+
 import java.util.HashMap;
 import java.util.Map;
-import jakarta.ws.rs.core.Response;
+
 import org.codehaus.jettison.json.JSONObject;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  *
  * @author jasonlee
  */
 public class NetworkListenerTest extends RestTestBase {
-    protected static final String URL_PROTOCOL = "/domain/configs/config/server-config/network-config/protocols/protocol";
-    protected static final String URL_SSL = "/domain/configs/config/server-config/network-config/protocols/protocol/http-listener-2/ssl";
+    protected static final String URL_PROTOCOL = "domain/configs/config/server-config/network-config/protocols/protocol";
+    protected static final String URL_SSL = "domain/configs/config/server-config/network-config/protocols/protocol/http-listener-2/ssl";
 
-    @Test(enabled=false)
+    @Test
+    @Disabled
     public void createHttpListener() {
         final String redirectProtocolName = "http-redirect"; //protocol_" + generateRandomString();
         final String portUniProtocolName = "pu-protocol"; //protocol_" + generateRandomString();
@@ -41,21 +48,21 @@
         final String finderName2 = "http-redirect"; //finder" + generateRandomString();
 
         try {
-            Response response = post("/domain/set", new HashMap<String, String>() {{
+            Response response = post("domain/set", new HashMap<String, String>() {{
                 put("configs.config.server-config.network-config.network-listeners.network-listener.http-listener-1.protocol", "http-listener-1");
             }});
-            checkStatusForSuccess(response);
+            assertEquals(200, response.getStatus());
             delete(URL_PROTOCOL + "/" + portUniProtocolName);
-            checkStatusForSuccess(response);
+            assertEquals(200, response.getStatus());
             delete(URL_PROTOCOL + "/" + redirectProtocolName);
-            checkStatusForSuccess(response);
+            assertEquals(200, response.getStatus());
 // asadmin commands taken from: http://www.antwerkz.com/port-unification-in-glassfish-3-part-1/
 //        asadmin create-protocol --securityenabled=false http-redirect
 //        asadmin create-protocol --securityenabled=false pu-protocol
             response = post(URL_PROTOCOL, new HashMap<String, String>() {{ put ("securityenabled", "false"); put("id", redirectProtocolName); }});
-            checkStatusForSuccess(response);
+            assertEquals(200, response.getStatus());
             response = post(URL_PROTOCOL, new HashMap<String, String>() {{ put ("securityenabled", "false"); put("id", portUniProtocolName); }});
-            checkStatusForSuccess(response);
+            assertEquals(200, response.getStatus());
 
 //        asadmin create-protocol-filter --protocol http-redirect --classname org.glassfish.grizzly.config.portunif.HttpRedirectFilter redirect-filter
             response = post (URL_PROTOCOL + "/" + redirectProtocolName + "/create-protocol-filter",
@@ -64,7 +71,7 @@
                     put ("protocol", redirectProtocolName);
                     put ("classname", "org.glassfish.grizzly.config.portunif.HttpRedirectFilter");
                 }});
-            checkStatusForSuccess(response);
+            assertEquals(200, response.getStatus());
 
 //        asadmin create-protocol-finder --protocol pu-protocol --targetprotocol http-listener-2 --classname org.glassfish.grizzly.config.portunif.HttpProtocolFinder http-finder
 //        asadmin create-protocol-finder --protocol pu-protocol --targetprotocol http-redirect   --classname org.glassfish.grizzly.config.portunif.HttpProtocolFinder http-redirect
@@ -75,7 +82,7 @@
                     put ("targetprotocol", "http-listener-2");
                     put ("classname", "org.glassfish.grizzly.config.portunif.HttpProtocolFinder");
                 }});
-            checkStatusForSuccess(response);
+            assertEquals(200, response.getStatus());
             response = post (URL_PROTOCOL + "/" + portUniProtocolName + "/create-protocol-finder",
                 new HashMap<String, String>() {{
                     put ("id", finderName2);
@@ -83,14 +90,14 @@
                     put ("targetprotocol", redirectProtocolName);
                     put ("classname", "org.glassfish.grizzly.config.portunif.HttpProtocolFinder");
                 }});
-            checkStatusForSuccess(response);
+            assertEquals(200, response.getStatus());
 
 
 //        asadmin set configs.config.server-config.network-config.network-listeners.network-listener.http-listener-1.protocol=pu-protocol
             response = post("/domain/configs/config/server-config/network-config/network-listeners/network-listener/http-listener-1", new HashMap<String, String>() {{
                 put("protocol", portUniProtocolName);
             }});
-            checkStatusForSuccess(response);
+            assertEquals(200, response.getStatus());
 
             response = get("/domain/configs/config/server-config/network-config/network-listeners/network-listener/http-listener-1/find-http-protocol");
             assertTrue(response.readEntity(String.class).contains("http-listener-2"));
@@ -99,33 +106,33 @@
             Response response = post("/domain/configs/config/server-config/network-config/network-listeners/network-listener/http-listener-1", new HashMap<String, String>() {{
                 put("protocol", "http-listener-1");
             }});
-            checkStatusForSuccess(response);
+            assertEquals(200, response.getStatus());
             response = delete(URL_PROTOCOL + "/" + portUniProtocolName + "/delete-protocol-finder",
                 new HashMap<String, String>() {{
                     put("protocol", portUniProtocolName);
                     put("id", finderName1);
                 }} );
-            checkStatusForSuccess(response);
+            assertEquals(200, response.getStatus());
             response = delete(URL_PROTOCOL + "/" + portUniProtocolName + "/delete-protocol-finder",
                 new HashMap<String, String>() {{
                     put("protocol", portUniProtocolName);
                     put("id", finderName2);
                 }} );
-            checkStatusForSuccess(response);
+            assertEquals(200, response.getStatus());
             response = delete(URL_PROTOCOL + "/" + redirectProtocolName + "/protocol-chain-instance-handler/protocol-chain/protocol-filter/" + redirectFilterName,
                     new HashMap<String, String>() {{ put("protocol", redirectProtocolName); }} );
-            checkStatusForSuccess(response);
+            assertEquals(200, response.getStatus());
             response = delete(URL_PROTOCOL + "/" + portUniProtocolName);
-            checkStatusForSuccess(response);
+            assertEquals(200, response.getStatus());
             response = delete(URL_PROTOCOL + "/" + redirectProtocolName);
-            checkStatusForSuccess(response);
+            assertEquals(200, response.getStatus());
         }
 
     }
 
     @Test
     public void testClearingProperties() {
-        Map<String, String> params = new HashMap<String, String>() {{
+        Map<String, String> params = new HashMap<>() {{
             put("keyStore", "foo");
             put("trustAlgorithm", "bar");
             put("trustMaxCertLength", "15");
@@ -133,7 +140,7 @@
         }};
 
         Response response = post(URL_SSL, params);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
         response = get(URL_SSL, params);
         Map<String, String> entity = this.getEntityValues(response);
         assertEquals(params.get("keyStore"), entity.get("keyStore"));
@@ -145,7 +152,7 @@
         params.put("trustAlgorithm", "");
         params.put("trustStore", "");
         response = post(URL_SSL, params);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
         response = get(URL_SSL, params);
         entity = this.getEntityValues(response);
         assertEquals(JSONObject.NULL, entity.get("keyStore"));
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/NoCLICommandResourceCreationTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/NoCLICommandResourceCreationTest.java
index e33e87a..6aa002a 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/NoCLICommandResourceCreationTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/NoCLICommandResourceCreationTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,20 +17,24 @@
 
 package org.glassfish.nucleus.admin.rest;
 
-import java.util.HashMap;
-import java.util.Map;
 import jakarta.ws.rs.client.Entity;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
+
+import java.util.HashMap;
+import java.util.Map;
+
 import org.glassfish.admin.rest.client.utils.MarshallingUtils;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * @author Mitesh Meswani
  */
 public class NoCLICommandResourceCreationTest extends RestTestBase {
-    private static final String URL_SERVER_PROPERTY = "/domain/servers/server/server/property";
+    private static final String URL_SERVER_PROPERTY = "domain/servers/server/server/property";
 
     @Test
     public void testPropertyCreation() {
@@ -37,18 +42,18 @@
         String propertyValue = generateRandomString();
 
         //Create a property
-        Map<String, String> param = new HashMap<String, String>();
+        Map<String, String> param = new HashMap<>();
         param.put("name", propertyKey);
         param.put("value",propertyValue);
         Response response = getClient().target(getAddress(URL_SERVER_PROPERTY))
                 .request(RESPONSE_TYPE)
                 .post(Entity.entity(MarshallingUtils.getXmlForProperties(param), MediaType.APPLICATION_XML), Response.class);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
 
         //Verify the property got created
         String propertyURL = URL_SERVER_PROPERTY + "/" + propertyKey;
         response = get (propertyURL);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
         Map<String, String> entity = getEntityValues(response);
         assertTrue(entity.get("name").equals(propertyKey));
         assertTrue(entity.get("value").equals(propertyValue));
@@ -59,16 +64,16 @@
         response = getClient().target(getAddress(URL_SERVER_PROPERTY))
                 .request(RESPONSE_TYPE)
                 .put(Entity.entity(MarshallingUtils.getXmlForProperties(param), MediaType.APPLICATION_XML), Response.class);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
         response = get (propertyURL);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
         entity = getEntityValues(response);
         assertTrue(entity.get("name").equals(propertyKey));
         assertTrue(entity.get("value").equals(propertyValue));
 
         //Clean up to leave domain.xml good for next run
         response = delete(propertyURL, new HashMap<String, String>());
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
 }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/PartialUpdateTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/PartialUpdateTest.java
index f6f277f..1759439 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/PartialUpdateTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/PartialUpdateTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -18,21 +19,24 @@
 
 import java.util.HashMap;
 import java.util.Map;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
- *
  * @author jasonlee
  */
 public class PartialUpdateTest extends RestTestBase {
-    @Test(enabled=false)
+    @Test
+    @Disabled
     // TODO: rework this to use something nucleus-friendly
     public void testPartialUpdate() {
         final String endpoint = JdbcTest.BASE_JDBC_CONNECTION_POOL_URL + "/DerbyPool";
         final String newDesc = generateRandomString();
         Map<String, String> origAttrs = getEntityValues(get(endpoint));
-        Map<String, String> newAttrs = new HashMap<String, String>() {{
+        Map<String, String> newAttrs = new HashMap<>() {{
             put ("description", newDesc);
         }};
         post(endpoint, newAttrs);
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/PropertiesBagTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/PropertiesBagTest.java
index 1d6a001..9555897 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/PropertiesBagTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/PropertiesBagTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,35 +17,43 @@
 
 package org.glassfish.nucleus.admin.rest;
 
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
+
 import org.codehaus.jettison.json.JSONArray;
 import org.glassfish.admin.rest.client.utils.MarshallingUtils;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+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;
 
 /**
- *
  * @author jasonlee
  */
 public class PropertiesBagTest extends RestTestBase {
 
-    protected static final String PROP_DOMAIN_NAME = "administrative.domain.name";
-    protected static final String URL_DOMAIN_PROPERTIES = "/domain/property";
-    protected static final String URL_JAVA_CONFIG_PROPERTIES = "/domain/configs/config/default-config/java-config/property";
-    protected static final String URL_SERVER_PROPERTIES = "/domain/servers/server/server/property";
-    protected static final String URL_DERBYPOOL_PROPERTIES = "/domain/resources/jdbc-connection-pool/DerbyPool/property";
+    private static final String PROP_DOMAIN_NAME = "administrative.domain.name";
+    private static final String URL_DOMAIN_PROPERTIES = "domain/property";
+    private static final String URL_JAVA_CONFIG_PROPERTIES = "domain/configs/config/default-config/java-config/property";
+    private static final String URL_SERVER_PROPERTIES = "domain/servers/server/server/property";
+    private static final String URL_DERBYPOOL_PROPERTIES = "domain/resources/jdbc-connection-pool/DerbyPool/property";
     private static final String REQUEST_FORMAT = MediaType.APPLICATION_JSON;
 
     @Test
     public void propertyRetrieval() {
         Response response = get(URL_DOMAIN_PROPERTIES);
-        checkStatusForSuccess(response);
+        assertEquals(200, response.getStatus());
         List<Map<String, String>> properties = getProperties(response);
         assertTrue(isPropertyFound(properties, PROP_DOMAIN_NAME));
     }
@@ -59,9 +68,10 @@
         createAndDeleteProperties(URL_SERVER_PROPERTIES);
     }
 
-    @Test(enabled=false)
+    @Test
+    @Disabled
     public void propsWithEmptyValues() {
-        List<Map<String, String>> properties = new ArrayList<Map<String, String>>();
+        List<Map<String, String>> properties = new ArrayList<>();
         final String empty = "empty" + generateRandomNumber();
         final String foo = "foo" + generateRandomNumber();
         final String bar = "bar" + generateRandomNumber();
@@ -88,10 +98,11 @@
         assertFalse(isPropertyFound(newProperties, bar));
     }
 
-    @Test(enabled=false)
+    @Test
+    @Disabled
     public void testOptimizedPropertyHandling() {
         // First, test changing one property and adding a new
-        List<Map<String, String>> properties = new ArrayList<Map<String, String>>();
+        List<Map<String, String>> properties = new ArrayList<>();
         properties.add(createProperty("PortNumber","1527"));
         properties.add(createProperty("Password","APP"));
         properties.add(createProperty("User","APP"));
@@ -146,11 +157,12 @@
         }
     }
 
-    // the prop name can not contain .
+    // FIXME: the prop name can not contain .
     // need to remove the . test when http://java.net/jira/browse/GLASSFISH-15418  is fixed
-//    @Test
+    @Test
+    @Disabled
     public void testPropertiesWithDots() {
-        List<Map<String, String>> properties = new ArrayList<Map<String, String>>();
+        List<Map<String, String>> properties = new ArrayList<>();
         final String prop = "some.property.with.dots." + generateRandomNumber();
         final String description = "This is the description";
         final String value = generateRandomString();
@@ -170,9 +182,10 @@
     // saved. This test will create the jmsra config with a set of properties,
     // then update only one the object's properties, which should be a very quick,
     // inexpensive operation.
-    @Test(enabled=false)
+    @Test
+    @Disabled
     public void testJmsRaCreateAndUpdate() {
-        List<Map<String, String>> props = new ArrayList<Map<String, String>>(){{
+        List<Map<String, String>> props = new ArrayList<>(){{
            add(createProperty("AddressListBehavior", "random"));
            add(createProperty("AddressListIterations", "3"));
            add(createProperty("AdminPassword", "admin"));
@@ -190,20 +203,20 @@
            add(createProperty("startRMIRegistry", "false"));
         }};
         final String propertyList = buildPropertyList(props);
-        Map<String, String> attrs = new HashMap<String, String>() {{
+        Map<String, String> attrs = new HashMap<>() {{
             put("objecttype","user");
             put("id","jmsra");
             put("threadPoolIds","thread-pool-1");
             put("property", propertyList);
         }};
 
-        final String URL = "/domain/resources/resource-adapter-config";
+        final String URL = "domain/resources/resource-adapter-config";
         delete(URL+"/jmsra");
         Response response = post(URL, attrs);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
 
         // Change one property value (AddressListIterations) and update the object
-        props = new ArrayList<Map<String, String>>(){{
+        props = new ArrayList<>(){{
            add(createProperty("AddressListBehavior", "random"));
            add(createProperty("AddressListIterations", "4"));
            add(createProperty("AdminPassword", "admin"));
@@ -225,8 +238,8 @@
         delete(URL+"/jmsra");
     }
 
-    //Disable this test for now. The functionality this tests is not available in nucleus
-    //@Test
+    @Disabled("Disable this test for now. The functionality this tests is not available in nucleus")
+    @Test
     public void test20810() {
         Map<String, String> payload = new HashMap<>();
         payload.put("persistenceScope","session");
@@ -237,22 +250,22 @@
         payload.put("persistenceStoreHealthCheckEnabled","false");
         payload.put("ssoFailoverEnabled","false");
 
-        final String wcaUri = "/domain/configs/config/default-config/availability-service/web-container-availability";
+        final String wcaUri = "domain/configs/config/default-config/availability-service/web-container-availability";
         Response r = post(wcaUri, payload);
-        assertTrue(isSuccess(r));
+        checkStatus(r);
 
-        assertTrue(isSuccess(get(wcaUri)));
+        checkStatus(get(wcaUri));
 
         r = getClient()
-                .target(getAddress("/domain/configs/config/default-config/availability-service/web-container-availability/property")).
+                .target(getAddress("domain/configs/config/default-config/availability-service/web-container-availability/property")).
                 request(getResponseType())
                 .post(Entity.json(new JSONArray()), Response.class);
-        assertTrue(isSuccess(r));
+        checkStatus(r);
 
-        assertTrue(isSuccess(get(wcaUri)));
+        checkStatus(get(wcaUri));
     }
 
-    protected String buildPropertyList(List<Map<String, String>> props) {
+    private String buildPropertyList(List<Map<String, String>> props) {
         StringBuilder sb = new StringBuilder();
         String sep = "";
         for (Map<String, String> prop : props) {
@@ -263,12 +276,12 @@
         return sb.toString();
     }
 
-    protected void createAndDeleteProperties(String endpoint) {
+    private void createAndDeleteProperties(String endpoint) {
         Response response = get(endpoint);
-        checkStatusForSuccess(response);
+        assertEquals(200, response.getStatus());
         assertNotNull(getProperties(response));
 
-        List<Map<String, String>> properties = new ArrayList<Map<String, String>>();
+        List<Map<String, String>> properties = new ArrayList<>();
 
         for(int i = 0, max = generateRandomNumber(16); i < max; i++) {
             properties.add(createProperty("property_" + generateRandomString(), generateRandomString(), generateRandomString()));
@@ -276,15 +289,15 @@
 
         createProperties(endpoint, properties);
         response = delete(endpoint);
-        checkStatusForSuccess(response);
+        assertEquals(200, response.getStatus());
     }
 
-    protected Map<String, String> createProperty(final String name, final String value) {
+    private Map<String, String> createProperty(final String name, final String value) {
         return createProperty(name, value, null);
     }
 
-    protected Map<String, String> createProperty(final String name, final String value, final String description) {
-        return new HashMap<String, String>() {{
+    private Map<String, String> createProperty(final String name, final String value, final String description) {
+        return new HashMap<>() {{
                 put ("name", name);
                 put ("value", value);
                 if (description != null) {
@@ -293,14 +306,14 @@
             }};
     }
 
-    protected void createProperties(String endpoint, List<Map<String, String>> properties) {
+    private void createProperties(String endpoint, List<Map<String, String>> properties) {
         final String payload = buildPayload(properties);
         Response response = getClient().target(getAddress(endpoint))
             .request(RESPONSE_TYPE)
             .post(Entity.entity(payload, REQUEST_FORMAT), Response.class);
-        checkStatusForSuccess(response);
+        assertEquals(200, response.getStatus());
         response = get(endpoint);
-        checkStatusForSuccess(response);
+        assertEquals(200, response.getStatus());
 
         // Retrieve the properties and make sure they were created.
 //        List<Map<String, String>> newProperties = getProperties(response);
@@ -311,21 +324,21 @@
     }
 
     // Restore and verify the default domain properties
-    protected void restoreDomainProperties() {
-        final HashMap<String, String> domainProps = new HashMap<String, String>() {{
+    private void restoreDomainProperties() {
+        final HashMap<String, String> domainProps = new HashMap<>() {{
             put("name", PROP_DOMAIN_NAME);
             put("value", "domain1");
         }};
         Response response = getClient().target(getAddress(URL_DOMAIN_PROPERTIES))
                 .request(RESPONSE_TYPE)
                 .put(Entity.entity(buildPayload(new ArrayList<Map<String, String>>() {{ add(domainProps); }}), REQUEST_FORMAT), Response.class);
-        checkStatusForSuccess(response);
+        assertEquals(200, response.getStatus());
         response = get(URL_DOMAIN_PROPERTIES);
-        checkStatusForSuccess(response);
+        assertEquals(200, response.getStatus());
         assertTrue(isPropertyFound(getProperties(response), PROP_DOMAIN_NAME));
     }
 
-    protected String buildPayload(List<Map<String, String>> properties) {
+    private String buildPayload(List<Map<String, String>> properties) {
         if (RESPONSE_TYPE.equals(MediaType.APPLICATION_XML)) {
             return MarshallingUtils.getXmlForProperties(properties);
         } else {
@@ -333,11 +346,11 @@
         }
     }
 
-    protected boolean isPropertyFound(List<Map<String, String>> properties, String name) {
+    private boolean isPropertyFound(List<Map<String, String>> properties, String name) {
         return getProperty(properties, name) != null;
     }
 
-    protected Map<String, String> getProperty(List<Map<String, String>> properties, String name) {
+    private Map<String, String> getProperty(List<Map<String, String>> properties, String name) {
         Map<String, String> retval = null;
         for (Map<String,String> property : properties) {
             if (name.equals(property.get("name"))) {
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ProvidersTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ProvidersTest.java
index 4c48b52..c5b219f 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ProvidersTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ProvidersTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -17,20 +18,21 @@
 package org.glassfish.nucleus.admin.rest;
 
 import jakarta.ws.rs.core.Response;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
- *
  * @author jasonlee
  */
 public class ProvidersTest extends RestTestBase {
-    private static final String URL_ACTION_REPORT_RESULT = "/domain/uptime";
-    private static final String URL_COMMAND_RESOURCE_GET_RESULT = "/domain/stop";
-    private static final String URL_GET_RESULT = "/domain";
-    private static final String URL_GET_RESULT_LIST = "/domain/servers/server";
-    private static final String URL_OPTIONS_RESULT = "/domain";
-    private static final String URL_STRING_LIST_RESULT = "/domain/configs/config/server-config/java-config/jvm-options";
+    private static final String URL_ACTION_REPORT_RESULT = "domain/uptime";
+    private static final String URL_COMMAND_RESOURCE_GET_RESULT = "domain/stop";
+    private static final String URL_GET_RESULT = "domain";
+    private static final String URL_GET_RESULT_LIST = "domain/servers/server";
+    private static final String URL_OPTIONS_RESULT = "domain";
+    private static final String URL_STRING_LIST_RESULT = "domain/configs/config/server-config/java-config/jvm-options";
     private static String URL_TREE_NODE;
 
     public ProvidersTest() {
@@ -40,120 +42,120 @@
     @Test
     public void testActionReportResultHtmlProvider() {
         Response response = get(URL_ACTION_REPORT_RESULT + ".html");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testActionReportResultXmlProvider() {
         Response response = get(URL_ACTION_REPORT_RESULT + ".xml");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testActionReportResultJsonProvider() {
         Response response = get(URL_ACTION_REPORT_RESULT + ".json");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testCommandResourceGetResultHtmlProvider() {
         Response response = get(URL_COMMAND_RESOURCE_GET_RESULT + ".html");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testCommandResourceGetResultXmlProvider() {
         Response response = get(URL_COMMAND_RESOURCE_GET_RESULT + ".xml");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testCommandResourceGetResultJsonProvider() {
         Response response = get(URL_COMMAND_RESOURCE_GET_RESULT + ".json");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testGetResultHtmlProvider() {
         Response response = get(URL_GET_RESULT + ".html");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testGetResultXmlProvider() {
         Response response = get(URL_GET_RESULT + ".xml");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testGetResultJsonProvider() {
         Response response = get(URL_GET_RESULT + ".json");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testGetResultListHtmlProvider() {
         Response response = get(URL_GET_RESULT_LIST + ".html");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testGetResultListXmlProvider() {
         Response response = get(URL_GET_RESULT_LIST + ".xml");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testGetResultListJsonProvider() {
         Response response = get(URL_GET_RESULT_LIST + ".json");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testOptionsResultXmlProvider() {
         Response response = options(URL_OPTIONS_RESULT + ".xml");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testOptionsResultJsonProvider() {
         Response response = options(URL_OPTIONS_RESULT + ".json");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testStringListResultHtmlProvider() {
         Response response = get(URL_STRING_LIST_RESULT + ".html");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testStringListResultXmlProvider() {
         Response response = get(URL_STRING_LIST_RESULT + ".xml");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testStringListResultJsonProvider() {
         Response response = get(URL_STRING_LIST_RESULT + ".json");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testTreeNodeHtmlProvider() {
         Response response = get(URL_TREE_NODE + ".html");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testTreeNodeXmlProvider() {
         Response response = get(URL_TREE_NODE + ".xml");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testTreeNodeJsonProvider() {
         Response response = get(URL_TREE_NODE + ".json");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ResourceRefTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ResourceRefTest.java
index ca924dc..826f071 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ResourceRefTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ResourceRefTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,67 +17,71 @@
 
 package org.glassfish.nucleus.admin.rest;
 
+import jakarta.ws.rs.core.Response;
+
 import java.util.HashMap;
 import java.util.Map;
-import jakarta.ws.rs.core.Response;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
- *
  * @author jasonlee
  */
 public class ResourceRefTest extends RestTestBase {
-    private static final String URL_CREATE_INSTANCE = "/domain/create-instance";
-    private static final String URL_JDBC_RESOURCE = "/domain/resources/jdbc-resource";
-    private static final String URL_RESOURCE_REF = "/domain/servers/server/server/resource-ref";
+    private static final String URL_CREATE_INSTANCE = "domain/create-instance";
+    private static final String URL_JDBC_RESOURCE = "domain/resources/jdbc-resource";
+    private static final String URL_RESOURCE_REF = "domain/servers/server/server/resource-ref";
 
-    @Test(enabled=false)
+    @Test
+    @Disabled
     public void testCreatingResourceRef() {
         final String instanceName = "instance_" + generateRandomString();
         final String jdbcResourceName = "jdbc_" + generateRandomString();
-        Map<String, String> newInstance = new HashMap<String, String>() {{
+        Map<String, String> newInstance = new HashMap<>() {{
             put("id", instanceName);
             put("node", "localhost-domain1");
         }};
-        Map<String, String> jdbcResource = new HashMap<String, String>() {{
+        Map<String, String> jdbcResource = new HashMap<>() {{
             put("id", jdbcResourceName);
             put("connectionpoolid", "DerbyPool");
             put("target", instanceName);
         }};
-        Map<String, String> resourceRef = new HashMap<String, String>() {{
+        Map<String, String> resourceRef = new HashMap<>() {{
             put("id", jdbcResourceName);
             put("target", "server");
         }};
 
         try {
             Response response = post(URL_CREATE_INSTANCE, newInstance);
-            assertTrue(isSuccess(response));
+            assertEquals(200, response.getStatus());
 
             response = post(URL_JDBC_RESOURCE, jdbcResource);
-            assertTrue(isSuccess(response));
+            assertEquals(200, response.getStatus());
 
             response = post(URL_RESOURCE_REF, resourceRef);
-            assertTrue(isSuccess(response));
+            assertEquals(200, response.getStatus());
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
-            Response response = delete("/domain/servers/server/" + instanceName + "/resource-ref/" + jdbcResourceName, new HashMap<String, String>() {{
+            Response response = delete("domain/servers/server/" + instanceName + "/resource-ref/" + jdbcResourceName, new HashMap<String, String>() {{
                 put("target", instanceName);
             }});
-            assertTrue(isSuccess(response));
-            response = get("/domain/servers/server/" + instanceName + "/resource-ref/" + jdbcResourceName);
-            assertFalse(isSuccess(response));
+            assertEquals(200, response.getStatus());
+            response = get("domain/servers/server/" + instanceName + "/resource-ref/" + jdbcResourceName);
+            assertEquals(404, response.getStatus());
 
             response = delete(URL_JDBC_RESOURCE + "/" + jdbcResourceName);
-            assertTrue(isSuccess(response));
+            assertEquals(200, response.getStatus());
             response = get(URL_JDBC_RESOURCE + "/" + jdbcResourceName);
-            assertFalse(isSuccess(response));
+            assertEquals(404, response.getStatus());
 
-            response = delete("/domain/servers/server/" + instanceName + "/delete-instance");
-            assertTrue(isSuccess(response));
-            response = get("/domain/servers/server/" + instanceName);
-            assertFalse(isSuccess(response));
+            response = delete("domain/servers/server/" + instanceName + "/delete-instance");
+            assertEquals(200, response.getStatus());
+            response = get("domain/servers/server/" + instanceName);
+            assertEquals(404, response.getStatus());
         }
     }
 }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/RestTestBase.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/RestTestBase.java
index 5d79268..44a54e5 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/RestTestBase.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/RestTestBase.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,20 +17,6 @@
 
 package org.glassfish.nucleus.admin.rest;
 
-import java.io.BufferedWriter;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.PrintWriter;
-import java.math.BigInteger;
-import java.security.SecureRandom;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import java.util.logging.Level;
-import java.util.logging.Logger;
 import jakarta.ws.rs.client.Client;
 import jakarta.ws.rs.client.Entity;
 import jakarta.ws.rs.client.WebTarget;
@@ -37,112 +24,193 @@
 import jakarta.ws.rs.core.MultivaluedHashMap;
 import jakarta.ws.rs.core.MultivaluedMap;
 import jakarta.ws.rs.core.Response;
+
+import java.io.BufferedWriter;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.PrintWriter;
+import java.math.BigInteger;
+import java.nio.file.Path;
+import java.security.SecureRandom;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Random;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
+
 import org.glassfish.admin.rest.client.ClientWrapper;
 import org.glassfish.admin.rest.client.utils.MarshallingUtils;
-
-import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
 import org.glassfish.jersey.logging.LoggingFeature;
+import org.glassfish.jersey.logging.LoggingFeature.Verbosity;
 import org.glassfish.jersey.media.multipart.FormDataMultiPart;
 import org.glassfish.jersey.media.multipart.file.FileDataBodyPart;
-import static org.testng.AssertJUnit.*;
+import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
+import org.glassfish.nucleus.test.tool.NucleusTestUtils;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.w3c.dom.Document;
 
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.ADMIN_PASSWORD;
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.ADMIN_USER;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
+import static org.hamcrest.Matchers.lessThan;
+import static org.junit.jupiter.api.Assertions.assertAll;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+@ExtendWith(DomainLifecycleExtension.class)
 public class RestTestBase {
-    protected static String baseUrl = "http://localhost:4848";
-    protected static final String RESPONSE_TYPE = MediaType.APPLICATION_JSON;//APPLICATION_XML;
-    protected static final String AUTH_USER_NAME = "dummyuser";
-    protected static final String AUTH_PASSWORD = "dummypass";
-    protected static final String CONTEXT_ROOT_MANAGEMENT = "/management";
-    private static final HttpAuthenticationFeature basicAuthFilter = HttpAuthenticationFeature.basic(AUTH_USER_NAME, AUTH_PASSWORD);
-    protected static String adminHost;
-    protected static String adminPort;
-    protected static String adminUser;
-    protected static String adminPass;
-    protected static String instancePort;
+    protected static final String RESPONSE_TYPE = MediaType.APPLICATION_JSON;
 
-    private static String currentTestClass = "";
-    protected Client client;
+    protected static final String CONTEXT_ROOT_MANAGEMENT = "management";
+    protected static final String URL_CLUSTER = "domain/clusters/cluster";
+    protected static final String URL_APPLICATION_DEPLOY = "domain/applications/application";
+    protected static final String URL_CREATE_INSTANCE = "domain/create-instance";
 
-//    @BeforeClass
+    private static String adminHost;
+    private static String adminPort;
+    private static String instancePort;
+    private static String baseAdminUrl;
+    private static String baseInstanceUrl;
+
+    private static String currentTestClass;
+    private Client client;
+
+    @BeforeAll
     public static void initialize() {
         adminPort = getParameter("admin.port", "4848");
         instancePort = getParameter("instance.port", "8080");
         adminHost = getParameter("instance.host", "localhost");
-        adminUser = getParameter("user.name", "admin");
-        adminPass = getParameter("user.pass", "");
-        baseUrl = "http://" + adminHost + ':' + adminPort + '/';
+        baseAdminUrl = "http://" + adminHost + ':' + adminPort + '/';
+        baseInstanceUrl = "http://" + adminHost + ':' + instancePort + '/';
 
         final RestTestBase rtb = new RestTestBase();
-        rtb.get("/domain/rotate-log");
+        rtb.get("domain/rotate-log");
     }
 
-//    @AfterClass
+    @AfterAll
     public static void captureLog() {
         try {
-
-            if (!currentTestClass.isEmpty()) {
+            if (currentTestClass != null) {
                 RestTestBase rtb = new RestTestBase();
-                Client client = new ClientWrapper(new HashMap<String, String>(), adminUser, adminPass);
-                Response cr = client.target(rtb.getAddress("/domain/view-log")).
-                        request().
-                        get(Response.class);
-
-                PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("target/surefire-reports/" + currentTestClass + "-server.log")));
-                out.write(cr.readEntity(String.class));
-                out.close();
+                Client client = new ClientWrapper(new HashMap<String, String>(), ADMIN_USER, ADMIN_PASSWORD);
+                Response response = client.target(rtb.getAddress("domain/view-log")).request().get(Response.class);
+                File directory = NucleusTestUtils.BASEDIR.toPath().resolve(Path.of("target", "surefire-reports")).toFile();
+                directory.mkdirs();
+                File output = new File(directory, currentTestClass + "-server.log");
+                try (PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(output)))) {
+                    out.write(response.readEntity(String.class));
+                }
             }
         } catch (Exception ex) {
-            Logger.getLogger(RestTestBase.class.getName()).
-                    log(Level.INFO, null, ex);
+            Logger.getLogger(RestTestBase.class.getName()).log(Level.SEVERE, null, ex);
         }
     }
 
-    protected static String getBaseUrl() {
-        return baseUrl;
-    }
-
-    protected String getContextRoot() {
-        return CONTEXT_ROOT_MANAGEMENT;
-    }
-
-//    @BeforeMethod(alwaysRun = true)
+    @BeforeEach
     public void setup() {
         currentTestClass = this.getClass().getName();
     }
 
-    protected String getAddress(String address) {
-        if (address.startsWith("http://")) {
-            return address;
+    @AfterEach
+    protected void resetClient() {
+        if (client == null) {
+            return;
         }
-
-        return baseUrl + getContextRoot() + address;
+        client.close();
+        client = null;
     }
 
-//    @BeforeMethod
-    protected Client getClient() {
-        if (client == null) {
-            client = new ClientWrapper(new HashMap<String, String>(), adminUser, adminPass);
-            if (Boolean.parseBoolean(System.getProperty("DEBUG"))) {
-                client.register(LoggingFeature.class);
+
+    public String createCluster() {
+        final String clusterName = "cluster_" + generateRandomString();
+        createCluster(clusterName);
+        return clusterName;
+    }
+
+    public void createCluster(final String clusterName) {
+        Map<String, String> newCluster = Map.of("id", clusterName);
+        Response response = post(URL_CLUSTER, newCluster);
+        checkStatus(response);
+    }
+
+    public void startCluster(String clusterName) {
+        Response response = post(URL_CLUSTER + "/" + clusterName + "/start-cluster");
+        checkStatus(response);
+    }
+
+    public void stopCluster(String clusterName) {
+        Response response = post(URL_CLUSTER + "/" + clusterName + "/stop-cluster");
+        checkStatus(response);
+    }
+
+    public void createClusterInstance(final String clusterName, final String instanceName) {
+        Response response = post("domain/create-instance",
+            Map.of("cluster", clusterName, "id", instanceName, "node", "localhost-domain1"));
+        checkStatus(response);
+    }
+
+    public void deleteCluster(String clusterName) {
+        Response response = get(URL_CLUSTER + "/" + clusterName + "/list-instances");
+        Map body = MarshallingUtils.buildMapFromDocument(response.readEntity(String.class));
+        Map extraProperties = (Map) body.get("extraProperties");
+        if (extraProperties != null) {
+            List<Map<String, String>> instanceList = (List<Map<String, String>>) extraProperties.get("instanceList");
+            if (instanceList != null && !instanceList.isEmpty()) {
+                for (Map<String, String> instance : instanceList) {
+                    String status = instance.get("status");
+                    String instanceName = instance.get("name");
+                    if (!"NOT_RUNNING".equalsIgnoreCase(status)) {
+                        response = post("domain/servers/server/" + instanceName + "/stop-instance");
+                        checkStatus(response);
+                    }
+                    response = delete("domain/servers/server/" + instanceName + "/delete-instance");
+                    checkStatus(response);
+                }
             }
         }
-        return client;
+        response = delete(URL_CLUSTER + "/" + clusterName);
+        assertEquals(200, response.getStatus());
+        response = get(URL_CLUSTER + "/" + clusterName);
+        assertEquals(404, response.getStatus());
     }
 
-    protected void resetClient() {
-        client = null;
-        getClient();
+    public Map<String, String> deployApp (final File archive, final String contextRoot, final String name) {
+        Map<String, Object> app = Map.of(
+            "id", archive,
+            "contextroot", contextRoot,
+            "name", name
+        );
+        Response response = postWithUpload(URL_APPLICATION_DEPLOY, app);
+        checkStatus(response);
+        return getEntityValues(get(URL_APPLICATION_DEPLOY + "/" + app.get("name")));
     }
 
-    protected void authenticate() {
-        getClient().register(basicAuthFilter);
+    public void addAppRef(final String applicationName, final String targetName){
+        Response cr = post("domain/servers/server/" + targetName + "/application-ref",
+            Map.of("id", applicationName, "target", targetName));
+        checkStatus(cr);
+    }
+
+    public Response undeployApp(String appName) {
+        Response response = delete(URL_APPLICATION_DEPLOY + "/" + appName);
+        checkStatus(response);
+        return response;
     }
 
     protected <T> T getTestClass(Class<T> clazz) {
         try {
-            T test = clazz.newInstance();
+            T test = clazz.getDeclaredConstructor().newInstance();
             ((RestTestBase) test).setup();
             return test;
         } catch (Exception ex) {
@@ -166,31 +234,47 @@
         return Math.abs(r.nextInt(max - 1)) + 1;
     }
 
-    protected boolean isSuccess(Response response) {
-        int status = response.getStatus();
-        return ((status >= 200) && (status <= 299));
-    }
-
-    protected void checkStatusForSuccess(Response cr) {
-        int status = cr.getStatus();
-        if (!isSuccess(cr)) {
-            String message = getErrorMessage(cr);
-            fail("Expected a status between 200 and 299 (inclusive).  Found " + status
-                    + ((message != null) ? ":  " + message : ""));
-        }
-    }
-
-    protected void checkStatusForFailure(Response cr) {
-        int status = cr.getStatus();
-        if (isSuccess(cr)) {
-            fail("Expected a status less than 200 or greater than 299 (inclusive).  Found " + status);
-        }
+    protected void checkStatus(Response response) {
+        assertAll("response status",
+            () -> assertThat(response.getStatus(), greaterThanOrEqualTo(200)),
+            () -> assertThat(response.getStatus(), lessThan(300))
+        );
     }
 
     protected String getResponseType() {
         return RESPONSE_TYPE;
     }
 
+
+    protected static String getBaseAdminUrl() {
+        return baseAdminUrl;
+    }
+
+    protected static String getBaseInstanceUrl() {
+        return baseInstanceUrl;
+    }
+
+
+    protected String getContextRoot() {
+        return CONTEXT_ROOT_MANAGEMENT;
+    }
+
+    protected String getAddress(String address) {
+        if (address.startsWith("http://")) {
+            return address;
+        }
+
+        return baseAdminUrl + getContextRoot() + '/' + address;
+    }
+
+    protected Client getClient() {
+        if (client == null) {
+            client = new ClientWrapper(new HashMap<String, String>(), ADMIN_USER, ADMIN_PASSWORD);
+            client.register(LoggingFeature.builder().withLogger(Logger.getLogger("CLIENT")).level(Level.FINE).verbosity(Verbosity.PAYLOAD_TEXT).separator("\n").build());
+        }
+        return client;
+    }
+
     protected Response get(String address) {
         return get(address, new HashMap<String, String>());
     }
@@ -211,9 +295,13 @@
     }
 
     protected Response post(String address, Map<String, String> payload) {
+        return post(address, buildMultivaluedMap(payload));
+    }
+
+    protected Response post(String address, MultivaluedMap<String, String> payload) {
         return getClient().target(getAddress(address)).
-                request(getResponseType()).
-                post(Entity.entity(buildMultivaluedMap(payload), MediaType.APPLICATION_FORM_URLENCODED), Response.class);
+            request(getResponseType()).
+            post(Entity.entity(payload, MediaType.APPLICATION_FORM_URLENCODED), Response.class);
     }
 
     protected Response post(String address) {
@@ -258,8 +346,7 @@
         for (Map.Entry<String, String> entry : payload.entrySet()) {
             target = target.queryParam(entry.getKey(), entry.getValue());
         }
-        return target.request(getResponseType())
-                .delete(Response.class);
+        return target.request(getResponseType()).delete(Response.class);
     }
 
     /**
@@ -270,7 +357,7 @@
      * @return
      */
     protected Map<String, String> getEntityValues(Response response) {
-        Map<String, String> map = new HashMap<String, String>();
+        Map<String, String> map = new HashMap<>();
 
         String xml = response.readEntity(String.class);
         Map responseMap = MarshallingUtils.buildMapFromDocument(xml);
@@ -284,7 +371,7 @@
 
     protected List<String> getCommandResults(Response response) {
         String document = response.readEntity(String.class);
-        List<String> results = new ArrayList<String>();
+        List<String> results = new ArrayList<>();
         Map map = MarshallingUtils.buildMapFromDocument(document);
         String message = (String) map.get("message");
         if (message != null && !"".equals(message)) {
@@ -309,10 +396,10 @@
         Map responseMap = MarshallingUtils.buildMapFromDocument(response.readEntity(String.class));
         Map<String, Map> extraProperties = (Map<String, Map>) responseMap.get("extraProperties");
         if (extraProperties != null) {
-            return (Map<String, String>) extraProperties.get("childResources");
+            return extraProperties.get("childResources");
         }
 
-        return new HashMap<String, String>();
+        return new HashMap<>();
     }
 
     public Document getDocument(String input) {
@@ -330,18 +417,15 @@
         Map responseMap = MarshallingUtils.buildMapFromDocument(response.readEntity(String.class));
         Map extraProperties = (Map) responseMap.get("extraProperties");
         if (extraProperties != null) {
-            return (List) extraProperties.get("properties");
+            return (List<Map<String, String>>) extraProperties.get("properties");
         }
-        return new ArrayList<Map<String, String>>();
+        return new ArrayList<>();
     }
 
-    private MultivaluedMap buildMultivaluedMap(Map<String, String> payload) {
-        if (payload instanceof MultivaluedMap) {
-            return (MultivaluedMap) payload;
-        }
-        MultivaluedMap formData = new MultivaluedHashMap();
+    private MultivaluedMap<String, String> buildMultivaluedMap(Map<String, String> payload) {
+        MultivaluedMap<String, String> formData = new MultivaluedHashMap<>();
         if (payload != null) {
-            for (final Map.Entry<String, String> entry : payload.entrySet()) {
+            for (final Entry<String, String> entry : payload.entrySet()) {
                 formData.add(entry.getKey(), entry.getValue());
             }
         }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/SystemPropertiesTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/SystemPropertiesTest.java
index 66d8380..f29a0c2 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/SystemPropertiesTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/SystemPropertiesTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,30 +17,33 @@
 
 package org.glassfish.nucleus.admin.rest;
 
+import jakarta.ws.rs.core.Response;
+
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import jakarta.ws.rs.core.Response;
+
 import org.glassfish.admin.rest.client.utils.MarshallingUtils;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 /**
- *
  * @author jasonlee
  */
 public class SystemPropertiesTest extends RestTestBase {
-    public static final String URL_CONFIG_SYSTEM_PROPERTIES = "/domain/configs/config/%config%/system-properties";
-    public static final String URL_CLUSTER_SYSTEM_PROPERTIES = "/domain/clusters/cluster/%clusterName%/system-properties";
-    public static final String URL_INSTANCE_SYSTEM_PROPERTIES = "/domain/servers/server/%instanceName%/system-properties";
+    public static final String URL_CONFIG_SYSTEM_PROPERTIES = "domain/configs/config/%config%/system-properties";
+    public static final String URL_CLUSTER_SYSTEM_PROPERTIES = "domain/clusters/cluster/%clusterName%/system-properties";
+    public static final String URL_INSTANCE_SYSTEM_PROPERTIES = "domain/servers/server/%instanceName%/system-properties";
     public static final String URL_DAS_SYSTEM_PROPERTIES = URL_INSTANCE_SYSTEM_PROPERTIES.replaceAll("%instanceName%", "server");
-    public static final String URL_CREATE_INSTANCE = "/domain/create-instance";
+    public static final String URL_CREATE_INSTANCE = "domain/create-instance";
     public static final String PROP_VALUE = "${com.sun.aas.instanceRoot}/foo";
 
     @Test
     public void getSystemProperties() {
         Response response = get(URL_DAS_SYSTEM_PROPERTIES);
-        checkStatusForSuccess(response);
+        assertEquals(200, response.getStatus());
         List<Map<String, String>> systemProperties = getSystemProperties(MarshallingUtils.buildMapFromDocument(response.readEntity(String.class)));
         assertNotNull(systemProperties); // This may or may not be empty, depending on whether or not other tests failed
     }
@@ -48,19 +52,19 @@
     public void createSystemProperties() {
         final String prop1 = "property" + generateRandomString();
         final String prop2 = "property" + generateRandomString();
-        Map<String, String> payload = new HashMap<String, String>() {{
+        Map<String, String> payload = new HashMap<>() {{
             put(prop1, "value1");
             put(prop2, "value2");
         }};
         Response response = post(URL_DAS_SYSTEM_PROPERTIES, payload);
-        checkStatusForSuccess(response);
+        assertEquals(200, response.getStatus());
         response = get(URL_DAS_SYSTEM_PROPERTIES);
         List<Map<String, String>> systemProperties = getSystemProperties(MarshallingUtils.buildMapFromDocument(response.readEntity(String.class)));
         assertNotNull(systemProperties); // This may or may not be empty, depending on whether or not other tests failed
 
         int testPropsFound = 0;
         for (Map<String, String> systemProperty : systemProperties) {
-            String name = (String)systemProperty.get("name");
+            String name = systemProperty.get("name");
             if (prop1.equals(name) || prop2.equals(name)) {
                 testPropsFound++;
             }
@@ -69,26 +73,26 @@
         assertEquals(2, testPropsFound);
 
         response = delete(URL_DAS_SYSTEM_PROPERTIES+"/"+prop1);
-        checkStatusForSuccess(response);
+        assertEquals(200, response.getStatus());
         response = delete(URL_DAS_SYSTEM_PROPERTIES+"/"+prop2);
-        checkStatusForSuccess(response);
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void createPropertiesWithColons() {
         final String prop1 = "property" + generateRandomString();
-        Map<String, String> payload = new HashMap<String, String>() {{
+        Map<String, String> payload = new HashMap<>() {{
             put(prop1, "http://localhost:4848");
         }};
         Response response = post(URL_DAS_SYSTEM_PROPERTIES, payload);
-        checkStatusForSuccess(response);
+        assertEquals(200, response.getStatus());
         response = get(URL_DAS_SYSTEM_PROPERTIES);
         List<Map<String, String>> systemProperties = getSystemProperties(MarshallingUtils.buildMapFromDocument(response.readEntity(String.class)));
         assertNotNull(systemProperties); // This may or may not be empty, depending on whether or not other tests failed
 
         int testPropsFound = 0;
         for (Map<String, String> systemProperty : systemProperties) {
-            String name = (String)systemProperty.get("name");
+            String name = systemProperty.get("name");
             if (prop1.equals(name)) {
                 testPropsFound++;
             }
@@ -97,61 +101,51 @@
         assertEquals(1, testPropsFound);
 
         response = delete(URL_DAS_SYSTEM_PROPERTIES+"/"+prop1);
-        checkStatusForSuccess(response);
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testNotResolvingDasSystemProperties() {
         final String prop1 = "property" + generateRandomString();
-        Map<String, String> payload = new HashMap<String, String>() {{
-            put(prop1, PROP_VALUE);
-        }};
         createAndTestConfigProperty(prop1, PROP_VALUE, "server-config");
         createAndTestInstanceOverride(prop1, PROP_VALUE, PROP_VALUE+"-instace", "server");
     }
 
-    @Test()
+    @Test
     public void testNotResolvingDasInstanceProperties() {
         final String instanceName = "in" + generateRandomNumber();
         final String propertyName = "property" + generateRandomString();
 
-        Response cr = post(URL_CREATE_INSTANCE, new HashMap<String, String>() {{
-            put("id", instanceName);
-            put("node", "localhost-domain1");
-        }});
-        checkStatusForSuccess(cr);
+        Response response = post(URL_CREATE_INSTANCE, Map.of("id", instanceName, "node", "localhost-domain1"));
+        assertEquals(200, response.getStatus());
 
         createAndTestConfigProperty(propertyName, PROP_VALUE, instanceName + "-config");
-
         createAndTestInstanceOverride(propertyName, PROP_VALUE, PROP_VALUE + "-instance", instanceName);
     }
 
-    @Test()
+    @Test
     public void testNotResolvingClusterProperties() {
         final String propertyName = "property" + generateRandomString();
         final String clusterName = "c" + generateRandomNumber();
         final String instanceName = clusterName + "in" + generateRandomNumber();
-        ClusterTest ct = new ClusterTest();
-        ct.setup();
-        ct.createCluster(clusterName);
-        ct.createClusterInstance(clusterName, instanceName);
+        createCluster(clusterName);
+        createClusterInstance(clusterName, instanceName);
 
         createAndTestConfigProperty(propertyName, PROP_VALUE, clusterName + "-config");
         createAndTestClusterOverride(propertyName, PROP_VALUE, PROP_VALUE + "-cluster", clusterName);
         createAndTestInstanceOverride(propertyName, PROP_VALUE+"-cluster", PROP_VALUE + "-instance", instanceName);
 
-        ct.deleteCluster(clusterName);
+        deleteCluster(clusterName);
     }
 
-    protected void createAndTestConfigProperty(final String propertyName, final String propertyValue, String configName) {
+    private void createAndTestConfigProperty(final String propertyName, final String propertyValue, String configName) {
         final String url = URL_CONFIG_SYSTEM_PROPERTIES.replaceAll("%config%", configName);
         Response response = get(url);
         Map<String, String> payload = getSystemPropertiesMap(getSystemProperties(MarshallingUtils.buildMapFromDocument(response.readEntity(String.class))));
         payload.put(propertyName, propertyValue);
         response = post(url, payload);
-        checkStatusForSuccess(response);
+        assertEquals(200, response.getStatus());
 
-            // Check config props
         response = get(url);
         List<Map<String, String>> systemProperties = getSystemProperties(MarshallingUtils.buildMapFromDocument(response.readEntity(String.class)));
         Map<String, String> sysProp = getSystemProperty(propertyName, systemProperties);
@@ -159,7 +153,7 @@
         assertEquals(sysProp.get("value"), propertyValue);
     }
 
-    protected void createAndTestClusterOverride(final String propertyName, final String defaultValue, final String propertyValue, final String clusterName) {
+    private void createAndTestClusterOverride(final String propertyName, final String defaultValue, final String propertyValue, final String clusterName) {
         final String clusterSysPropsUrl = URL_CLUSTER_SYSTEM_PROPERTIES.replaceAll("%clusterName%", clusterName);
 
         Response response = get(clusterSysPropsUrl);
@@ -168,10 +162,8 @@
         assertNotNull(sysProp);
         assertEquals(sysProp.get("defaultValue"), defaultValue);
 
-        response = post(clusterSysPropsUrl, new HashMap<String, String>() {{
-            put(propertyName, propertyValue);
-        }});
-        checkStatusForSuccess(response);
+        response = post(clusterSysPropsUrl, Map.of(propertyName, propertyValue));
+        assertEquals(200, response.getStatus());
 
         // Check updated/overriden system property
         response = get(clusterSysPropsUrl);
@@ -182,7 +174,7 @@
         assertEquals(sysProp.get("defaultValue"), defaultValue);
     }
 
-    protected void createAndTestInstanceOverride(final String propertyName, final String defaultValue, final String propertyValue, final String instanceName) {
+    private void createAndTestInstanceOverride(final String propertyName, final String defaultValue, final String propertyValue, final String instanceName) {
         final String instanceSysPropsUrl = URL_INSTANCE_SYSTEM_PROPERTIES.replaceAll("%instanceName%", instanceName);
 
         Response response = get(instanceSysPropsUrl);
@@ -191,10 +183,8 @@
         assertNotNull(sysProp);
         assertEquals(sysProp.get("defaultValue"), defaultValue);
 
-        response = post(instanceSysPropsUrl, new HashMap<String, String>() {{
-            put(propertyName, propertyValue);
-        }});
-        checkStatusForSuccess(response);
+        response = post(instanceSysPropsUrl, Map.of(propertyName, propertyValue));
+        assertEquals(200, response.getStatus());
 
         // Check updated/overriden system property
         response = get(instanceSysPropsUrl);
@@ -205,9 +195,12 @@
         assertEquals(sysProp.get("defaultValue"), defaultValue);
     }
 
-    private List<Map<String, String>> getSystemProperties(Map<String, Object> responseMap) {
-        Map<String, Object> extraProperties = (Map<String, Object>)responseMap.get("extraProperties");
-        return (List<Map<String, String>>)extraProperties.get("systemProperties");
+    private List<Map<String, String>> getSystemProperties(Map<String, ?> map) {
+        Map<String, Object> extraProperties = (Map<String, Object>) map.get("extraProperties");
+        if (extraProperties == null) {
+            return null;
+        }
+        return (List<Map<String, String>>) extraProperties.get("systemProperties");
     }
 
     private Map<String, String> getSystemProperty(String propName, List<Map<String, String>> systemProperties) {
@@ -221,7 +214,10 @@
     }
 
     private Map<String, String> getSystemPropertiesMap (List<Map<String, String>> propsList) {
-        Map<String, String> allPropsMap = new HashMap();
+        if (propsList == null) {
+            return new HashMap<>();
+        }
+        Map<String, String> allPropsMap = new HashMap<>();
         for (Map<String, String> sysProp : propsList) {
             allPropsMap.put(sysProp.get("name"),  sysProp.get("value"));
         }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/TokenAuthenticationTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/TokenAuthenticationTest.java
index 416ee21..18b4fe7 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/TokenAuthenticationTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/TokenAuthenticationTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2010, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,109 +17,156 @@
 
 package org.glassfish.nucleus.admin.rest;
 
-import java.util.HashMap;
-import java.util.Map;
+import jakarta.ws.rs.client.Client;
 import jakarta.ws.rs.core.Cookie;
 import jakarta.ws.rs.core.Response;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.glassfish.admin.rest.client.ClientWrapper;
 import org.glassfish.admin.rest.client.utils.MarshallingUtils;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 /**
  * @author Mitesh Meswani
  */
 public class TokenAuthenticationTest extends RestTestBase {
-    private static final String URL_DOMAIN_SESSIONS = "/sessions";
-    private static final String URL_CREATE_USER = "/domain/configs/config/server-config/security-service/auth-realm/admin-realm/create-user";
-    private static final String URL_DELETE_USER = "/domain/configs/config/server-config/security-service/auth-realm/admin-realm/delete-user";
+    private static final String URL_DOMAIN_SESSIONS = "sessions";
+    private static final String URL_CREATE_USER = "domain/configs/config/server-config/security-service/auth-realm/admin-realm/create-user";
+    private static final String URL_DELETE_USER = "domain/configs/config/server-config/security-service/auth-realm/admin-realm/delete-user";
     private static final String GF_REST_TOKEN_COOKIE_NAME = "gfresttoken";
     private static final String TEST_GROUP = "newgroup";
 
+    private static final String AUTH_USER_NAME = "dummyuser";
+    private static final String AUTH_PASSWORD = "dummypass";
+    private static final HttpAuthenticationFeature AUTH_DUMMY = HttpAuthenticationFeature.basic(AUTH_USER_NAME, AUTH_PASSWORD);
+    private static final HttpAuthenticationFeature AUTH_NONE = HttpAuthenticationFeature.digest();
+    private final DummyClient client = new DummyClient();
+
+
+    @AfterEach
+    public void closeClient() throws Exception {
+        if (client != null) {
+            client.close();
+        }
+    }
+
+
     @Test
     public void testTokenCreateAndDelete() {
-        deleteUserAuthTestUser(null); // just in case
-        //Verify a session token got created
-        String token = getSessionToken();
+        String token = getSessionToken(this);
+        assertNotNull(token, "token");
 
         // Verify we can use the session token.
-        Response response = getClient().target(getAddress("/domain")).request().cookie(new Cookie(GF_REST_TOKEN_COOKIE_NAME, token)).get(Response.class);
-        assertTrue(isSuccess(response));
+        Response response = getClient().target(getAddress("domain")).request().cookie(new Cookie(GF_REST_TOKEN_COOKIE_NAME, token)).get(Response.class);
+        assertEquals(200, response.getStatus());
 
-        //Delete the token
+        // Delete the token
         response = getClient().target(getAddress(URL_DOMAIN_SESSIONS) + "/" + token).request().cookie(new Cookie(GF_REST_TOKEN_COOKIE_NAME, token)).delete(Response.class);
         delete(URL_DOMAIN_SESSIONS);
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testAuthRequired() {
-        Map<String, String> newUser = new HashMap<String, String>() {{
-            put("id", AUTH_USER_NAME);
-            put("groups", "asadmin");
-            put("authrealmname", "admin-realm");
-            put("AS_ADMIN_USERPASSWORD", AUTH_PASSWORD);
-        }};
         String token = null;
-
         try {
-            // Delete the test user if it exists
-            deleteUserAuthTestUser(token);
+            deleteUserAuthTestUser(null);
 
             // Verify that we can get unauthenticated access to the server
-            Response response = get("/domain");
-            assertTrue(isSuccess(response));
+            Response response = client.get("domain");
+            assertEquals(401, response.getStatus());
 
             // Create the new user
+            Map<String, String> newUser = Map.of(
+                "id", AUTH_USER_NAME,
+                "groups", "asadmin",
+                "authrealmname", "admin-realm",
+                "AS_ADMIN_USERPASSWORD", AUTH_PASSWORD
+            );
             response = post(URL_CREATE_USER, newUser);
-            assertTrue(isSuccess(response));
+            assertEquals(200, response.getStatus());
 
             // Verify that we must now authentication (response.status = 401)
-            response = get("/domain");
-            assertFalse(isSuccess(response));
+            response = client.get("domain");
+            assertEquals(401, response.getStatus());
 
             // Authenticate, get the token, then "clear" the authentication
-            authenticate();
-            token = getSessionToken();
-            resetClient();
+            client.getClient().register(AUTH_DUMMY);
+            token = getSessionToken(client);
+            client.resetClient();
 
             // Build this request manually so we can pass the cookie
-            response = getClient().target(getAddress("/domain")).request().cookie(new Cookie(GF_REST_TOKEN_COOKIE_NAME, token)).get(Response.class);
-            assertTrue(isSuccess(response));
-            resetClient();
+            response = client.getClient().target(getAddress("domain")).request().cookie(new Cookie(GF_REST_TOKEN_COOKIE_NAME, token)).get(Response.class);
+            assertEquals(200, response.getStatus());
+            client.resetClient();
 
             // Request again w/o the cookie.  This should fail.
-            response = getClient().target(getAddress("/domain")).request().get(Response.class);
-            assertFalse(isSuccess(response));
-            authenticate();
+            response = client.getClient().target(getAddress("domain")).request().get(Response.class);
+            assertEquals(401, response.getStatus());
         } finally {
-            // Clean up after ourselves
             deleteUserAuthTestUser(token);
         }
     }
 
-    protected String getSessionToken() {
-        Response response = post(URL_DOMAIN_SESSIONS);
-        assertTrue(isSuccess(response));
-        Map<String, Object> responseMap = MarshallingUtils.buildMapFromDocument(response.readEntity(String.class));
-        Map<String, Object> extraProperties = (Map<String, Object>)responseMap.get("extraProperties");
-        return (String)extraProperties.get("token");
+    private String getSessionToken(RestTestBase client) {
+        Response response = client.post(URL_DOMAIN_SESSIONS);
+        assertEquals(200, response.getStatus());
+        Map<String, ?> responseMap = MarshallingUtils.buildMapFromDocument(response.readEntity(String.class));
+        Map<String, Object> extraProperties = (Map<String, Object>) responseMap.get("extraProperties");
+        return (String) extraProperties.get("token");
     }
 
     private void deleteUserAuthTestUser(String token) {
-        if (token != null) {
+        if (token == null) {
+            Response response = delete(URL_DELETE_USER, Map.of("id", AUTH_USER_NAME));
+            if (response.getStatus() == 401) {
+                response = delete(URL_DELETE_USER, Map.of("id", AUTH_USER_NAME));
+                assertEquals(200, response.getStatus());
+            }
+        } else {
             final String address = getAddress(URL_DELETE_USER);
             Response response = getClient().target(address).queryParam("id", AUTH_USER_NAME).request()
-                    .cookie(new Cookie(GF_REST_TOKEN_COOKIE_NAME, token)).delete(Response.class);
-            assertTrue(isSuccess(response));
-            resetClient();
-        } else {
-            Response response = delete(URL_DELETE_USER, new HashMap<String, String>() {{ put("id", AUTH_USER_NAME); }});
-            if (response.getStatus() == 401) {
-                authenticate();
-                response = delete(URL_DELETE_USER, new HashMap<String, String>() {{ put("id", AUTH_USER_NAME); }});
-                assertTrue(isSuccess(response));
-                resetClient();
+                .cookie(new Cookie(GF_REST_TOKEN_COOKIE_NAME, token)).delete(Response.class);
+            assertEquals(200, response.getStatus());
+        }
+    }
+
+
+    private static class DummyClient extends RestTestBase implements Closeable {
+
+        Client client;
+
+        @Override
+        protected Client getClient() {
+            if (client == null) {
+                client = new ClientWrapper(new HashMap<String, String>(), null, null);
             }
+            return client;
+        }
+
+
+        @Override
+        protected void resetClient() {
+            if (client == null) {
+                return;
+            }
+            client.close();
+            client = null;
+        }
+
+
+        @Override
+        public void close() throws IOException {
+            resetClient();
         }
     }
 }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/UtilityTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/UtilityTest.java
deleted file mode 100644
index 4d8b526..0000000
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/UtilityTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2011, 2018 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.glassfish.nucleus.admin.rest;
-
-/**
- *
- * @author jdlee
- */
-public class UtilityTest {
-
-    // TODO - JERSEY2
-//    @Test
-//    public void parameterResolutionTest() {
-//        WebApplicationImpl wai = new WebApplicationImpl();
-//        ContainerRequest r = new TestHttpRequestContext(wai,
-//                "GET",
-//                null,
-//                "/management/domain/one/two/three/four/five/six/seven/eight/nine/ten/endpoint",
-//                "/management/domain/");
-//        UriInfo ui = new WebApplicationContext(wai, r, null);
-//        Map<String, String> commandParams = new HashMap<String, String>() {{
-//           put("foo", "$parent");
-//           put("bar", "$grandparent3");
-//           put("baz", "$grandparent5");
-//        }};
-//
-//        ResourceUtil.resolveParamValues(commandParams, ui);
-//        assertEquals("ten", commandParams.get("foo"));
-//        assertEquals("seven", commandParams.get("bar"));
-//        assertEquals("five", commandParams.get("baz"));
-//    }
-//
-//    private class TestHttpRequestContext extends ContainerRequest {
-//
-//        public TestHttpRequestContext(
-//                WebApplication wa,
-//                String method,
-//                InputStream entity,
-//                String completeUri,
-//                String baseUri) {
-//
-//            super(wa, method, URI.create(baseUri), URI.create(completeUri), new InBoundHeaders(), entity);
-//        }
-//    }
-}
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ZeroConfigTest.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ZeroConfigTest.java
index 6380a08..875461b 100644
--- a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ZeroConfigTest.java
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/admin/rest/ZeroConfigTest.java
@@ -1,4 +1,5 @@
 /*
+ * Copyright (c) 2022 Contributors to the Eclipse Foundation
  * Copyright (c) 2012, 2018 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -16,10 +17,15 @@
 
 package org.glassfish.nucleus.admin.rest;
 
-import java.util.Map;
 import jakarta.ws.rs.core.Response;
-import static org.testng.AssertJUnit.*;
-import org.testng.annotations.Test;
+
+import java.util.Map;
+
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 /**
  * This class will test that the zero-config effort is handled correctly by the
@@ -32,16 +38,17 @@
  * @author jdlee
  */
 public class ZeroConfigTest extends RestTestBase {
-    public static final String BASE_SERVER_CONFIG_URL = "/domain/configs/config/server-config";
+    public static final String BASE_SERVER_CONFIG_URL = "domain/configs/config/server-config";
     /**
      * Currently (6/29/2012), the transaction-service element is missing from
      * server-config out of the box.  This should continue to be the case once
      * zero-config is fully implemented and integrated.
      */
-    @Test(enabled=false)
+    @Test
+    @Disabled
     public void testTransactionService() {
         final Response response = get(BASE_SERVER_CONFIG_URL + "/transaction-service");
-        assertTrue(isSuccess(response));
+        assertEquals(200, response.getStatus());
         Map<String, String> entity = getEntityValues(response);
         assertNotNull(entity);
     }
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/test/tool/DomainLifecycleExtension.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/test/tool/DomainLifecycleExtension.java
new file mode 100644
index 0000000..c80f703
--- /dev/null
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/test/tool/DomainLifecycleExtension.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2022 Eclipse Foundation and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package org.glassfish.nucleus.test.tool;
+
+import org.junit.jupiter.api.extension.BeforeAllCallback;
+import org.junit.jupiter.api.extension.ExtensionContext;
+
+
+/**
+ * @author David Matejcek
+ */
+public class DomainLifecycleExtension extends StopDomainExtension implements BeforeAllCallback {
+
+
+    @Override
+    public void beforeAll(ExtensionContext context) throws Exception {
+        NucleusTestUtils.nadmin(20000, "start-domain", "domain1");
+    }
+}
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/test/tool/NucleusTestUtils.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/test/tool/NucleusTestUtils.java
new file mode 100644
index 0000000..0072006
--- /dev/null
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/test/tool/NucleusTestUtils.java
@@ -0,0 +1,332 @@
+/*
+ * Copyright (c) 2022 Eclipse Foundation and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package org.glassfish.nucleus.test.tool;
+
+import com.sun.enterprise.universal.process.ProcessManager;
+import com.sun.enterprise.universal.process.ProcessManagerException;
+import com.sun.enterprise.universal.process.ProcessManagerTimeoutException;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.StringWriter;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Locale;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+/**
+ * @author David Matejcek
+ *
+ */
+public class NucleusTestUtils {
+    private static final int DEFAULT_TIMEOUT_MSEC = 8 * 60 * 1000;
+    public static final String ADMIN_USER = "admin";
+    public static final String ADMIN_PASSWORD = "admintest";
+    public static final File BASEDIR = getBasedir();
+    public static final File GF_ROOT = getGlassFishRoot();
+    private static final File PASSWORD_FILE_FOR_UPDATE = getPasswordFile("password_update.txt");
+    private static final File PASSWORD_FILE = getPasswordFile("password.txt");
+
+    static {
+        final NadminReturn result = changePassword();
+        if (result.returnValue) {
+            System.out.println("Admin password changed.");
+        } else {
+            // probably changed by previous execution without maven clean
+            System.out.println("Admin password NOT changed.");
+        }
+    }
+
+
+    /**
+     * Useful for a heuristic inside Eclipse and other environments.
+     *
+     * @return Absolute path to the glassfish directory.
+     */
+    private static File getBasedir() {
+        String basedir = System.getProperty("basedir");
+        if (basedir == null) {
+            File target = new File("target");
+            if (target.exists()) {
+                return target.getAbsoluteFile().getParentFile();
+            }
+            return new File(".").getAbsoluteFile().getParentFile();
+        }
+        return new File(basedir);
+    }
+
+    private static File getGlassFishRoot() {
+        System.out.println("Using basedir: " + BASEDIR);
+        return BASEDIR.toPath().resolve(Path.of("target", "glassfish6", "glassfish")).toFile();
+    }
+
+    private static File getPasswordFile(final String filename) {
+        try {
+            URL url = NucleusTestUtils.class.getResource("/" + filename);
+            assertNotNull(url, filename + " not found");
+            return Path.of(url.toURI()).toFile().getAbsoluteFile();
+        } catch (URISyntaxException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+    private NucleusTestUtils() {
+        // All methods are static, do not allow an object to be created.
+    }
+
+
+    public static File getNucleusRoot() {
+        return GF_ROOT;
+    }
+
+
+    public static void deleteSubpaths(final Path path) {
+        try {
+            Files.walk(path).sorted(Comparator.reverseOrder()).map(Path::toFile).forEach(File::delete);
+        } catch (Exception e) {
+            throw new IllegalStateException("Cannot delete path recursively: " + path, e);
+        }
+    }
+
+
+    /**
+     * This will delete the jobs.xml file
+     */
+    public static void deleteJobsFile() {
+        Path path = GF_ROOT.toPath().resolve(Paths.get("domains", "domain1", "config", "jobs.xml"));
+        System.out.println("Deleting.. " + path);
+        try {
+            Files.deleteIfExists(path);
+        } catch (IOException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+
+    /**
+     * osgi-cache workaround
+     */
+    public static void deleteOsgiDirectory() {
+        Path osgiCacheDir = GF_ROOT.toPath().resolve(Paths.get("domains", "domain1", "osgi-cache"));
+        try {
+            Files.list(osgiCacheDir).forEach(NucleusTestUtils::deleteSubpaths);
+        } catch (IOException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+
+    public static boolean nadmin(final String... args) {
+        return nadmin(DEFAULT_TIMEOUT_MSEC, args);
+    }
+
+    /**
+     * Runs the command with the args given
+     *
+     * @param args
+     *
+     * @return true if successful
+     */
+    public static boolean nadmin(int timeout, final String... args) {
+        return nadminWithOutput(timeout, args).returnValue;
+    }
+
+    /**
+     * Runs the command with the args given
+     * Returns the precious output strings for further processing.
+     *
+     * @param args
+     *
+     * @return true if successful
+     */
+    public static NadminReturn nadminWithOutput(final String... args) {
+        return nadminWithOutput(DEFAULT_TIMEOUT_MSEC, args);
+    }
+
+
+    public static NadminReturn nadminWithOutput(final int timeout, final String... args) {
+        File cmd = new File(GF_ROOT, isWindows() ? "bin/asadmin.bat" : "bin/asadmin");
+        return cmdWithOutput(cmd, timeout, args);
+    }
+
+
+    public static NadminReturn nadminDetachWithOutput(final String... args) {
+        File cmd = new File(GF_ROOT, isWindows() ? "bin/asadmin.bat" : "bin/asadmin");
+        return cmdDetachWithOutput(cmd, DEFAULT_TIMEOUT_MSEC, args);
+    }
+
+
+    private static NadminReturn changePassword() {
+        File cmd = new File(GF_ROOT, isWindows() ? "bin/asadmin.bat" : "bin/asadmin");
+        return cmdWithOutput(cmd, PASSWORD_FILE_FOR_UPDATE, DEFAULT_TIMEOUT_MSEC, "change-admin-password");
+    }
+
+    public static NadminReturn cmdWithOutput(final File cmd, final int timeout, final String... args) {
+        return cmdWithOutput(cmd, PASSWORD_FILE, timeout, args);
+    }
+
+    public static NadminReturn cmdWithOutput(final File cmd, final File passwordFile, final int timeout, final String... args) {
+        List<String> command = new ArrayList<>();
+        command.add(cmd.getAbsolutePath());
+        command.add("--user");
+        command.add(ADMIN_USER);
+        command.add("--passwordfile");
+        command.add(passwordFile.getAbsolutePath());
+        command.addAll(Arrays.asList(args));
+
+        ProcessManager pm = new ProcessManager(command);
+
+        // the tests may be running unattended -- don't wait forever!
+        pm.setTimeoutMsec(timeout);
+        pm.setEcho(false);
+
+        int exit;
+        String myErr = "";
+        try {
+            exit = pm.execute();
+        } catch (ProcessManagerTimeoutException tex) {
+            myErr = "\nProcessManagerTimeoutException: command timed out after " + timeout + " ms.";
+            exit = 1;
+        } catch (ProcessManagerException ex) {
+            ex.printStackTrace();
+            myErr = "\n" + ex.getMessage();
+            exit = 1;
+        }
+
+        NadminReturn ret = new NadminReturn(exit, pm.getStdout(), pm.getStderr() + myErr, args[0]);
+        write(ret.outAndErr);
+        return ret;
+    }
+
+
+    public static NadminReturn cmdDetachWithOutput(final File cmd, final int timeout, final String... args) {
+        List<String> command = new ArrayList<>();
+        command.add(cmd.getAbsolutePath());
+        command.add("--user");
+        command.add(ADMIN_USER);
+        command.add("--passwordfile");
+        command.add(PASSWORD_FILE.getAbsolutePath());
+        command.add("--detach");
+        command.addAll(Arrays.asList(args));
+
+        ProcessManager pm = new ProcessManager(command);
+
+        // the tests may be running unattended -- don't wait forever!
+        pm.setTimeoutMsec(timeout);
+        pm.setEcho(false);
+
+        int exit;
+        String myErr = "";
+        try {
+            exit = pm.execute();
+        } catch (ProcessManagerTimeoutException tex) {
+            myErr = "\nProcessManagerTimeoutException: command timed out after " + timeout + " ms.";
+            exit = 1;
+        } catch (ProcessManagerException ex) {
+            exit = 1;
+        }
+
+        NadminReturn ret = new NadminReturn(exit, pm.getStdout(), pm.getStderr() + myErr, args[0]);
+        write(ret.outAndErr);
+        return ret;
+    }
+
+    private static boolean validResults(String text, String... invalidResults) {
+        for (String result : invalidResults) {
+            if (text.contains(result)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private static void write(final String text) {
+        if (!text.isEmpty()) {
+            System.out.print(text);
+        }
+    }
+
+
+    protected static boolean isWindows() {
+        return System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("win");
+    }
+
+
+    /**
+     * This methods opens a connection to the given URL and
+     * returns the string that is returned from that URL.  This
+     * is useful for simple servlet retrieval
+     *
+     * @param urlstr The URL to connect to
+     * @return The string returned from that URL, or empty
+     * string if there was a problem contacting the URL
+     */
+    public static String getURL(String urlstr) {
+        URLConnection urlc = openConnection(urlstr);
+        try (
+            BufferedReader ir = new BufferedReader(new InputStreamReader(urlc.getInputStream(), "ISO-8859-1"));
+            StringWriter ow = new StringWriter();
+        ) {
+            String line;
+            while ((line = ir.readLine()) != null) {
+                ow.write(line);
+                ow.write("\n");
+            }
+            return ow.getBuffer().toString();
+        } catch (IOException ex) {
+            System.out.println("unable to fetch URL:" + urlstr + ", reason: " + ex.getMessage());
+            return "";
+        }
+    }
+
+    private static URLConnection openConnection(String url) {
+        try {
+            return new URL(url).openConnection();
+        } catch (IOException e) {
+            throw new IllegalArgumentException(e);
+        }
+    }
+
+
+    public static class NadminReturn {
+
+        public boolean returnValue;
+        public String out;
+        public String err;
+        public String outAndErr;
+
+        NadminReturn(int exit, String out, String err, String cmd) {
+            this.returnValue = exit == 0 && validResults(out,
+                String.format("Command %s failed.", cmd));
+            this.out = out;
+            this.err = err;
+            this.outAndErr = this.out + this.err;
+        }
+    }
+
+}
diff --git a/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/test/tool/StopDomainExtension.java b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/test/tool/StopDomainExtension.java
new file mode 100644
index 0000000..ea5699a
--- /dev/null
+++ b/nucleus/tests/admin/src/test/java/org/glassfish/nucleus/test/tool/StopDomainExtension.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2022 Eclipse Foundation and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package org.glassfish.nucleus.test.tool;
+
+import org.junit.jupiter.api.extension.AfterAllCallback;
+import org.junit.jupiter.api.extension.ExtensionContext;
+
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.deleteJobsFile;
+import static org.glassfish.nucleus.test.tool.NucleusTestUtils.deleteOsgiDirectory;
+
+public class StopDomainExtension implements AfterAllCallback {
+
+    @Override
+    public void afterAll(ExtensionContext context) throws Exception {
+        NucleusTestUtils.nadmin(10000, "stop-domain", "domain1");
+        deleteJobsFile();
+        deleteOsgiDirectory();
+    }
+
+}
\ No newline at end of file
diff --git a/nucleus/tests/admin/src/test/resources/password.txt b/nucleus/tests/admin/src/test/resources/password.txt
new file mode 100644
index 0000000..09e24de
--- /dev/null
+++ b/nucleus/tests/admin/src/test/resources/password.txt
@@ -0,0 +1 @@
+AS_ADMIN_PASSWORD=admintest
diff --git a/nucleus/tests/admin/src/test/resources/password_update.txt b/nucleus/tests/admin/src/test/resources/password_update.txt
new file mode 100644
index 0000000..73f0e04
--- /dev/null
+++ b/nucleus/tests/admin/src/test/resources/password_update.txt
@@ -0,0 +1,2 @@
+AS_ADMIN_PASSWORD=
+AS_ADMIN_NEWPASSWORD=admintest
diff --git a/nucleus/tests/pom.xml b/nucleus/tests/pom.xml
index 72ade32..491e1a5 100755
--- a/nucleus/tests/pom.xml
+++ b/nucleus/tests/pom.xml
@@ -34,18 +34,9 @@
 
     <modules>
         <module>admin</module>
+        <module>admin-adon</module>
     </modules>
 
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>jakarta.servlet</groupId>
-                <artifactId>jakarta.servlet-api</artifactId>
-                <version>${servlet-api.version}</version>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
     <build>
         <pluginManagement>
             <plugins>
