diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/ClusterITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/ClusterITest.java
index 1a8f196..03912a6 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/ClusterITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/ClusterITest.java
@@ -17,24 +17,30 @@
 
 package org.glassfish.nucleus.admin;
 
-import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.StringWriter;
+import java.net.URL;
+import java.net.URLConnection;
+
+import org.glassfish.nucleus.test.tool.asadmin.Asadmin;
+import org.glassfish.nucleus.test.tool.asadmin.GlassFishTestEnvironment;
 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.getURL;
-import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadmin;
+import static java.nio.charset.StandardCharsets.ISO_8859_1;
+import static org.glassfish.nucleus.test.tool.AsadminResultMatcher.asadminOK;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.stringContainsInOrder;
-import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 /**
  * @author Tom Mueller
  */
 @TestMethodOrder(OrderAnnotation.class)
-@ExtendWith(DomainLifecycleExtension.class)
 public class ClusterITest {
 
     private static final String PORT1 = "55123";
@@ -44,48 +50,54 @@
     private static final String INSTANCE_NAME_2 = "eein2";
     private static final String URL1 = "http://localhost:" + PORT1;
     private static final String URL2 = "http://localhost:" + PORT2;
+    private static final Asadmin ASADMIN = GlassFishTestEnvironment.getAsadmin();
 
     @Test
     @Order(1)
     public void createClusterTest() {
-        assertTrue(nadmin("create-cluster", CLUSTER_NAME), "create cluster");
+        assertThat(ASADMIN.exec("create-cluster", CLUSTER_NAME), asadminOK());
     }
 
     @Test
     @Order(2)
     public void createInstancesTest() {
-        assertTrue(
-            nadmin("create-local-instance", "--cluster", CLUSTER_NAME, "--systemproperties",
-                        "HTTP_LISTENER_PORT=" + PORT1 + ":" +
-                        "HTTP_SSL_LISTENER_PORT=18181:" +
-                        "IIOP_SSL_LISTENER_PORT=13800:" +
-                        "IIOP_LISTENER_PORT=13700:" +
-                        "JMX_SYSTEM_CONNECTOR_PORT=17676:" +
-                        "IIOP_SSL_MUTUALAUTH_PORT=13801:" +
-                        "JMS_PROVIDER_PORT=18686:" +
-                        "ASADMIN_LISTENER_PORT=14848",
-                        INSTANCE_NAME_1), "create instance1");
+        assertThat(
+            ASADMIN.exec("create-local-instance", "--cluster", CLUSTER_NAME, "--systemproperties",
+                   "HTTP_LISTENER_PORT=" + PORT1
+                + ":HTTP_SSL_LISTENER_PORT=18181"
+                + ":IIOP_SSL_LISTENER_PORT=13800"
+                + ":IIOP_LISTENER_PORT=13700"
+                + ":JMX_SYSTEM_CONNECTOR_PORT=17676"
+                + ":IIOP_SSL_MUTUALAUTH_PORT=13801"
+                + ":JMS_PROVIDER_PORT=18686"
+                + ":ASADMIN_LISTENER_PORT=14848",
+                INSTANCE_NAME_1), asadminOK());
 
-        assertTrue(
-            nadmin("create-local-instance", "--cluster", CLUSTER_NAME, "--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",
-                    INSTANCE_NAME_2), "create instance2");
+        assertThat(
+            ASADMIN.exec("create-local-instance", "--cluster", CLUSTER_NAME, "--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",
+                INSTANCE_NAME_2), asadminOK());
     }
 
+
     @Test
     @Order(3)
     public void startInstancesTest() {
-        assertTrue(nadmin("start-local-instance", INSTANCE_NAME_1), "start instance1");
-        assertTrue(nadmin("start-local-instance", INSTANCE_NAME_2), "start instance2");
+        assertThat(ASADMIN.exec(30_000, false, "start-local-instance", INSTANCE_NAME_1), asadminOK());
+        assertThat(ASADMIN.exec(30_000, false, "start-local-instance", INSTANCE_NAME_2), asadminOK());
     }
 
     @Test
     @Order(4)
     public void checkClusterTest() {
-        assertTrue(nadmin("list-instances"), "list-instances");
+        assertThat(ASADMIN.exec("list-instances"), asadminOK());
         assertThat(getURL(URL1), stringContainsInOrder("GlassFish Server"));
         assertThat(getURL(URL2), stringContainsInOrder("GlassFish Server"));
     }
@@ -93,20 +105,55 @@
     @Test
     @Order(5)
     public void stopInstancesTest() {
-        assertTrue(nadmin("stop-local-instance", "--kill", INSTANCE_NAME_1), "stop instance1");
-        assertTrue(nadmin("stop-local-instance", "--kill", INSTANCE_NAME_2), "stop instance2");
+        assertThat(ASADMIN.exec("stop-local-instance", "--kill", INSTANCE_NAME_1), asadminOK());
+        assertThat(ASADMIN.exec("stop-local-instance", "--kill", INSTANCE_NAME_2), asadminOK());
     }
 
     @Test
     @Order(6)
     public void deleteInstancesTest() {
-        assertTrue(nadmin("delete-local-instance", INSTANCE_NAME_1), "delete instance1");
-        assertTrue(nadmin("delete-local-instance", INSTANCE_NAME_2), "delete instance2");
+        assertThat(ASADMIN.exec("delete-local-instance", INSTANCE_NAME_1), asadminOK());
+        assertThat(ASADMIN.exec("delete-local-instance", INSTANCE_NAME_2), asadminOK());
     }
 
     @Test
     @Order(7)
     public void deleteClusterTest() {
-        assertTrue(nadmin("delete-cluster", CLUSTER_NAME), "delete cluster");
+        assertThat(ASADMIN.exec("delete-cluster", CLUSTER_NAME), asadminOK());
+    }
+
+
+    /**
+     * 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) {
+            return fail(ex);
+        }
+    }
+
+    private static URLConnection openConnection(String url) {
+        try {
+            return new URL(url).openConnection();
+        } catch (IOException e) {
+            throw new IllegalArgumentException(e);
+        }
     }
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/MiscCommandsITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/MiscCommandsITest.java
index 97d7e4b..66f27e7 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/MiscCommandsITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/MiscCommandsITest.java
@@ -17,40 +17,47 @@
 
 package org.glassfish.nucleus.admin;
 
-import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
+import org.glassfish.nucleus.test.tool.asadmin.Asadmin;
+import org.glassfish.nucleus.test.tool.asadmin.GlassFishTestEnvironment;
+import org.junit.jupiter.api.AfterAll;
 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;
+import static org.glassfish.nucleus.test.tool.AsadminResultMatcher.asadminOK;
+import static org.hamcrest.MatcherAssert.assertThat;
 
 
 /**
  * @author Tom Mueller
  */
-@ExtendWith(DomainLifecycleExtension.class)
 @TestMethodOrder(OrderAnnotation.class)
 public class MiscCommandsITest {
 
+    private static final Asadmin ASADMIN = GlassFishTestEnvironment.getAsadmin();
+
+    @AfterAll
+    public static void startDomainAgain() {
+        assertThat(ASADMIN.exec("start-domain"), asadminOK());
+    }
+
     @Test
     @Order(1)
     public void uptime() {
-        assertTrue(nadmin("uptime"));
+        assertThat(ASADMIN.exec("uptime"), asadminOK());
     }
 
     @Test
     @Order(1)
     public void version1() {
-        assertTrue(nadmin("version"));
+        assertThat(ASADMIN.exec("version"), asadminOK());
     }
 
     @Test
     @Order(100)
     public void version2() {
-        assertTrue(nadmin("stop-domain"));
-        assertTrue(nadmin("version", "--local"));
+        assertThat(ASADMIN.exec("stop-domain"), asadminOK());
+        assertThat(ASADMIN.exec("version", "--local"), asadminOK());
     }
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/OSGiCommandsITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/OSGiCommandsITest.java
index fa20972..c7bf5b0 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/OSGiCommandsITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/OSGiCommandsITest.java
@@ -26,15 +26,13 @@
 import java.util.List;
 import java.util.Set;
 
-import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
-import org.glassfish.nucleus.test.tool.NucleusTestUtils;
-import org.glassfish.nucleus.test.tool.NucleusTestUtils.NadminReturn;
+import org.glassfish.nucleus.test.tool.asadmin.Asadmin;
+import org.glassfish.nucleus.test.tool.asadmin.AsadminResult;
+import org.glassfish.nucleus.test.tool.asadmin.GlassFishTestEnvironment;
 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.glassfish.nucleus.test.tool.AsadminResultMatcher.asadminOK;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.not;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -44,12 +42,13 @@
 /**
  * @author sanjeeb.sahoo@oracle.com
  */
-@ExtendWith(DomainLifecycleExtension.class)
 public class OSGiCommandsITest {
 
+    private static final Asadmin ASADMIN = GlassFishTestEnvironment.getAsadmin();
+
     @Test
     public void basicOsgiCmd() {
-        assertTrue(nadmin("osgi", "lb"));
+        assertThat(ASADMIN.exec("osgi", "lb"), asadminOK());
     }
 
 
@@ -103,28 +102,12 @@
         try (PrintStream ps = new PrintStream(new FileOutputStream(cmdFile))) {
             ps.println("help");
             ps.println("lb");
-            NucleusTestUtils.NadminReturn value = nadminWithOutput("osgi-shell", "--file", cmdFile.getAbsolutePath());
-            assertTrue(value.out.contains("System Bundle"));
+            AsadminResult value = ASADMIN.exec("osgi-shell", "--file", cmdFile.getAbsolutePath());
+            assertTrue(value.getStdOut().contains("System Bundle"));
         }
     }
 
 
-    private List<String> runCmd(String... cmd) throws Exception {
-        NadminReturn value = nadminWithOutput(cmd);
-        if (!value.returnValue) {
-            throw new Exception("Cmd failed: \n" + value.outAndErr);
-        }
-        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;
-            }
-            output.add(line);
-        }
-        return output;
-    }
-
     private String newCmdSession() throws Exception {
         List<String> value = runCmd("osgi", "--session", "new");
         if (value.size() != 1) {
@@ -137,4 +120,19 @@
         List<String> sessions = runCmd("osgi", "--session", "list");
         return new HashSet<>(sessions);
     }
+
+
+    private List<String> runCmd(String... cmd) throws Exception {
+        AsadminResult value = ASADMIN.exec(cmd);
+        assertThat(value, asadminOK());
+        List<String> output = new ArrayList<>();
+        for (String line : value.getStdOut().split("\\n")) {
+            line = line.trim();
+            if (line.isEmpty() || line.startsWith(ASADMIN.getCommandName()) || line.startsWith("Command")) {
+                continue;
+            }
+            output.add(line);
+        }
+        return output;
+    }
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/RestITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/RestITest.java
index 9112ad4..700048b 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/RestITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/RestITest.java
@@ -19,25 +19,20 @@
 
 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 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;
 
+import org.junit.jupiter.api.Test;
+
+import static org.glassfish.nucleus.test.tool.asadmin.GlassFishTestEnvironment.openConnection;
 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 RestITest {
 
     @Test
     public void testManagementEndpoint() throws Exception {
-        HttpURLConnection connection = getConnection("http://localhost:4848/management/domain.xml");
+        HttpURLConnection connection = openConnection("/management/domain.xml");
         try {
             assertEquals(200, connection.getResponseCode());
         } finally {
@@ -47,7 +42,7 @@
 
     @Test
     public void testMonitoringEndpoint() throws Exception {
-        HttpURLConnection connection = getConnection("http://localhost:4848/monitoring/domain.xml");
+        HttpURLConnection connection = openConnection("/monitoring/domain.xml");
         try {
             assertEquals(200, connection.getResponseCode());
         } finally {
@@ -57,7 +52,7 @@
 
     @Test
     public void testAdminCommandEndpoint() throws Exception {
-        HttpURLConnection connection = getConnection("http://localhost:4848/management/domain/version.xml");
+        HttpURLConnection connection = openConnection("/management/domain/version.xml");
         try {
             assertEquals(200, connection.getResponseCode());
         } finally {
@@ -67,7 +62,7 @@
 
     @Test
     public void testChildConfigBeanEndpoint() throws Exception {
-        HttpURLConnection connection = getConnection("http://localhost:4848/management/domain/applications.xml");
+        HttpURLConnection connection = openConnection("/management/domain/applications.xml");
         try {
             assertEquals(200, connection.getResponseCode());
         } finally {
@@ -84,17 +79,9 @@
         assertEquals(200, deleteNode());
     }
 
-    protected HttpURLConnection getConnection(String url) throws IOException {
-        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() throws IOException {
         String parameters = "name=myConfigNode";
-        HttpURLConnection connection = getConnection("http://localhost:4848/management/domain/nodes/create-node-config");
+        HttpURLConnection connection = openConnection("/management/domain/nodes/create-node-config");
         try {
             connection.setRequestMethod("POST");
             connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
@@ -113,7 +100,7 @@
     }
 
     private int getNode() throws IOException {
-        HttpURLConnection connection = getConnection("http://localhost:4848/management/domain/nodes/node/myConfigNode");
+        HttpURLConnection connection = openConnection("/management/domain/nodes/node/myConfigNode");
         try {
             return connection.getResponseCode();
         } finally {
@@ -122,7 +109,7 @@
     }
 
     private int deleteNode() throws IOException {
-        HttpURLConnection connection = getConnection("http://localhost:4848/management/domain/nodes/delete-node-config?id=myConfigNode");
+        HttpURLConnection connection = openConnection("/management/domain/nodes/delete-node-config?id=myConfigNode");
         try {
             connection.setRequestMethod("DELETE");
             connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
@@ -132,11 +119,4 @@
             connection.disconnect();
         }
     }
-
-    private static class DasAuthenticator extends Authenticator {
-        @Override
-        protected PasswordAuthentication getPasswordAuthentication() {
-            return new PasswordAuthentication(NucleusTestUtils.ADMIN_USER, NucleusTestUtils.ADMIN_PASSWORD.toCharArray());
-        }
-    }
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/DetachAttachITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/DetachAttachITest.java
index c8a89d9..d76d7a8 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/DetachAttachITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/DetachAttachITest.java
@@ -29,55 +29,49 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.ThreadFactory;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
-import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
-import org.glassfish.nucleus.test.tool.NucleusTestUtils.NadminReturn;
-import org.junit.jupiter.api.AfterEach;
+import org.glassfish.nucleus.test.tool.asadmin.Asadmin;
+import org.glassfish.nucleus.test.tool.asadmin.AsadminResult;
+import org.glassfish.nucleus.test.tool.asadmin.GlassFishTestEnvironment;
 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.glassfish.nucleus.test.tool.AsadminResultMatcher.asadminOK;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.greaterThan;
 import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.not;
 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.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * @author martinmares
  */
-@ExtendWith(DomainLifecycleExtension.class)
 public class DetachAttachITest {
-
-    @AfterEach
-    public void cleanUp() throws Exception {
-        nadmin("stop-domain");
-        deleteJobsFile();
-        deleteOsgiDirectory();
-        nadmin("start-domain");
-    }
+    private static final Logger LOG = Logger.getLogger(DetachAttachITest.class.getName());
+    private static final Asadmin ASADMIN = GlassFishTestEnvironment.getAsadmin();
 
     @Test
     public void uptimePeriodically() throws Exception {
         Set<String> ids = new HashSet<>();
         for (int i = 0; i < 3; i++) {
-            System.out.println("detachAndAttachUptimePeriodically(): round " + i);
+            LOG.log(Level.FINE, "detachAndAttachUptimePeriodically(): round " + i);
             final String id;
             {
-                NadminReturn result = nadminWithOutput("--detach", "--terse", "uptime");
-                assertTrue(result.returnValue);
-                id = parseJobIdFromEchoTerse(result.out);
+                AsadminResult result = ASADMIN.execDetached("--terse", "uptime");
+                assertThat(result, asadminOK());
+                id = parseJobIdFromEchoTerse(result.getStdOut());
                 assertTrue(ids.add(id));
             }
             Thread.sleep(1000L);
             {
-                NadminReturn result = nadminWithOutput("--terse", "attach", id);
-                assertTrue(result.returnValue);
-                assertTrue(result.out.contains("uptime"));
+                AsadminResult result = ASADMIN.exec("--terse", "attach", id);
+                assertThat(result, asadminOK());
+                assertTrue(result.getStdOut().contains("uptime"));
             }
         }
     }
@@ -85,21 +79,20 @@
 
     @Test
     public void commandWithProgressStatus() throws Exception {
-        NadminReturn result = nadminWithOutput("--detach", "--terse", "progress-custom", "6x1");
-        assertTrue(result.returnValue);
-        String id = parseJobIdFromEchoTerse(result.out);
+        AsadminResult result = ASADMIN.execDetached("--terse", "progress-custom", "6x1");
+        assertThat(result, asadminOK());
+        String id = parseJobIdFromEchoTerse(result.getStdOut());
         Thread.sleep(2000L);
         // Now attach running
-        result = nadminWithOutput("attach", id);
-        assertTrue(result.returnValue);
-        assertThat(result.out, stringContainsInOrder("progress-custom"));
-        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.out);
+        result = ASADMIN.exec("attach", id);
+        assertThat(result, asadminOK());
+        assertThat(result.getStdOut(), stringContainsInOrder("progress-custom"));
+        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.getStdOut());
         assertFalse(prgs.isEmpty());
-        assertTrue(prgs.get(0).getValue() > 0);
+        assertThat(prgs.get(0).getValue(), greaterThan(0));
         assertEquals(100, prgs.get(prgs.size() - 1).getValue());
         // Now attach finished - must NOT exist - seen progress job is removed
-        result = nadminWithOutput("attach", id);
-        assertFalse(result.returnValue);
+        assertThat(ASADMIN.exec("attach", id), not(asadminOK()));
     }
 
 
@@ -113,28 +106,29 @@
                 return result;
             }
         });
-        NadminReturn result = nadminWithOutput("--detach", "--terse", "progress-custom", "8x1");
-        assertTrue(result.returnValue);
-        final String id = parseJobIdFromEchoTerse(result.out);
+        AsadminResult result = ASADMIN.execDetached("--terse", "progress-custom", "8x1");
+        assertThat(result, asadminOK());
+        final String id = parseJobIdFromEchoTerse(result.getStdOut());
+        assertNotNull(id, "id");
         Thread.sleep(1500L);
         final int attachCount = 3;
-        Collection<Callable<NadminReturn>> attaches = new ArrayList<>(attachCount);
+        Collection<Callable<AsadminResult>> attaches = new ArrayList<>(attachCount);
         for (int i = 0; i < attachCount; i++) {
-            attaches.add(new Callable<NadminReturn>() {
+            attaches.add(new Callable<AsadminResult>() {
                 @Override
-                public NadminReturn call() throws Exception {
-                    return nadminWithOutput("attach", id);
+                public AsadminResult call() throws Exception {
+                    return ASADMIN.exec("attach", id);
                 }
             });
         }
-        List<Future<NadminReturn>> results = pool.invokeAll(attaches);
-        for (Future<NadminReturn> fRes : results) {
-            NadminReturn res = fRes.get();
-            assertTrue(res.returnValue);
-            assertTrue(res.out.contains("progress-custom"));
-            List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(res.out);
+        List<Future<AsadminResult>> results = pool.invokeAll(attaches);
+        for (Future<AsadminResult> fRes : results) {
+            AsadminResult res = fRes.get();
+            assertThat(res, asadminOK());
+            assertTrue(res.getStdOut().contains("progress-custom"));
+            List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(res.getStdOut());
             assertFalse(prgs.isEmpty());
-            assertTrue(prgs.get(0).getValue() > 0);
+            assertThat(prgs.get(0).getValue(), greaterThan(0));
             assertEquals(100, prgs.get(prgs.size() - 1).getValue());
         }
     }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/JobManagerITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/JobManagerITest.java
index 8c5ebfa..00f6088 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/JobManagerITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/JobManagerITest.java
@@ -17,22 +17,20 @@
 
 package org.glassfish.nucleus.admin.progress;
 
-import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
+import org.glassfish.nucleus.test.tool.asadmin.Asadmin;
+import org.glassfish.nucleus.test.tool.asadmin.AsadminResult;
 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.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.glassfish.nucleus.test.tool.AsadminResultMatcher.asadminOK;
+import static org.glassfish.nucleus.test.tool.asadmin.GlassFishTestEnvironment.deleteJobsFile;
+import static org.glassfish.nucleus.test.tool.asadmin.GlassFishTestEnvironment.deleteOsgiDirectory;
+import static org.glassfish.nucleus.test.tool.asadmin.GlassFishTestEnvironment.getAsadmin;
 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
@@ -41,67 +39,71 @@
  * @author David Matejcek
  */
 @TestMethodOrder(OrderAnnotation.class)
-@ExtendWith(DomainLifecycleExtension.class)
 public class JobManagerITest {
 
     private static final String COMMAND_PROGRESS_SIMPLE = "progress-simple";
+    private static final Asadmin ASADMIN = getAsadmin();
 
     @BeforeEach
     public void setUp() throws Exception {
-        nadmin("stop-domain");
+        assertThat(ASADMIN.exec("stop-domain"), asadminOK());
         deleteJobsFile();
         deleteOsgiDirectory();
-        assertTrue(nadmin("start-domain"), "start-domain failed");
+        assertThat(ASADMIN.exec("start-domain"), asadminOK());
     }
 
     @Test
     @Order(1)
     public void noJobsTest() {
-        assertThat(nadminWithOutput("list-jobs").outAndErr, stringContainsInOrder("Nothing to list"));
+        AsadminResult result = ASADMIN.exec("list-jobs");
+        assertThat(result, asadminOK());
+        assertThat(result.getOutput(), 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"));
+        assertThat(ASADMIN.exec("--terse", "progress-simple"), asadminOK());
+        assertThat(ASADMIN.exec("list-jobs").getStdOut(), stringContainsInOrder(COMMAND_PROGRESS_SIMPLE, "COMPLETED"));
+        assertThat(ASADMIN.exec("list-jobs", "1").getStdOut(), stringContainsInOrder(COMMAND_PROGRESS_SIMPLE, "COMPLETED"));
 
-        assertTrue(nadmin("stop-domain"));
-        assertTrue(nadmin("start-domain"));
-        assertThat(nadminWithOutput("list-jobs", "1").out, stringContainsInOrder(COMMAND_PROGRESS_SIMPLE, "COMPLETED"));
+        assertThat(ASADMIN.exec("stop-domain"), asadminOK());
+        assertThat(ASADMIN.exec("start-domain"), asadminOK());
+        AsadminResult result = ASADMIN.exec("list-jobs", "1");
+        assertThat(result, asadminOK());
+        assertThat(result.getStdOut(), 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"));
+        assertThat(ASADMIN.execDetached(COMMAND_PROGRESS_SIMPLE).getStdOut(), stringContainsInOrder("Job ID: "));
+        assertThat(ASADMIN.exec("list-jobs", "1").getStdOut(), stringContainsInOrder(COMMAND_PROGRESS_SIMPLE));
+        assertThat(ASADMIN.exec("attach", "1"), asadminOK());
 
         // 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"));
+        assertThat(ASADMIN.exec("list-jobs").getOutput(), 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));
+        assertThat(ASADMIN.exec("configure-managed-jobs", "--job-retention-period=60s", "--cleanup-initial-delay=1s", "--cleanup-poll-interval=1s"), asadminOK());
+        assertThat(ASADMIN.exec(COMMAND_PROGRESS_SIMPLE), asadminOK());
+        assertThat(ASADMIN.exec("list-jobs", "1").getStdOut(), 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));
+        assertThat(ASADMIN.exec("stop-domain"), asadminOK());
+        assertThat(ASADMIN.exec("start-domain"), asadminOK());
+        assertThat(ASADMIN.exec("list-jobs", "1").getStdOut(), stringContainsInOrder(COMMAND_PROGRESS_SIMPLE));
 
-        assertTrue(nadmin("configure-managed-jobs", "--job-retention-period=1s", "--cleanup-initial-delay=1s", "--cleanup-poll-interval=1s"));
+        assertThat(ASADMIN.exec("configure-managed-jobs", "--job-retention-period=1s", "--cleanup-initial-delay=1s", "--cleanup-poll-interval=1s"), asadminOK());
         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"));
+        assertThat(ASADMIN.exec("list-jobs").getOutput(), stringContainsInOrder("Nothing to list"));
+        assertThat(ASADMIN.exec("configure-managed-jobs", "--job-retention-period=1h", "--cleanup-initial-delay=5m", "--cleanup-poll-interval=20m"), asadminOK());
     }
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusBasicITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusBasicITest.java
index 609c997..6074aa0 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusBasicITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusBasicITest.java
@@ -19,13 +19,13 @@
 
 import java.util.List;
 
-import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
-import org.glassfish.nucleus.test.tool.NucleusTestUtils.NadminReturn;
+import org.glassfish.nucleus.test.tool.asadmin.Asadmin;
+import org.glassfish.nucleus.test.tool.asadmin.AsadminResult;
+import org.glassfish.nucleus.test.tool.asadmin.GlassFishTestEnvironment;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 
 import static org.glassfish.nucleus.admin.progress.ProgressMessage.isIncreasing;
-import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadminWithOutput;
+import static org.glassfish.nucleus.test.tool.AsadminResultMatcher.asadminOK;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.hasSize;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -35,14 +35,15 @@
 /**
  * @author martinmares
  */
-@ExtendWith(DomainLifecycleExtension.class)
 public class ProgressStatusBasicITest {
 
+    private static final Asadmin ASADMIN = GlassFishTestEnvironment.getAsadmin();
+
     @Test
     public void simple() {
-        NadminReturn result = nadminWithOutput("progress-simple");
-        assertTrue(result.returnValue);
-        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.out);
+        AsadminResult result = ASADMIN.exec("progress-simple");
+        assertThat(result, asadminOK());
+        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.getStdOut());
         assertThat(prgs, isIncreasing());
         assertEquals(12, prgs.size());
         for (int i = 0; i < 11; i++) {
@@ -53,9 +54,9 @@
 
     @Test
     public void simpleNoTotal() {
-        NadminReturn result = nadminWithOutput("progress-simple", "--nototalsteps");
-        assertTrue(result.returnValue);
-        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.out);
+        AsadminResult result = ASADMIN.exec("progress-simple", "--nototalsteps");
+        assertThat(result, asadminOK());
+        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.getStdOut());
         assertThat(prgs, isIncreasing());
         boolean nonPercentageExists = false;
         for (ProgressMessage prg : prgs) {
@@ -69,9 +70,9 @@
 
     @Test
     public void simpleSpecInAnnotation() {
-        NadminReturn result = nadminWithOutput("progress-full-annotated");
-        assertTrue(result.returnValue);
-        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.out);
+        AsadminResult result = ASADMIN.exec("progress-full-annotated");
+        assertThat(result, asadminOK());
+        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.getStdOut());
         assertThat(prgs, hasSize(12));
         assertThat(prgs, isIncreasing());
         for (int i = 0; i < 11; i++) {
@@ -83,9 +84,9 @@
 
     @Test
     public void simpleTerse() {
-        NadminReturn result = nadminWithOutput("--terse", "progress-simple");
-        assertTrue(result.returnValue);
-        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.out);
+        AsadminResult result = ASADMIN.exec("--terse", "progress-simple");
+        assertThat(result, asadminOK());
+        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.getStdOut());
         assertThat(prgs, hasSize(0));
     }
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusComplexITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusComplexITest.java
index 069081a..5c0e076 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusComplexITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusComplexITest.java
@@ -19,16 +19,15 @@
 
 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.glassfish.nucleus.test.tool.asadmin.Asadmin;
+import org.glassfish.nucleus.test.tool.asadmin.AsadminResult;
+import org.glassfish.nucleus.test.tool.asadmin.GlassFishTestEnvironment;
 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.isIncreasing;
 import static org.glassfish.nucleus.admin.progress.ProgressMessage.uniqueMessages;
-import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadminWithOutput;
+import static org.glassfish.nucleus.test.tool.AsadminResultMatcher.asadminOK;
 import static org.hamcrest.CoreMatchers.anyOf;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -42,25 +41,26 @@
 /**
  * @author martinmares
  */
-@ExtendWith(DomainLifecycleExtension.class)
 public class ProgressStatusComplexITest {
 
+    private static final Asadmin ASADMIN = GlassFishTestEnvironment.getAsadmin();
+
     @Test
     public void executeCommandFromCommand() {
-        NadminReturn result = nadminWithOutput("progress-exec-other");
-        assertTrue(result.returnValue);
+        AsadminResult result = ASADMIN.exec(30_000, false, "progress-exec-other");
+        assertThat(result, asadminOK());
         assertArrayEquals(new String[] {
             "Starting", "Preparing", "Parsing", "Working on main part",
             "Cleaning", "Finished", "Finishing outer command", "Finished outer command" },
-            uniqueMessages(grepProgressMessages(result.out)));
+            uniqueMessages(grepProgressMessages(result.getStdOut())));
     }
 
     @Test
     public void executeCommandWithSupplements() {
-        NadminReturn result = nadminWithOutput("progress-supplement");
-        assertTrue(result.returnValue);
+        AsadminResult result = ASADMIN.exec("progress-supplement");
+        assertThat(result, asadminOK());
 
-        List<ProgressMessage> prgs = grepProgressMessages(result.out);
+        List<ProgressMessage> prgs = grepProgressMessages(result.getStdOut());
         assertArrayEquals(new String[] {
             "Starting", "2 seconds supplemental command", "Parsing",
             "Working on main part", "Finished", "3 seconds supplemental" },
@@ -74,10 +74,10 @@
 
     @Test
     public void executeVeryComplexCommand() {
-        NucleusTestUtils.NadminReturn result = nadminWithOutput("progress-complex");
-        assertTrue(result.returnValue);
+        AsadminResult result = ASADMIN.exec("progress-complex");
+        assertThat(result, asadminOK());
 
-        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.out);
+        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.getStdOut());
         assertThat(prgs, hasSize(greaterThanOrEqualTo(100)));
         assertThat(prgs, isIncreasing());
         assertEquals(5, scopeCount(prgs, "complex:"));
@@ -103,5 +103,4 @@
         }
         return result;
     }
-
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusFailITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusFailITest.java
index 7d9fe7b..dfd0b1b 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusFailITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusFailITest.java
@@ -19,35 +19,38 @@
 
 import java.util.List;
 
-import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
-import org.glassfish.nucleus.test.tool.NucleusTestUtils.NadminReturn;
+import org.glassfish.nucleus.test.tool.asadmin.Asadmin;
+import org.glassfish.nucleus.test.tool.asadmin.AsadminResult;
+import org.glassfish.nucleus.test.tool.asadmin.GlassFishTestEnvironment;
 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.glassfish.nucleus.test.tool.AsadminResultMatcher.asadminOK;
+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.assertFalse;
 
 /**
  * @author martinmares
  */
-@ExtendWith(DomainLifecycleExtension.class)
 public class ProgressStatusFailITest {
 
+    private static final Asadmin ASADMIN = GlassFishTestEnvironment.getAsadmin();
+
     @Test
     public void failDuringExecution() {
-        NadminReturn result = nadminWithOutput("progress-fail-in-half");
-        assertFalse(result.returnValue);
-        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.out);
+        AsadminResult result = ASADMIN.exec("progress-fail-in-half");
+        assertThat(result, not(asadminOK()));
+        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.getStdOut());
         assertFalse(prgs.isEmpty());
         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);
-        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.out);
+        AsadminResult result = ASADMIN.exec(6_000, false, "progress-custom", "3x1", "1x8", "2x1");
+        assertThat(result, not(asadminOK()));
+        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.getStdOut());
         assertFalse(prgs.isEmpty());
         assertEquals(50, prgs.get(prgs.size() - 1).getValue());
     }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusSpecialITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusSpecialITest.java
index 68573f0..58bd344 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusSpecialITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/progress/ProgressStatusSpecialITest.java
@@ -20,13 +20,13 @@
 import java.util.Iterator;
 import java.util.List;
 
-import org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
-import org.glassfish.nucleus.test.tool.NucleusTestUtils.NadminReturn;
+import org.glassfish.nucleus.test.tool.asadmin.Asadmin;
+import org.glassfish.nucleus.test.tool.asadmin.AsadminResult;
+import org.glassfish.nucleus.test.tool.asadmin.GlassFishTestEnvironment;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
 
 import static org.glassfish.nucleus.admin.progress.ProgressMessage.isIncreasing;
-import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadminWithOutput;
+import static org.glassfish.nucleus.test.tool.AsadminResultMatcher.asadminOK;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.lessThan;
@@ -36,14 +36,15 @@
 /**
  * @author martinmares
  */
-@ExtendWith(DomainLifecycleExtension.class)
 public class ProgressStatusSpecialITest {
 
+    private static final Asadmin ASADMIN = GlassFishTestEnvironment.getAsadmin();
+
     @Test
     public void stepBackCommand() {
-        NadminReturn result = nadminWithOutput("progress-step-back");
-        assertTrue(result.returnValue);
-        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.out);
+        AsadminResult result = ASADMIN.exec("progress-step-back");
+        assertThat(result, asadminOK());
+        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.getStdOut());
         assertThat(prgs, not(isIncreasing()));
         Iterator<ProgressMessage> itr = prgs.iterator();
         while (itr.hasNext()) {
@@ -67,9 +68,9 @@
 
     @Test
     public void doubleTotalCommand() {
-        NadminReturn result = nadminWithOutput("progress-double-totals");
-        assertTrue(result.returnValue);
-        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.out);
+        AsadminResult result = ASADMIN.exec("progress-double-totals");
+        assertThat(result, asadminOK());
+        List<ProgressMessage> prgs = ProgressMessage.grepProgressMessages(result.getStdOut());
         assertThat(prgs, not(isIncreasing()));
     }
 
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ApplicationITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ApplicationITest.java
index bb91938..19d9bb0 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ApplicationITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ApplicationITest.java
@@ -19,17 +19,13 @@
 
 import jakarta.ws.rs.core.Response;
 
-import java.io.File;
-import java.io.IOException;
 import java.net.URISyntaxException;
 import java.util.Map;
-import java.util.logging.Logger;
 
+import org.glassfish.nucleus.test.tool.DomainAdminRestClient;
 import org.glassfish.nucleus.test.webapp.HelloServlet;
-import org.jboss.shrinkwrap.api.ShrinkWrap;
-import org.jboss.shrinkwrap.api.exporter.ZipExporter;
-import org.jboss.shrinkwrap.api.spec.EnterpriseArchive;
-import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 import static org.hamcrest.CoreMatchers.equalTo;
@@ -42,46 +38,55 @@
  */
 public class ApplicationITest extends RestTestBase {
 
+
+    private DomainAdminRestClient client;
+    private String appName;
+
+    @BeforeEach
+    public void initInstanceClient() {
+        appName = "testApp" + generateRandomString();
+        client = new DomainAdminRestClient(getBaseInstanceUrl() + "/" + appName);
+    }
+
+    @AfterEach
+    public void closeInstanceClient() {
+        if (client != null) {
+            client.close();
+        }
+    }
+
     @Test
     public void testApplicationDeployment() throws URISyntaxException {
-        final String appName = "testApp" + generateRandomString();
-
         try {
             Map<String, String> deployedApp = deployApp(getWar("test"), appName, appName);
             assertEquals(appName, deployedApp.get("name"));
             assertEquals("/" + appName, deployedApp.get("contextRoot"));
-        } catch (Exception e) {
-            throw new RuntimeException(e);
         } finally {
             undeployApp(appName);
         }
     }
 
+
     @Test
     public void testApplicationDisableEnable() throws URISyntaxException {
-        final String appName = "testApp" + generateRandomString();
-
         Map<String, String> deployedApp = deployApp(getWar("test"), appName, appName);
         assertEquals(appName, deployedApp.get("name"));
-
         assertEquals("/" + appName, deployedApp.get("contextRoot"));
-
         try {
-            String appUrl = getBaseInstanceUrl() + appName;
-            Response response = get(appUrl);
-            assertEquals ("Hello!", response.readEntity(String.class));
+            Response response = client.get("");
+            assertEquals("Hello!", response.readEntity(String.class));
 
-            response = post(URL_APPLICATION_DEPLOY + "/" + appName + "/disable");
+            response = managementClient.post(URL_APPLICATION_DEPLOY + "/" + appName + "/disable");
             assertThat(response.getStatus(), equalTo(200));
 
-            response = get(appUrl);
+            response = client.get("");
             assertEquals(404, response.getStatus());
 
-            response = post(URL_APPLICATION_DEPLOY + "/" + appName + "/enable");
+            response = managementClient.post(URL_APPLICATION_DEPLOY + "/" + appName + "/enable");
             assertThat(response.getStatus(), equalTo(200));
 
-            response = get(appUrl);
-            assertEquals ("Hello!", response.readEntity(String.class).trim());
+            response = client.get("");
+            assertEquals("Hello!", response.readEntity(String.class).trim());
         } finally {
             undeployApp(appName);
         }
@@ -89,16 +94,16 @@
 
     @Test
     public void listSubComponents() throws URISyntaxException {
-        final String appName = "testApp" + generateRandomString();
-
         try {
             deployApp(getEar("simple"), appName, appName);
-            Response response = get(URL_APPLICATION_DEPLOY +"/" + appName + "/list-sub-components?id=" + appName);
+            Response response = managementClient
+                .get(URL_APPLICATION_DEPLOY + "/" + appName + "/list-sub-components?id=" + appName);
             assertThat(response.getStatus(), equalTo(200));
             String subComponents = response.readEntity(String.class);
             assertThat(subComponents, stringContainsInOrder("simple"));
 
-            response = get(URL_APPLICATION_DEPLOY +"/" + appName + "/list-sub-components?id=simple.war&appname=" + appName);
+            response = managementClient
+                .get(URL_APPLICATION_DEPLOY + "/" + appName + "/list-sub-components?id=simple.war&appname=" + appName);
             assertThat(response.getStatus(), equalTo(200));
             subComponents = response.readEntity(String.class);
             assertThat(subComponents, stringContainsInOrder(HelloServlet.class.getName()));
@@ -110,30 +115,28 @@
     @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 = Map.of("id", instanceName, "node", "localhost-domain1");
         Map<String, String> applicationRef = Map.of("id", appName, "target", instanceName);
-
         try {
-            Response response = post(URL_CREATE_INSTANCE, newInstance);
+            Response response = managementClient.post(URL_CREATE_INSTANCE, newInstance);
             assertThat(response.getStatus(), equalTo(200));
 
             deployApp(getWar("test"), appName, appName);
 
-            response = post (appRefUrl, applicationRef);
+            response = managementClient.post(appRefUrl, applicationRef);
             assertThat(response.getStatus(), equalTo(200));
 
-            response = get(appRefUrl + "/" + appName);
+            response = managementClient.get(appRefUrl + "/" + appName);
             assertThat(response.getStatus(), equalTo(200));
 
-            response = delete(appRefUrl + "/" + appName, Map.of("target", instanceName));
+            response = managementClient.delete(appRefUrl + "/" + appName, Map.of("target", instanceName));
             assertThat(response.getStatus(), equalTo(200));
         } finally {
-            Response response = delete("domain/servers/server/" + instanceName + "/delete-instance");
+            Response response = managementClient.delete("/domain/servers/server/" + instanceName + "/delete-instance");
             assertThat(response.getStatus(), equalTo(200));
-            response = get("domain/servers/server/" + instanceName);
+            response = managementClient.get("/domain/servers/server/" + instanceName);
             assertEquals(404, response.getStatus());
             undeployApp(appName);
         }
@@ -141,43 +144,45 @@
 
     @Test
     public void testGetContextRoot() throws URISyntaxException {
-        final String appName = "testApp" + generateRandomString();
         try {
             Map<String, String> deployedApp = deployApp(getEar("simple"), appName, appName);
             assertEquals(appName, deployedApp.get("name"));
             Map<String, String> contextRootPayload = Map.of("appname", appName, "modulename", "simple");
-            Response response = get("domain/applications/application/" + appName + "/get-context-root", contextRootPayload);
+            Response response = managementClient
+                .get("/domain/applications/application/" + appName + "/get-context-root", contextRootPayload);
             assertThat(response.getStatus(), equalTo(200));
             assertThat(response.readEntity(String.class),
-                stringContainsInOrder("command", "_get-context-root AdminCommand", "exit_code", "SUCCESS",
-                    "--appname", appName, "--modulename", "simple", "method", "GET"));
+                stringContainsInOrder("command", "_get-context-root AdminCommand", "exit_code", "SUCCESS", "--appname",
+                    appName, "--modulename", "simple", "method", "GET"));
         } finally {
             undeployApp(appName);
         }
     }
 
+
     @Test
     public void testUndeploySubActionWarnings() throws URISyntaxException {
-        final String appName = "testApp" + generateRandomString();
         final String serverName = "in" + generateRandomNumber();
         try {
-            Response response = post ("domain/create-instance", Map.of("id", serverName, "node", "localhost-domain1"));
+            Response response = managementClient.post("/domain/create-instance",
+                Map.of("id", serverName, "node", "localhost-domain1"));
             assertThat(response.getStatus(), equalTo(200));
 
-            response = post("domain/servers/server/" + serverName + "/start-instance");
+            response = managementClient.post("/domain/servers/server/" + serverName + "/start-instance");
             assertThat(response.getStatus(), equalTo(200));
 
             deployApp(getWar("test"), appName, appName);
             addAppRef(appName, serverName);
 
-            response = post("domain/servers/server/" + serverName + "/stop-instance");
+            response = managementClient.post("/domain/servers/server/" + serverName + "/stop-instance");
             assertThat(response.getStatus(), equalTo(200));
 
-            response = delete("domain/applications/application/" + appName, Map.of("target", "domain"));
+            response = managementClient.delete("/domain/applications/application/" + appName,
+                Map.of("target", "domain"));
             assertThat(response.readEntity(String.class),
                 stringContainsInOrder("deleted successfully", "exit_code", "SUCCESS"));
         } finally {
-            delete("domain/applications/application/" + appName, Map.of("target", "domain"));
+            managementClient.delete("/domain/applications/application/" + appName, Map.of("target", "domain"));
         }
     }
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/AuthRealmITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/AuthRealmITest.java
index 02033d7..7466a75 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/AuthRealmITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/AuthRealmITest.java
@@ -44,17 +44,17 @@
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 public class AuthRealmITest extends RestTestBase {
-    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";
+    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";
 
     @Test
     public void testListGroupNames() {
-        Response response = get(URL_LIST_GROUP_NAMES, Map.of("userName", "admin", "realmName", "admin-realm"));
+        Response response = managementClient.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);
@@ -65,7 +65,7 @@
 
     @Test
     public void testListAdminUsers() {
-        Response response = get(URL_LIST_ADMIN_REALM_USERS);
+        Response response = managementClient.get(URL_LIST_ADMIN_REALM_USERS);
         assertEquals(200, response.getStatus());
         final String entity = response.readEntity(String.class);
         Map<String, ?> responseMap = MarshallingUtils.buildMapFromDocument(entity);
@@ -82,7 +82,7 @@
 
     @Test
     public void testSupportsUserManagement() {
-        List<String> groups = getCommandResults(get(URL_SUPPORTS_USER_MANAGEMENT));
+        List<String> groups = getCommandResults(managementClient.get(URL_SUPPORTS_USER_MANAGEMENT));
         assertEquals("true", groups.get(0));
     }
 
@@ -91,19 +91,19 @@
     public void testUserManagement() {
         final String userName = "user" + generateRandomString();
         {
-            Response response = post(URL_CREATE_USER, Map.of("id", userName, "AS_ADMIN_USERPASSWORD", "password"));
+            Response response = managementClient.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));
+            List<String> values = getCommandResults(managementClient.get(URL_LIST_FILE_USERS));
             assertThat(values, hasItem(userName));
         }
         {
-            Response response = delete(URL_DELETE_USER, Map.of("id", userName));
+            Response response = managementClient.delete(URL_DELETE_USER, Map.of("id", userName));
             assertEquals(200, response.getStatus());
         }
         {
-            List<String> values = getCommandResults(get(URL_LIST_FILE_USERS));
+            List<String> values = getCommandResults(managementClient.get(URL_LIST_FILE_USERS));
             assertThat(values, not(hasItem(userName)));
         }
     }
@@ -111,7 +111,7 @@
 
     @Test
     public void testListAuthRealmClassNames() {
-        List<String> classNameList = getCommandResults(get(URL_AUTH_REALM_CLASS_NAMES));
+        List<String> classNameList = getCommandResults(managementClient.get(URL_AUTH_REALM_CLASS_NAMES));
         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);
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ClusterITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ClusterITest.java
index 68a72f6..062970c 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ClusterITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ClusterITest.java
@@ -37,7 +37,7 @@
         final String clusterName = "cluster_" + generateRandomString();
         createCluster(clusterName);
 
-        Map<String, String> entity = getEntityValues(get(URL_CLUSTER + "/" + clusterName));
+        Map<String, String> entity = getEntityValues(managementClient.get(URL_CLUSTER + "/" + clusterName));
         assertEquals(clusterName + "-config", entity.get("configRef"));
 
         deleteCluster(clusterName);
@@ -46,16 +46,16 @@
     @Test
     public void testListLifecycleModules() {
         final String clusterName = "cluster_" + generateRandomString();
-        Response response = post(URL_CLUSTER, Map.of("id", clusterName));
+        Response response = managementClient.post(URL_CLUSTER, Map.of("id", clusterName));
         assertThat(response.getStatus(), equalTo(200));
 
-        response = get(URL_CLUSTER + "/" + clusterName + "/list-lifecycle-modules");
+        response = managementClient.get(URL_CLUSTER + "/" + clusterName + "/list-lifecycle-modules");
         assertThat(response.getStatus(), equalTo(200));
 
-        response = delete(URL_CLUSTER + "/" + clusterName);
+        response = managementClient.delete(URL_CLUSTER + "/" + clusterName);
         assertThat(response.getStatus(), equalTo(200));
 
-        response = get(URL_CLUSTER + "/" + clusterName);
+        response = managementClient.get(URL_CLUSTER + "/" + clusterName);
         assertEquals(404, response.getStatus());
     }
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ConfigITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ConfigITest.java
index 4f9cb1f..8d82383 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ConfigITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ConfigITest.java
@@ -45,7 +45,7 @@
         MultivaluedHashMap<String, String> formData = new MultivaluedHashMap<>();
         formData.add("id", "default-config");
         formData.add("id", "server-config");
-        Response response = post(URL_CONFIGS + "/copy-config", formData);
+        Response response = managementClient.post(URL_CONFIGS + "/copy-config", formData);
         // FIXME: causes HTTP 500 without any log, should be 422.
         assertThat(response.getStatus(), equalTo(500));
     }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/DomainITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/DomainITest.java
index 532094e..dcda4de 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/DomainITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/DomainITest.java
@@ -33,9 +33,11 @@
 
 public class DomainITest extends RestTestBase {
 
+    private static final String URL_DOMAIN = "/domain";
+
     @Test
     public void testDomainGet() throws Exception {
-        Response response0 = get("domain");
+        Response response0 = managementClient.get(URL_DOMAIN);
         assertThat(response0.getStatus(), equalTo(200));
         Map<String, String> current = getEntityValues(response0);
 
@@ -47,11 +49,11 @@
 
         Map<String, String> payload = new HashMap<>();
         payload.put("locale", newLocale);
-        Response response = post("domain", payload);
+        Response response = managementClient.post(URL_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(managementClient.get(URL_DOMAIN));
         assertEquals(newLocale, map.get("locale"));
     }
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ElementStarITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ElementStarITest.java
index c10e9a1..6c83feb 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ElementStarITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ElementStarITest.java
@@ -37,7 +37,7 @@
  * @author jasonlee
  */
 public class ElementStarITest extends RestTestBase {
-    private static final String URL_CREATE_INSTANCE = "domain/create-instance";
+    private static final String URL_CREATE_INSTANCE = "/domain/create-instance";
 
     private String instanceName1;
     private String instanceName2;
@@ -47,20 +47,23 @@
         instanceName1 = "instance_" + generateRandomString();
         instanceName2 = "instance_" + generateRandomString();
 
-        Response response = post(URL_CREATE_INSTANCE, Map.of("id", instanceName1, "node", "localhost-domain1"));
+        Response response = managementClient.post(URL_CREATE_INSTANCE,
+            Map.of("id", instanceName1, "node", "localhost-domain1"));
         assertThat(response.getStatus(), equalTo(200));
-        response = post(URL_CREATE_INSTANCE, Map.of("id", instanceName2, "node", "localhost-domain1"));
+        response = managementClient.post(URL_CREATE_INSTANCE, Map.of("id", instanceName2, "node", "localhost-domain1"));
         assertEquals(200, response.getStatus());
     }
 
+
     @AfterEach
     public void after() {
-        Response response = delete("domain/servers/server/" + instanceName1 + "/delete-instance");
+        Response response = managementClient.delete("/domain/servers/server/" + instanceName1 + "/delete-instance");
         assertEquals(200, response.getStatus());
-        response = delete("domain/servers/server/" + instanceName2 + "/delete-instance");
+        response = managementClient.delete("/domain/servers/server/" + instanceName2 + "/delete-instance");
         assertEquals(200, response.getStatus());
     }
 
+
     @Test
     public void testApplications() throws URISyntaxException {
         final String app1 = "app" + generateRandomString();
@@ -71,29 +74,33 @@
         addAppRef(app1, instanceName1);
         addAppRef(app2, instanceName1);
 
-        Response response = get("domain/servers/server/" + instanceName1 + "/application-ref");
+        Response response = managementClient.get("/domain/servers/server/" + instanceName1 + "/application-ref");
         Map<String, String> children = this.getChildResources(response);
         assertThat(children, aMapWithSize(2));
     }
 
+
     @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 = managementClient.get("/domain/servers/server/server/resource-ref");
         Map<String, String> children = this.getChildResources(response);
         assertThat(children, aMapWithSize(7));
     }
 
+
     @Test
     public void testLoadBalancerConfigs() {
         final String lbName = "lbconfig-" + generateRandomString();
-        Response response = post("domain/lb-configs/lb-config/", Map.of("id", lbName, "target", instanceName1));
+        Response response = managementClient.post("/domain/lb-configs/lb-config/",
+            Map.of("id", lbName, "target", instanceName1));
         assertEquals(200, response.getStatus());
 
-        response = post("domain/lb-configs/lb-config/" + lbName + "/create-http-lb-ref", Map.of("id", instanceName2));
+        response = managementClient.post("/domain/lb-configs/lb-config/" + lbName + "/create-http-lb-ref",
+            Map.of("id", instanceName2));
         assertEquals(200, response.getStatus());
 
-        response = get ("domain/lb-configs/lb-config/" + lbName + "/server-ref");
+        response = managementClient.get("/domain/lb-configs/lb-config/" + lbName + "/server-ref");
         Map<String, String> children = getChildResources(response);
         assertThat(children, aMapWithSize(1));
     }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ExternalResourceITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ExternalResourceITest.java
index be1425e..2128d65 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ExternalResourceITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ExternalResourceITest.java
@@ -31,7 +31,7 @@
  */
 public class ExternalResourceITest extends RestTestBase {
 
-    private static final String URL_EXTERNAL_RESOURCE = "domain/resources/external-jndi-resource";
+    private static final String URL_EXTERNAL_RESOURCE = "/domain/resources/external-jndi-resource";
 
     @Test
     public void createAndDeleteExternalResource() {
@@ -43,13 +43,13 @@
             "factoryClass", "org.glassfish.resources.custom.factory.PrimitivesAndStringFactory",
             "restype", Double.class.getName()
         );
-        Response response = post(URL_EXTERNAL_RESOURCE, newResource);
+        Response response = managementClient.post(URL_EXTERNAL_RESOURCE, newResource);
         assertThat(response.getStatus(), equalTo(200));
 
-        response = get(URL_EXTERNAL_RESOURCE + "/" + resourceName);
+        response = managementClient.get(URL_EXTERNAL_RESOURCE + "/" + resourceName);
         assertThat(response.getStatus(), equalTo(200));
 
-        response = delete(URL_EXTERNAL_RESOURCE + "/" + resourceName);
+        response = managementClient.delete(URL_EXTERNAL_RESOURCE + "/" + resourceName);
         assertThat(response.getStatus(), equalTo(200));
     }
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/JdbcITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/JdbcITest.java
index 4cb903e..090f918 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/JdbcITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/JdbcITest.java
@@ -38,7 +38,7 @@
 
     @Test
     public void testReadingPoolEntity() {
-        Map<String, String> entity = getEntityValues(get(URL_JDBC_CONNECTION_POOL + "/__TimerPool"));
+        Map<String, String> entity = getEntityValues(managementClient.get(URL_JDBC_CONNECTION_POOL + "/__TimerPool"));
         assertEquals("__TimerPool", entity.get("name"));
     }
 
@@ -49,16 +49,16 @@
         Map<String, String> params = new HashMap<>();
         params.put("name", poolName);
         params.put("datasourceClassname", "org.apache.derby.jdbc.ClientDataSource");
-        Response response = post(URL_JDBC_CONNECTION_POOL, params);
+        Response response = managementClient.post(URL_JDBC_CONNECTION_POOL, params);
         assertEquals(200, response.getStatus());
 
-        Map<String, String> entity = getEntityValues(get(URL_JDBC_CONNECTION_POOL + "/" + poolName));
+        Map<String, String> entity = getEntityValues(managementClient.get(URL_JDBC_CONNECTION_POOL + "/" + poolName));
         assertThat(entity, aMapWithSize(greaterThan(40)));
 
-        response = delete(URL_JDBC_CONNECTION_POOL + "/" + poolName, Map.of());
+        response = managementClient.delete(URL_JDBC_CONNECTION_POOL + "/" + poolName, Map.of());
         assertEquals(200, response.getStatus());
 
-        response = get(URL_JDBC_CONNECTION_POOL + "/" + poolName);
+        response = managementClient.get(URL_JDBC_CONNECTION_POOL + "/" + poolName);
         assertEquals(404, response.getStatus());
     }
 
@@ -71,18 +71,18 @@
         params.put("name", poolName);
         params.put("poolName", "DerbyPool");
 
-        Response response = post(URL_JDBC_RESOURCE, params);
+        Response response = managementClient.post(URL_JDBC_RESOURCE, params);
         assertEquals(500, response.getStatus());
 
-        Response responseGet = get(URL_JDBC_CONNECTION_POOL + "/" + encodedPoolName);
+        Response responseGet = managementClient.get(URL_JDBC_CONNECTION_POOL + "/" + encodedPoolName);
         assertEquals(500, response.getStatus());
         Map<String, String> entity = getEntityValues(responseGet);
         assertNull(entity);
 
-        response = delete("/" + encodedPoolName, Map.of());
+        response = managementClient.delete("/" + encodedPoolName, Map.of());
         assertEquals(500, response.getStatus());
 
-        response = get(URL_JDBC_CONNECTION_POOL + "/" + encodedPoolName);
+        response = managementClient.get(URL_JDBC_CONNECTION_POOL + "/" + encodedPoolName);
         assertEquals(500, response.getStatus());
     }
 
@@ -91,7 +91,7 @@
     public void createDuplicateResource() {
         final String resourceName = "jdbc/__default";
         Map<String, String> params = Map.of("id", resourceName, "poolName", "DerbyPool");
-        Response response = post(URL_JDBC_RESOURCE, params);
+        Response response = managementClient.post(URL_JDBC_RESOURCE, params);
         assertEquals(500, response.getStatus());
     }
 
@@ -101,7 +101,7 @@
         final String poolName = "DerbyPool";
         Map<String, String> params = Map.of("id", poolName, "datasourceClassname",
             "org.apache.derby.jdbc.ClientDataSource");
-        Response response = post(URL_JDBC_CONNECTION_POOL, params);
+        Response response = managementClient.post(URL_JDBC_CONNECTION_POOL, params);
         assertEquals(500, response.getStatus());
     }
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/JmsITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/JmsITest.java
index 748ac67..1757b0e 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/JmsITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/JmsITest.java
@@ -33,18 +33,17 @@
 import static org.hamcrest.Matchers.greaterThanOrEqualTo;
 import static org.hamcrest.Matchers.stringContainsInOrder;
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * @author jasonlee
  * @since May 26, 2010
  */
 public class JmsITest 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
@@ -53,39 +52,39 @@
         final String poolName = "JmsConnectionFactory" + generateRandomString();
         Map<String, String> ccp_attrs = Map.of("name", poolName, "connectiondefinition",
             "jakarta.jms.ConnectionFactory", "raname", "jmsra");
-        Response response = post(URL_CONNECTOR_CONNECTION_POOL, ccp_attrs);
+        Response response = managementClient.post(URL_CONNECTOR_CONNECTION_POOL, ccp_attrs);
         assertThat(response.getStatus(), equalTo(200));
 
         // Check connection pool creation
-        Map<String, String> pool = getEntityValues(get(URL_CONNECTOR_CONNECTION_POOL + "/" + poolName));
+        Map<String, String> pool = getEntityValues(managementClient.get(URL_CONNECTOR_CONNECTION_POOL + "/" + poolName));
         assertThat(pool, aMapWithSize(greaterThanOrEqualTo(26)));
 
         // Create connector resource
         String resourceName = poolName + "Resource";
         Map<String, String> cr_attrs = Map.of("name", resourceName, "poolname", poolName);
-        response = post(URL_CONNECTOR_RESOURCE, cr_attrs);
+        response = managementClient.post(URL_CONNECTOR_RESOURCE, cr_attrs);
         assertThat(response.getStatus(), equalTo(200));
 
         // Check connector resource
-        Map<String, String> resource = getEntityValues(get(URL_CONNECTOR_RESOURCE + "/" + resourceName));
+        Map<String, String> resource = getEntityValues(managementClient.get(URL_CONNECTOR_RESOURCE + "/" + resourceName));
         assertThat(resource, aMapWithSize(6));
 
         // Edit and check ccp
-        response = post(URL_CONNECTOR_CONNECTION_POOL + "/" + poolName, Map.of("description", poolName));
+        response = managementClient.post(URL_CONNECTOR_CONNECTION_POOL + "/" + poolName, Map.of("description", poolName));
         assertThat(response.getStatus(), equalTo(200));
 
-        pool = getEntityValues(get(URL_CONNECTOR_CONNECTION_POOL + "/" + poolName));
-        assertTrue(pool.get("description").equals(poolName));
+        pool = getEntityValues(managementClient.get(URL_CONNECTOR_CONNECTION_POOL + "/" + poolName));
+        assertThat(pool.get("description"), equalTo(poolName));
 
         // Edit and check cr
-        response = post(URL_CONNECTOR_RESOURCE + "/" + resourceName, Map.of("description", poolName));
+        response = managementClient.post(URL_CONNECTOR_RESOURCE + "/" + resourceName, Map.of("description", poolName));
         assertThat(response.getStatus(), equalTo(200));
 
-        resource = getEntityValues(get(URL_CONNECTOR_RESOURCE + "/" + resourceName));
-        assertTrue(pool.get("description").equals(poolName));
+        resource = getEntityValues(managementClient.get(URL_CONNECTOR_RESOURCE + "/" + resourceName));
+        assertThat(pool.get("description"), equalTo(poolName));
 
         // Delete objects
-        response = delete(URL_CONNECTOR_CONNECTION_POOL + "/" + poolName, Map.of("cascade", "true"));
+        response = managementClient.delete(URL_CONNECTOR_CONNECTION_POOL + "/" + poolName, Map.of("cascade", "true"));
         assertThat(response.getStatus(), equalTo(200));
     }
 
@@ -96,13 +95,14 @@
 
         Map<String, String> attrs = Map.of("id", jndiName, "raname", "jmsra", "restype", "jakarta.jms.Topic");
 
-        Response response = post(URL_ADMIN_OBJECT_RESOURCE, attrs);
+        Response response = managementClient.post(URL_ADMIN_OBJECT_RESOURCE, attrs);
         assertThat(response.getStatus(), equalTo(200));
 
-        Map<String, String> entity = getEntityValues(get(URL_ADMIN_OBJECT_RESOURCE + "/" + encodedJndiName));
+        Map<String, String> entity = getEntityValues(
+            managementClient.get(URL_ADMIN_OBJECT_RESOURCE + "/" + encodedJndiName));
         assertThat(entity, aMapWithSize(8));
 
-        response = delete(URL_ADMIN_OBJECT_RESOURCE + "/" + encodedJndiName);
+        response = managementClient.delete(URL_ADMIN_OBJECT_RESOURCE + "/" + encodedJndiName);
         assertThat(response.getStatus(), equalTo(200));
     }
 
@@ -118,12 +118,12 @@
         Map<String, String> destProps = new HashMap<>(newDest);
         destProps.putAll(Map.of("property", "MaxNumMsgs=" + maxNumMsgs + ":ConsumerFlowLimit=" + consumerFlowLimit));
 
-        Response response = get(URL_SEVER_JMS_DEST + "/__get-jmsdest", newDest);
+        Response response = managementClient.get(URL_SEVER_JMS_DEST + "/__get-jmsdest", newDest);
         assertThat(response.getStatus(), equalTo(200));
 
-        response = post(URL_SEVER_JMS_DEST + "/__update-jmsdest", destProps);
+        response = managementClient.post(URL_SEVER_JMS_DEST + "/__update-jmsdest", destProps);
         assertThat(response.getStatus(), equalTo(200));
-        response = get(URL_SEVER_JMS_DEST + "/__get-jmsdest", newDest);
+        response = managementClient.get(URL_SEVER_JMS_DEST + "/__get-jmsdest", newDest);
         assertThat(response.getStatus(), equalTo(200));
         Map<String, String> entity = getEntityValues(response);
         assertEquals(maxNumMsgs, entity.get("MaxNumMsgs"));
@@ -140,14 +140,14 @@
         final String clusterName = createCluster();
         createClusterInstance(clusterName, "in1_" + clusterName);
         startCluster(clusterName);
-        final String endpoint = "domain/clusters/cluster/" + clusterName;
+        final String endpoint = "/domain/clusters/cluster/" + clusterName;
         try {
             createJmsPhysicalDestination(destName, "topic", endpoint);
             final Map<String, String> newDest = Map.of("id", destName, "desttype", DEST_TYPE);
-            Response response = get(endpoint + "/__get-jmsdest", newDest);
+            Response response = managementClient.get(endpoint + "/__get-jmsdest", newDest);
             assertThat(response.getStatus(), equalTo(200));
 
-            response = get(URL_SEVER_JMS_DEST + "/__get-jmsdest", newDest);
+            response = managementClient.get(URL_SEVER_JMS_DEST + "/__get-jmsdest", newDest);
             assertThat(response.getStatus(), equalTo(200));
         } finally {
             deleteJmsPhysicalDestination(destName, endpoint);
@@ -158,14 +158,14 @@
 
     @Test
     public void testJmsPing() {
-        String results = get(URL_SEVER_JMS_DEST + "/jms-ping").readEntity(String.class);
+        String results = managementClient.get(URL_SEVER_JMS_DEST + "/jms-ping").readEntity(String.class);
         assertThat(results, stringContainsInOrder("JMS-ping command executed successfully"));
     }
 
     @Test
     public void testJmsFlush() {
         Map<String, String> payload = Map.of("id", "mq.sys.dmq", "destType", "queue");
-        Response response = post(URL_SEVER_JMS_DEST + "/flush-jmsdest", payload);
+        Response response = managementClient.post(URL_SEVER_JMS_DEST + "/flush-jmsdest", payload);
         assertThat(response.getStatus(), equalTo(200));
     }
 
@@ -176,36 +176,36 @@
             "adminUserName", "admin", "host", "localhost");
 
         // Test create
-        Response response = post(URL_JMS_HOST, newHost);
+        Response response = managementClient.post(URL_JMS_HOST, newHost);
         assertThat(response.getStatus(), equalTo(200));
 
         // Test edit
-        Map<String, String> entity = getEntityValues(get(URL_JMS_HOST + "/" + jmsHostName));
+        Map<String, String> entity = getEntityValues(managementClient.get(URL_JMS_HOST + "/" + jmsHostName));
         assertThat(entity, aMapWithSize(greaterThanOrEqualTo(6)));
         assertEquals(jmsHostName, entity.get("name"));
         entity.put("port", "8686");
-        response = post(URL_JMS_HOST + "/" + jmsHostName, entity);
+        response = managementClient.post(URL_JMS_HOST + "/" + jmsHostName, entity);
         assertThat(response.getStatus(), equalTo(200));
-        entity = getEntityValues(get(URL_JMS_HOST + "/" + jmsHostName));
+        entity = getEntityValues(managementClient.get(URL_JMS_HOST + "/" + jmsHostName));
         assertEquals("8686", entity.get("port"));
 
         // Test delete
-        response = delete(URL_JMS_HOST + "/" + jmsHostName);
+        response = managementClient.delete(URL_JMS_HOST + "/" + jmsHostName);
         assertThat(response.getStatus(), equalTo(200));
     }
 
     public void createJmsPhysicalDestination(final String destName, final String type, final String endpoint) {
         final Map<String, String> newDest = Map.of("id", destName, "desttype", type);
-        Response response = post(endpoint + "/create-jmsdest", newDest);
+        Response response = managementClient.post(endpoint + "/create-jmsdest", newDest);
         assertThat(response.getStatus(), equalTo(200));
     }
 
     public void deleteJmsPhysicalDestination(final String destName, final String endpoint) {
         final Map<String, String> newDest = Map.of("id", destName, "desttype", DEST_TYPE);
-        Response response = delete(endpoint + "/delete-jmsdest", newDest);
+        Response response = managementClient.delete(endpoint + "/delete-jmsdest", newDest);
         assertThat(response.getStatus(), equalTo(200));
 
-        response = get(endpoint + "__get-jmsdest", newDest);
+        response = managementClient.get(endpoint + "__get-jmsdest", newDest);
         assertThat(response.getStatus(), equalTo(404));
     }
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/JobsResourceITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/JobsResourceITest.java
index c56b008..246b3d5 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/JobsResourceITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/JobsResourceITest.java
@@ -20,11 +20,15 @@
 import jakarta.ws.rs.core.Response;
 
 import org.codehaus.jettison.json.JSONArray;
-import org.codehaus.jettison.json.JSONException;
 import org.codehaus.jettison.json.JSONObject;
+import org.glassfish.nucleus.test.tool.DomainAdminRestClient;
+import org.glassfish.nucleus.test.tool.asadmin.GlassFishTestEnvironment;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import static org.glassfish.nucleus.test.tool.NucleusTestUtils.nadminWithOutput;
+import static org.glassfish.nucleus.test.tool.AsadminResultMatcher.asadminOK;
+import static org.glassfish.nucleus.test.tool.asadmin.GlassFishTestEnvironment.getAsadmin;
 import static org.hamcrest.CoreMatchers.endsWith;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -35,20 +39,41 @@
  * @author jdlee
  */
 public class JobsResourceITest extends RestTestBase {
-    public static final String URL_JOBS = "jobs";
+
+    private static final String GF_JSON_TYPE = "application/vnd.oracle.glassfish+json";
+    private static final String URL_JOBS = "/jobs";
+
+    private DomainAdminRestClient client;
+    private String jobId;
+
+    @BeforeEach
+    public void initInstanceClient() {
+        client = new DomainAdminRestClient(getBaseAdminUrl() + "/management", GF_JSON_TYPE);
+    }
+
+
+    @AfterEach
+    public void closeInstanceClient() {
+        if (jobId != null) {
+            GlassFishTestEnvironment.getAsadmin().exec("attach", jobId);
+        }
+        if (client != null) {
+            client.close();
+        }
+    }
 
     @Test
     public void testJobsListing() {
-        assertEquals(200, get(URL_JOBS).getStatus());
+        assertEquals(200, client.get(URL_JOBS).getStatus());
     }
 
     @Test
     public void testGetJob() throws Exception {
         // make sure we have at least one detached job
-        nadminWithOutput("--detach", "uptime");
+        assertThat(getAsadmin().exec("--detach", "uptime"), asadminOK());
 
         // verify getting the collection
-        Response response = get(URL_JOBS);
+        Response response = client.get(URL_JOBS);
         assertEquals(200, response.getStatus());
 
         // verify the overall structure
@@ -56,6 +81,7 @@
         JSONArray resources = json.getJSONArray("resources");
         assertNotNull(resources);
         assertThat(resources.length(), equalTo(1));
+
         JSONArray items = json.getJSONArray("items");
         assertNotNull(items);
         assertThat(items.length(), equalTo(1));
@@ -67,21 +93,27 @@
         String uri = resource.getString("uri");
         assertNotNull(uri);
         assertEquals("job", resource.getString("rel"));
-        String jobId = resource.getString("title");
+
+        jobId = resource.getString("title");
         assertNotNull(jobId);
         assertThat(uri, endsWith(URL_JOBS + "/id/" + jobId));
 
         // verify the job it refers to by following the link.
         // it should only have a parent link
-        response = get(uri);
-        assertEquals(200, response.getStatus());
-        json = response.readEntity(JSONObject.class);
+        try (GenericClient genericClient = new GenericClient()) {
+            response = genericClient.get(uri);
+            assertThat(response.getStatus(), equalTo(200));
+            json = response.readEntity(JSONObject.class);
+        }
         JSONObject item = json.getJSONObject("item");
         System.out.println(item.toString());
-        verifyItem(jobId, item);
+        assertNotNull(item);
+        assertEquals(jobId, item.getString("jobId"));
+
         resources = json.getJSONArray("resources");
         assertNotNull(resources);
         assertThat(resources.length(), equalTo(1));
+
         resource = resources.getJSONObject(0);
         assertEquals("parent", resource.getString("rel"));
         assertThat(resource.getString("uri"), endsWith(URL_JOBS));
@@ -94,16 +126,14 @@
                 item = thisItem;
             }
         }
-        verifyItem(jobId, item);
+        assertNotNull(item);
+        assertEquals(jobId, item.getString("jobId"));
     }
 
-    private void verifyItem(String expectedJobId, JSONObject jobJsonObject) throws JSONException {
-        assertNotNull(jobJsonObject);
-        assertEquals(expectedJobId, jobJsonObject.getString("jobId"));
-    }
 
-    @Override
-    protected String getResponseType() {
-        return "application/vnd.oracle.glassfish+json";
+    private static class GenericClient extends DomainAdminRestClient {
+        public GenericClient() {
+            super(GlassFishTestEnvironment.createClient(), "", GF_JSON_TYPE);
+        }
     }
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/JvmOptionsITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/JvmOptionsITest.java
index 24e0260..18beffe 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/JvmOptionsITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/JvmOptionsITest.java
@@ -21,7 +21,6 @@
 import jakarta.ws.rs.core.MultivaluedMap;
 import jakarta.ws.rs.core.Response;
 
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -31,27 +30,29 @@
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.CoreMatchers.hasItems;
+import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.allOf;
 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 JvmOptionsITest extends RestTestBase {
-    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";
+    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";
 
-    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_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";
 
-    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 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 static RestTestBase configManagement;
     private String testConfigName;
@@ -71,7 +72,7 @@
             add("id", testConfigName);
         }};
         configManagement.createAndVerifyConfig(testConfigName, formData);
-        testConfigUrl = "domain/configs/config/" + testConfigName;
+        testConfigUrl = "/domain/configs/config/" + testConfigName;
         testConfigJvmOptionsUrl = testConfigUrl + "/java-config/jvm-options";
     }
 
@@ -83,7 +84,7 @@
 
     @Test
     public void getJvmOptions() {
-        Response response = get(URL_SERVER_JVM_OPTIONS);
+        Response response = managementClient.get(URL_SERVER_JVM_OPTIONS);
         assertEquals(200, response.getStatus());
         Map<String, ?> responseMap = MarshallingUtils.buildMapFromDocument(response.readEntity(String.class));
         List<String> jvmOptions = (List<String>)((Map)responseMap.get("extraProperties")).get("leafList");
@@ -93,90 +94,75 @@
     @Test
     public void createAndDeleteOptions() {
         final String option1Name = "-Doption" + generateRandomString();
-        Map<String, String> newOptions = new HashMap<>() {{
-            put(option1Name, "someValue");
-        }};
+        Map<String, String> newOptions = Map.of(option1Name, "someValue");
 
-        Response response = post(testConfigJvmOptionsUrl, newOptions);
+        Response response = managementClient.post(testConfigJvmOptionsUrl, newOptions);
         assertEquals(200, response.getStatus());
-        response = get(testConfigJvmOptionsUrl);
+        response = managementClient.get(testConfigJvmOptionsUrl);
         List<String> jvmOptions = getJvmOptions(response);
-        assertTrue(jvmOptions.contains(option1Name+"=someValue"));
+        assertThat(jvmOptions, hasItem(option1Name + "=someValue"));
 
-        response = delete(testConfigJvmOptionsUrl, newOptions);
+        response = managementClient.delete(testConfigJvmOptionsUrl, newOptions);
         assertEquals(200, response.getStatus());
-        response = get(testConfigJvmOptionsUrl);
+        response = managementClient.get(testConfigJvmOptionsUrl);
         jvmOptions = getJvmOptions(response);
-        assertFalse(jvmOptions.contains(option1Name+"=someValue"));
+        assertThat(jvmOptions, not(hasItem(option1Name + "=someValue")));
     }
 
     @Test
     public void createAndDeleteOptionsWithBackslashes() {
         final String optionName = "-Dfile" + generateRandomString();
         final String optionValue = "C:\\ABC\\DEF\\";
-        Map<String, String> newOptions = new HashMap<>() {{
-            put(optionName, escape(optionValue));
-        }};
+        Map<String, String> newOptions = Map.of(optionName, escape(optionValue));
 
-        Response response = post(testConfigJvmOptionsUrl, newOptions);
+        Response response = managementClient.post(testConfigJvmOptionsUrl, newOptions);
         assertEquals(200, response.getStatus());
-        response = get(testConfigJvmOptionsUrl);
+        response = managementClient.get(testConfigJvmOptionsUrl);
         List<String> jvmOptions = getJvmOptions(response);
-        assertTrue(jvmOptions.contains(optionName+"="+optionValue));
+        assertThat(jvmOptions, hasItem(optionName + "=" + optionValue));
 
-        response = delete(testConfigJvmOptionsUrl, newOptions);
+        response = managementClient.delete(testConfigJvmOptionsUrl, newOptions);
         assertEquals(200, response.getStatus());
-        response = get(testConfigJvmOptionsUrl);
+        response = managementClient.get(testConfigJvmOptionsUrl);
         jvmOptions = getJvmOptions(response);
-        assertFalse(jvmOptions.contains(optionName+"="+optionValue));
+        assertThat(jvmOptions, not(hasItem(optionName + "=" + optionValue)));
     }
 
     @Test
     public void createAndDeleteOptionsWithoutValues() {
         final String option1Name = "-Doption" + generateRandomString();
         final String option2Name = "-Doption" + generateRandomString();
-        Map<String, String> newOptions = new HashMap<>() {{
-            put(option1Name, "");
-            put(option2Name, "");
-        }};
-
-        Response response = post(testConfigJvmOptionsUrl, newOptions);
+        Map<String, String> newOptions = Map.of(option1Name, "", option2Name, "");
+        Response response = managementClient.post(testConfigJvmOptionsUrl, newOptions);
         assertEquals(200, response.getStatus());
-        response = get(testConfigJvmOptionsUrl);
+        response = managementClient.get(testConfigJvmOptionsUrl);
         List<String> jvmOptions = getJvmOptions(response);
-        assertTrue(jvmOptions.contains(option1Name));
-        assertFalse(jvmOptions.contains(option1Name+"="));
-        assertTrue(jvmOptions.contains(option2Name));
-        assertFalse(jvmOptions.contains(option2Name+"="));
+        assertThat(jvmOptions, hasItems(option2Name, option2Name));
+        assertThat(jvmOptions, not(hasItems(option1Name + '=', option2Name + '=')));
 
-        response = delete(testConfigJvmOptionsUrl, newOptions);
+        response = managementClient.delete(testConfigJvmOptionsUrl, newOptions);
         assertEquals(200, response.getStatus());
-        response = get(testConfigJvmOptionsUrl);
+        response = managementClient.get(testConfigJvmOptionsUrl);
         jvmOptions = getJvmOptions(response);
-        assertFalse(jvmOptions.contains(option1Name));
-        assertFalse(jvmOptions.contains(option2Name));
+        assertThat(jvmOptions, allOf(not(hasItem(option1Name)), not(hasItem(option2Name))));
     }
 
     @Test
     public void testIsolatedOptionsCreationOnNewConfig() {
         final String optionName = "-Doption" + generateRandomString();
-
-        Map<String, String> newOptions = new HashMap<>() {{
-            put(optionName, "");
-            put("target", testConfigName);
-        }};
+        Map<String, String> newOptions = Map.of(optionName, "", "target", testConfigName);
 
         // Test new config to make sure option is there
-        Response response = post(testConfigJvmOptionsUrl, newOptions);
+        Response response = managementClient.post(testConfigJvmOptionsUrl, newOptions);
         assertEquals(200, response.getStatus());
-        response = get(testConfigJvmOptionsUrl);
+        response = managementClient.get(testConfigJvmOptionsUrl);
         List<String> jvmOptions = getJvmOptions(response);
-        assertTrue(jvmOptions.contains(optionName));
+        assertThat(jvmOptions, hasItem(optionName));
 
         // Test server-config to make sure the options are NOT there
-        response = get(URL_SERVER_JVM_OPTIONS);
+        response = managementClient.get(URL_SERVER_JVM_OPTIONS);
         jvmOptions = getJvmOptions(response);
-        assertFalse(jvmOptions.contains(optionName));
+        assertThat(jvmOptions, not(hasItem(optionName)));
     }
 
     @Test
@@ -187,15 +173,15 @@
         Map<String, String> newOptions = Map.of(optionName, "");
         deleteProfiler(testConfigUrl + "/java-config/profiler/delete-profiler", testConfigName, false);
 
-        Response response = post(testConfigUrl + "/java-config/create-profiler", attrs);
+        Response response = managementClient.post(testConfigUrl + "/java-config/create-profiler", attrs);
         assertEquals(200, response.getStatus());
 
-        response = post(testConfigUrl + "/java-config/profiler/jvm-options", newOptions);
+        response = managementClient.post(testConfigUrl + "/java-config/profiler/jvm-options", newOptions);
         assertEquals(200, response.getStatus());
 
-        response = get(testConfigUrl + "/java-config/profiler/jvm-options");
+        response = managementClient.get(testConfigUrl + "/java-config/profiler/jvm-options");
         List<String> jvmOptions = getJvmOptions(response);
-        assertTrue(jvmOptions.contains(optionName));
+        assertThat(jvmOptions, hasItem(optionName));
 
         deleteProfiler(testConfigUrl + "/java-config/profiler/delete-profiler", testConfigName, true);
     }
@@ -204,26 +190,24 @@
     public void testJvmOptionWithColon() {
         final String optionName = "-XX:MaxPermSize";
         final String optionValue = "152m";
-        Map<String, String> newOptions = new HashMap<>() {{
-            put(escape(optionName), optionValue);
-        }};
+        Map<String, String> newOptions = Map.of(escape(optionName), optionValue);
 
-        Response response = post(testConfigJvmOptionsUrl, newOptions);
+        Response response = managementClient.post(testConfigJvmOptionsUrl, newOptions);
         assertEquals(200, response.getStatus());
-        response = get(testConfigJvmOptionsUrl);
+        response = managementClient.get(testConfigJvmOptionsUrl);
         assertEquals(200, response.getStatus());
         List<String> jvmOptions = getJvmOptions(response);
-        assertTrue(jvmOptions.contains(optionName+"="+optionValue));
+        assertThat(jvmOptions, hasItem(optionName + '=' + optionValue));
 
-        response = delete(testConfigJvmOptionsUrl, newOptions);
+        response = managementClient.delete(testConfigJvmOptionsUrl, newOptions);
         assertEquals(200, response.getStatus());
-        response = get(testConfigJvmOptionsUrl);
+        response = managementClient.get(testConfigJvmOptionsUrl);
         jvmOptions = getJvmOptions(response);
-        assertFalse(jvmOptions.contains(optionName+"="+optionValue));
+        assertThat(jvmOptions, not(hasItem(optionName + '=' + optionValue)));
     }
 
     private void deleteProfiler(final String url, final String target, final boolean failOnError) {
-        Response response = delete(url, Map.of("target", target));
+        Response response = managementClient.delete(url, Map.of("target", target));
         if (failOnError) {
             assertEquals(200, response.getStatus());
         }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/MetadataITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/MetadataITest.java
index 27dcde0..fb15ba7 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/MetadataITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/MetadataITest.java
@@ -33,12 +33,12 @@
  * @author jasonlee
  */
 public class MetadataITest extends RestTestBase {
-    private static final String URL_CONFIG = "domain/configs/config.json";
-    private 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);
+        Response response = managementClient.options(URL_CONFIG);
         assertEquals(200, response.getStatus());
         // Really dumb test.  Should be good enough for now
 
@@ -46,21 +46,21 @@
         assertNotNull(extraProperties);
 
         // Another dumb test to make sure that "name" shows up on the HTML page
-        response = getClient().target(getAddress(URL_CONFIG)).request().get(Response.class);
+        response = managementClient.get(URL_CONFIG);
         String data = response.readEntity(String.class);
         assertThat(data, stringContainsInOrder("extraProperties"));
     }
 
     @Test
     public void upTimeMetadaDataTest() {
-        Response response = options(URL_UPTIMECOMMAND);
+        Response response = managementClient.options(URL_UPTIMECOMMAND);
         assertEquals(200, response.getStatus());
 
-        Map extraProperties = MarshallingUtils.buildMapFromDocument(response.readEntity(String.class));
+        Map<String, ?> extraProperties = MarshallingUtils.buildMapFromDocument(response.readEntity(String.class));
         assertNotNull(extraProperties);
 
         // Another dumb test to make sure that "extraProperties" shows up on the HTML page
-        response = getClient().target(getAddress(URL_UPTIMECOMMAND)).request().get(Response.class);
+        response = managementClient.get(URL_UPTIMECOMMAND);
         String resp = response.readEntity(String.class);
         assertThat(resp, stringContainsInOrder("extraProperties"));
         // test to see if we get the milliseconds parameter description which is an
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/MonitoringITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/MonitoringITest.java
index 0ad5cdf..fbf87af 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/MonitoringITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/MonitoringITest.java
@@ -19,31 +19,60 @@
 
 
 import jakarta.ws.rs.core.Response;
+
 import java.util.HashMap;
 import java.util.Map;
 
+import org.glassfish.nucleus.test.tool.DomainAdminRestClient;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
 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 static org.hamcrest.CoreMatchers.anyOf;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.aMapWithSize;
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 /**
+ * Note regards HTTP 200/202 - not sure why it is happening, but the server probably needs some time
+ * to propagate changes, while we request another.
+ *
  * @author Mitesh Meswani
  */
 @TestMethodOrder(OrderAnnotation.class)
 public class MonitoringITest 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";
-    private static final String PING_CONNECTION_POOL_URL = "domain/resources/ping-connection-pool";
-    private static final String CONTEXT_ROOT_MONITORING = "monitoring";
+
+    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";
+    private static final String PING_CONNECTION_POOL_URL = "/domain/resources/ping-connection-pool";
+    private static final String POOL_NAME_W_DOT = "poolNameWith.dot";
+
+    private static DomainAdminRestClient monitoringClient;
+
+    @BeforeAll
+    public static void init() {
+        monitoringClient = new DomainAdminRestClient(getBaseAdminUrl() + "/monitoring");
+    }
+
+
+    @AfterAll
+    public static void closeResources() {
+        Response responseDel = managementClient.delete(JDBC_CONNECTION_POOL_URL + '/' + POOL_NAME_W_DOT);
+        assertThat(responseDel.getStatus(), anyOf(equalTo(200), equalTo(202), equalTo(404)));
+        if (monitoringClient != null) {
+            monitoringClient.close();
+        }
+    }
+
 
     @Test
     @Order(1)
     public void enableMonitoring() {
-        String url = getManagementURL(MONITORING_RESOURCE_URL);
         Map<String, String> payLoad = new HashMap<>() {
             {
                 put("ThreadPool", "HIGH");
@@ -64,8 +93,8 @@
                 put("Jersey", "HIGH");
             }
         };
-        Response response = post(url, payLoad);
-        assertEquals(202, response.getStatus());
+        Response response = managementClient.post(MONITORING_RESOURCE_URL, payLoad);
+        assertThat(response.getStatus(), anyOf(equalTo(200), equalTo(202)));
     }
 
     /**
@@ -75,11 +104,11 @@
     @Test
     @Order(2)
     public void testBaseURL() {
-        Response response = get("domain");
-        assertEquals(200, response.getStatus());
+        Response response = monitoringClient.get("/domain");
+        assertThat(response.getStatus(), anyOf(equalTo(200), equalTo(202)));
         // monitoring/domain
         Map<String, String> entity = getChildResources(response);
-        assertNull(entity.get("server"), entity.toString());
+        assertNotNull(entity.get("server"), entity.toString());
     }
 
     /**
@@ -89,7 +118,7 @@
     @Test
     @Order(10)
     public void testInvalidResource() {
-        Response response = get("domain/server/foo");
+        Response response = monitoringClient.get("/domain/server/foo");
         assertEquals(404, response.getStatus(), "Did not receive ");
     }
 
@@ -100,75 +129,56 @@
     @Test
     @Order(20)
     public void testDot() {
-        // Step 1- Create a resource with "."
-        final String poolNameWithDot = "poolNameWith.dot";
+        Response responseDel = managementClient.delete(JDBC_CONNECTION_POOL_URL + '/' + POOL_NAME_W_DOT);
+        assertThat(responseDel.getStatus(), equalTo(404));
 
-        // Clean up from leftover from previous run
-        String url = getManagementURL(JDBC_CONNECTION_POOL_URL + '/' + poolNameWithDot);
-        Response responseDel = delete(url);
-        assertEquals(202, responseDel.getStatus());
-
-        url = getManagementURL(JDBC_CONNECTION_POOL_URL);
         Map<String, String> payLoad = new HashMap<>() {
             {
-                put("name", poolNameWithDot);
+                put("name", POOL_NAME_W_DOT);
                 put("resType", "javax.sql.DataSource");
                 put("datasourceClassname", "foo.bar");
             }
         };
-        Response response = post(url, payLoad);
-        assertEquals(202, response.getStatus());
-
+        Response response = managementClient.post(JDBC_CONNECTION_POOL_URL, payLoad);
+        assertThat(response.getStatus(), anyOf(equalTo(200), equalTo(202)));
 
         // Step 2- Ping the connection pool to generate some monitoring data
-        url = getManagementURL(PING_CONNECTION_POOL_URL);
-        Response responsePing = get(url, Map.of("id", poolNameWithDot));
-        assertEquals(202, responsePing.getStatus());
+        Response responsePing = managementClient.get(PING_CONNECTION_POOL_URL, Map.of("id", POOL_NAME_W_DOT));
+        // foo.bar is invalid ds class
+        assertThat(responsePing.toString(), responsePing.getStatus(), equalTo(500));
 
         // Step 3 - Access monitoring tree to assert it is accessible
-        // FIXME: As of 03.04.2022 Utils.getJerseyClient here throws exception:
-        // java.lang.ClassNotFoundException: Provider for jakarta.ws.rs.client.ClientBuilder cannot be found
-//        Response responsePool = get("domain/server/resources/" + poolNameWithDot);
-//        assertEquals(200, responsePool.getStatus());
-//        Map<String, String> responseEntity = getEntityValues(responsePool);
-//        assertThat("No Monitoring data found for pool " + poolNameWithDot, responseEntity, aMapWithSize(2));
+        Response responsePool = monitoringClient.get("/domain/server/resources/" + POOL_NAME_W_DOT);
+        assertEquals(200, responsePool.getStatus());
+        Map<String, String> responseEntity = getEntityValues(responsePool);
+        assertThat("Monitoring data: \n" + responseEntity, responseEntity, aMapWithSize(14));
     }
 
 
     @Test
     @Order(1000)
     public void testCleanup() {
-        String url = getManagementURL(MONITORING_RESOURCE_URL);
         Map<String, String> payLoad = new HashMap<>() {
             {
-                put("ThreadPool", "LOW");
-                put("Orb", "LOW");
-                put("EjbContainer", "LOW");
-                put("WebContainer", "LOW");
-                put("Deployment", "LOW");
-                put("TransactionService", "LOW");
-                put("HttpService", "LOW");
-                put("JdbcConnectionPool", "LOW");
-                put("ConnectorConnectionPool", "LOW");
-                put("ConnectorService", "LOW");
-                put("JmsService", "LOW");
-                put("Jvm", "LOW");
-                put("Security", "LOW");
-                put("WebServicesContainer", "LOW");
-                put("Jpa", "LOW");
-                put("Jersey", "LOW");
+                put("ThreadPool", "OFF");
+                put("Orb", "OFF");
+                put("EjbContainer", "OFF");
+                put("WebContainer", "OFF");
+                put("Deployment", "OFF");
+                put("TransactionService", "OFF");
+                put("HttpService", "OFF");
+                put("JdbcConnectionPool", "OFF");
+                put("ConnectorConnectionPool", "OFF");
+                put("ConnectorService", "OFF");
+                put("JmsService", "OFF");
+                put("Jvm", "OFF");
+                put("Security", "OFF");
+                put("WebServicesContainer", "OFF");
+                put("Jpa", "OFF");
+                put("Jersey", "OFF");
             }
         };
-        Response response = post(url, payLoad);
-        assertEquals(202, response.getStatus());
-    }
-
-    @Override
-    protected String getContextRoot() {
-        return CONTEXT_ROOT_MONITORING;
-    }
-
-    private String getManagementURL(String targetResourceURL) {
-        return getBaseAdminUrl() + CONTEXT_ROOT_MANAGEMENT + targetResourceURL;
+        Response response = managementClient.post(MONITORING_RESOURCE_URL, payLoad);
+        assertThat(response.getStatus(), anyOf(equalTo(200), equalTo(202)));
     }
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/NetworkListenerITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/NetworkListenerITest.java
index 46cb690..4e26dce 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/NetworkListenerITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/NetworkListenerITest.java
@@ -23,6 +23,7 @@
 import java.util.Map;
 
 import org.codehaus.jettison.json.JSONObject;
+import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Test;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -33,87 +34,92 @@
  * @author jasonlee
  */
 public class NetworkListenerITest 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";
+    private static final String URL_PROTOCOL = "/domain/configs/config/server-config/network-config/protocols/protocol";
+    private static final String URL_SSL = "/domain/configs/config/server-config/network-config/protocols/protocol/http-listener-2/ssl";
+
+    private static final String redirectProtocolName = "http-redirect";
+    private static final String portUniProtocolName = "pu-protocol";
+
+    private static final String redirectFilterName = "redirect-filter";
+    private static final String finderName1 = "http-finder";
+    private static final String finderName2 = "http-redirect";
+
+    @AfterAll
+    public static void cleanup() {
+        Response response = managementClient.post(
+            "/domain/configs/config/server-config/network-config/network-listeners/network-listener/http-listener-1",
+            Map.of("protocol", "http-listener-1"));
+        assertEquals(200, response.getStatus());
+        response = managementClient.delete(URL_PROTOCOL + "/" + portUniProtocolName + "/delete-protocol-finder",
+            Map.of("protocol", portUniProtocolName, "id", finderName1));
+        assertEquals(200, response.getStatus());
+        response = managementClient.delete(URL_PROTOCOL + "/" + portUniProtocolName + "/delete-protocol-finder",
+            Map.of("protocol", portUniProtocolName, "id", finderName2));
+        assertEquals(200, response.getStatus());
+        response = managementClient.delete(
+            URL_PROTOCOL + "/" + redirectProtocolName
+                + "/protocol-chain-instance-handler/protocol-chain/protocol-filter/" + redirectFilterName,
+            Map.of("protocol", redirectProtocolName));
+        assertEquals(200, response.getStatus());
+        response = managementClient.delete(URL_PROTOCOL + "/" + portUniProtocolName);
+        assertEquals(200, response.getStatus());
+        response = managementClient.delete(URL_PROTOCOL + "/" + redirectProtocolName);
+        assertEquals(200, response.getStatus());
+    }
+
 
     @Test
     public void createHttpListener() {
-        final String redirectProtocolName = "http-redirect";
-        final String portUniProtocolName = "pu-protocol";
+        Response response = managementClient.post("/domain/set", Map.of(
+            "configs.config.server-config.network-config.network-listeners.network-listener.http-listener-1.protocol",
+            "http-listener-1"));
+        assertEquals(200, response.getStatus());
+        managementClient.delete(URL_PROTOCOL + "/" + portUniProtocolName);
+        assertEquals(200, response.getStatus());
+        managementClient.delete(URL_PROTOCOL + "/" + redirectProtocolName);
+        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 = managementClient.post(URL_PROTOCOL, Map.of("securityenabled", "false", "id", redirectProtocolName));
+        assertEquals(200, response.getStatus());
+        response = managementClient.post(URL_PROTOCOL, Map.of("securityenabled", "false", "id", portUniProtocolName));
+        assertEquals(200, response.getStatus());
 
-        final String redirectFilterName = "redirect-filter";
-        final String finderName1 = "http-finder";
-        final String finderName2 = "http-redirect";
+        //        asadmin create-protocol-filter --protocol http-redirect --classname org.glassfish.grizzly.config.portunif.HttpRedirectFilter redirect-filter
+        response = managementClient.post(URL_PROTOCOL + "/" + redirectProtocolName + "/create-protocol-filter",
+            Map.of("id", redirectFilterName, "protocol", redirectProtocolName,
+                "classname", "org.glassfish.grizzly.config.portunif.HttpRedirectFilter"));
+        assertEquals(200, response.getStatus());
 
-        try {
-            Response response = post("domain/set", Map.of("configs.config.server-config.network-config.network-listeners.network-listener.http-listener-1.protocol", "http-listener-1"));
-            assertEquals(200, response.getStatus());
-            delete(URL_PROTOCOL + "/" + portUniProtocolName);
-            assertEquals(200, response.getStatus());
-            delete(URL_PROTOCOL + "/" + redirectProtocolName);
-            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, Map.of("securityenabled", "false", "id", redirectProtocolName));
-            assertEquals(200, response.getStatus());
-            response = post(URL_PROTOCOL, Map.of("securityenabled", "false", "id", portUniProtocolName));
-            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",
-                Map.of("id", redirectFilterName, "protocol", redirectProtocolName,
-                    "classname", "org.glassfish.grizzly.config.portunif.HttpRedirectFilter"));
-            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
-            response = post (URL_PROTOCOL + "/" + portUniProtocolName + "/create-protocol-finder",
-                new HashMap<String, String>() {{
-                    put ("id", finderName1);
-                    put ("protocol", portUniProtocolName);
-                    put ("targetprotocol", "http-listener-2");
-                    put ("classname", "org.glassfish.grizzly.config.portunif.HttpProtocolFinder");
-                }});
-            assertEquals(200, response.getStatus());
-            response = post (URL_PROTOCOL + "/" + portUniProtocolName + "/create-protocol-finder",
-                new HashMap<String, String>() {{
-                    put ("id", finderName2);
-                    put ("protocol", portUniProtocolName);
-                    put ("targetprotocol", redirectProtocolName);
-                    put ("classname", "org.glassfish.grizzly.config.portunif.HttpProtocolFinder");
-                }});
-            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
+        response = managementClient.post(URL_PROTOCOL + "/" + portUniProtocolName + "/create-protocol-finder",
+            new HashMap<String, String>() {{
+                put ("id", finderName1);
+                put ("protocol", portUniProtocolName);
+                put ("targetprotocol", "http-listener-2");
+                put ("classname", "org.glassfish.grizzly.config.portunif.HttpProtocolFinder");
+            }});
+        assertEquals(200, response.getStatus());
+        response = managementClient.post(URL_PROTOCOL + "/" + portUniProtocolName + "/create-protocol-finder",
+            new HashMap<String, String>() {{
+                put ("id", finderName2);
+                put ("protocol", portUniProtocolName);
+                put ("targetprotocol", redirectProtocolName);
+                put ("classname", "org.glassfish.grizzly.config.portunif.HttpProtocolFinder");
+            }});
+        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",
-                Map.of("protocol", portUniProtocolName));
-            assertEquals(200, response.getStatus());
+        //        asadmin set configs.config.server-config.network-config.network-listeners.network-listener.http-listener-1.protocol=pu-protocol
+        response = managementClient.post(
+            "/domain/configs/config/server-config/network-config/network-listeners/network-listener/http-listener-1",
+            Map.of("protocol", portUniProtocolName));
+        assertEquals(200, response.getStatus());
 
-            response = get("domain/configs/config/server-config/network-config/network-listeners/network-listener/http-listener-1/find-http-protocol");
-            assertThat(response.readEntity(String.class), stringContainsInOrder("http-listener-2"));
-        } finally {
-            Response response = post(
-                "domain/configs/config/server-config/network-config/network-listeners/network-listener/http-listener-1",
-                Map.of("protocol", "http-listener-1"));
-            assertEquals(200, response.getStatus());
-            response = delete(URL_PROTOCOL + "/" + portUniProtocolName + "/delete-protocol-finder",
-                Map.of("protocol", portUniProtocolName, "id", finderName1));
-            assertEquals(200, response.getStatus());
-            response = delete(URL_PROTOCOL + "/" + portUniProtocolName + "/delete-protocol-finder",
-                Map.of("protocol", portUniProtocolName, "id", finderName2));
-            assertEquals(200, response.getStatus());
-            response = delete(
-                URL_PROTOCOL + "/" + redirectProtocolName
-                    + "/protocol-chain-instance-handler/protocol-chain/protocol-filter/" + redirectFilterName,
-                Map.of("protocol", redirectProtocolName));
-            assertEquals(200, response.getStatus());
-            response = delete(URL_PROTOCOL + "/" + portUniProtocolName);
-            assertEquals(200, response.getStatus());
-            response = delete(URL_PROTOCOL + "/" + redirectProtocolName);
-            assertEquals(200, response.getStatus());
-        }
+        response = managementClient.get("/domain/configs/config/server-config/network-config/network-listeners/network-listener/http-listener-1/find-http-protocol");
+        assertThat(response.readEntity(String.class), stringContainsInOrder("http-listener-2"));
     }
 
     @Test
@@ -125,9 +131,9 @@
             put("trustStore", "baz");
         }};
 
-        Response response = post(URL_SSL, params);
+        Response response = managementClient.post(URL_SSL, params);
         assertEquals(200, response.getStatus());
-        response = get(URL_SSL, params);
+        response = managementClient.get(URL_SSL, params);
         Map<String, String> entity = this.getEntityValues(response);
         assertEquals(params.get("keyStore"), entity.get("keyStore"));
         assertEquals(params.get("trustAlgorithm"), entity.get("trustAlgorithm"));
@@ -137,9 +143,9 @@
         params.put("keyStore", "");
         params.put("trustAlgorithm", "");
         params.put("trustStore", "");
-        response = post(URL_SSL, params);
+        response = managementClient.post(URL_SSL, params);
         assertEquals(200, response.getStatus());
-        response = get(URL_SSL, params);
+        response = managementClient.get(URL_SSL, params);
         entity = this.getEntityValues(response);
         assertEquals(JSONObject.NULL, entity.get("keyStore"));
         assertEquals(JSONObject.NULL, entity.get("trustAlgorithm"));
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/NoCLICommandResourceCreationITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/NoCLICommandResourceCreationITest.java
index e248c4b..2e3a45e 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/NoCLICommandResourceCreationITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/NoCLICommandResourceCreationITest.java
@@ -18,7 +18,6 @@
 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.HashMap;
@@ -26,6 +25,7 @@
 
 import org.junit.jupiter.api.Test;
 
+import static jakarta.ws.rs.core.MediaType.APPLICATION_XML;
 import static org.glassfish.admin.rest.client.utils.MarshallingUtils.getXmlForProperties;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
@@ -33,7 +33,8 @@
  * @author Mitesh Meswani
  */
 public class NoCLICommandResourceCreationITest 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() {
@@ -43,15 +44,14 @@
         //Create a property
         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(getXmlForProperties(param), MediaType.APPLICATION_XML), Response.class);
+        param.put("value", propertyValue);
+        Response response = managementClient.post(URL_SERVER_PROPERTY,
+            Entity.entity(getXmlForProperties(param), APPLICATION_XML));
         assertEquals(200, response.getStatus());
 
         //Verify the property got created
         String propertyURL = URL_SERVER_PROPERTY + "/" + propertyKey;
-        response = get (propertyURL);
+        response = managementClient.get(propertyURL);
         assertEquals(200, response.getStatus());
         Map<String, String> entity = getEntityValues(response);
         assertEquals(propertyKey, entity.get("name"));
@@ -60,19 +60,16 @@
         // Verify property update
         propertyValue = generateRandomString();
         param.put("value", propertyValue);
-        response = getClient().target(getAddress(URL_SERVER_PROPERTY))
-                .request(RESPONSE_TYPE)
-                .put(Entity.entity(getXmlForProperties(param), MediaType.APPLICATION_XML), Response.class);
+        response = managementClient.put(URL_SERVER_PROPERTY, Entity.entity(getXmlForProperties(param), APPLICATION_XML));
         assertEquals(200, response.getStatus());
-        response = get (propertyURL);
+        response = managementClient.get(propertyURL);
         assertEquals(200, response.getStatus());
         entity = getEntityValues(response);
         assertEquals(propertyKey, entity.get("name"));
         assertEquals(propertyValue, entity.get("value"));
 
         //Clean up to leave domain.xml good for next run
-        response = delete(propertyURL, new HashMap<String, String>());
+        response = managementClient.delete(propertyURL, new HashMap<String, String>());
         assertEquals(200, response.getStatus());
     }
-
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/PartialUpdateITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/PartialUpdateITest.java
index 797c086..11f7751 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/PartialUpdateITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/PartialUpdateITest.java
@@ -29,15 +29,16 @@
  * @author jasonlee
  */
 public class PartialUpdateITest extends RestTestBase {
+
     @Test
     public void testPartialUpdate() {
         final String endpoint = URL_JDBC_CONNECTION_POOL + "/DerbyPool";
         final String newDesc = generateRandomString();
-        Map<String, String> origAttrs = getEntityValues(get(endpoint));
+        Map<String, String> origAttrs = getEntityValues(managementClient.get(endpoint));
         Map<String, String> newAttrs = Map.of("description", newDesc);
-        Response response = post(endpoint, newAttrs);
+        Response response = managementClient.post(endpoint, newAttrs);
         assertEquals(200, response.getStatus());
-        Map<String, String> updatedAttrs = getEntityValues(get(endpoint));
+        Map<String, String> updatedAttrs = getEntityValues(managementClient.get(endpoint));
         assertEquals(newDesc, updatedAttrs.get("description"));
         assertEquals(origAttrs.get("driverClassname"), updatedAttrs.get("driverClassname"));
         assertEquals(origAttrs.get("resType"), updatedAttrs.get("resType"));
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/PropertiesBagITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/PropertiesBagITest.java
index 9ca20a4..ba6a813 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/PropertiesBagITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/PropertiesBagITest.java
@@ -18,7 +18,6 @@
 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;
@@ -30,6 +29,7 @@
 import org.glassfish.admin.rest.client.utils.MarshallingUtils;
 import org.junit.jupiter.api.Test;
 
+import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -46,15 +46,14 @@
 public class PropertiesBagITest extends RestTestBase {
 
     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;
+    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";
 
     @Test
     public void propertyRetrieval() {
-        Response response = get(URL_DOMAIN_PROPERTIES);
+        Response response = managementClient.get(URL_DOMAIN_PROPERTIES);
         assertEquals(200, response.getStatus());
         List<Map<String, String>> properties = getProperties(response);
         assertTrue(isPropertyFound(properties, PROP_DOMAIN_NAME));
@@ -82,7 +81,7 @@
         properties.add(createProperty(foo,"foovalue"));
         properties.add(createProperty(bar,"barvalue"));
         createProperties(URL_DERBYPOOL_PROPERTIES, properties);
-        List<Map<String, String>> newProperties = getProperties(get(URL_DERBYPOOL_PROPERTIES));
+        List<Map<String, String>> newProperties = getProperties(managementClient.get(URL_DERBYPOOL_PROPERTIES));
 
         assertFalse(isPropertyFound(newProperties, empty));
         assertTrue(isPropertyFound(newProperties, foo));
@@ -91,7 +90,7 @@
         properties.clear();
         properties.add(createProperty(abc,"abcvalue"));
         createProperties(URL_DERBYPOOL_PROPERTIES, properties);
-        newProperties = getProperties(get(URL_DERBYPOOL_PROPERTIES));
+        newProperties = getProperties(managementClient.get(URL_DERBYPOOL_PROPERTIES));
 
         assertTrue(isPropertyFound(newProperties, abc));
         assertFalse(isPropertyFound(newProperties, empty));
@@ -112,7 +111,7 @@
         properties.add(createProperty("foo","bar","test"));
         createProperties(URL_DERBYPOOL_PROPERTIES, properties);
 
-        List<Map<String, String>> newProperties = getProperties(get(URL_DERBYPOOL_PROPERTIES));
+        List<Map<String, String>> newProperties = getProperties(managementClient.get(URL_DERBYPOOL_PROPERTIES));
         for (Map<String, String> property : newProperties) {
             if (property.get("name").equals("connectionAttributes")) {
                 assertEquals(";create=false", property.get("value"));
@@ -127,7 +126,7 @@
         properties.add(createProperty("foo","bar 2","test 2"));
         createProperties(URL_DERBYPOOL_PROPERTIES, properties);
 
-        newProperties = getProperties(get(URL_DERBYPOOL_PROPERTIES));
+        newProperties = getProperties(managementClient.get(URL_DERBYPOOL_PROPERTIES));
         assertNotSame(1, newProperties);
         for (Map<String, String> property : newProperties) {
             if (property.get("name").equals("foo")) {
@@ -147,7 +146,7 @@
 
         createProperties(URL_DERBYPOOL_PROPERTIES, properties);
 
-        newProperties = getProperties(get(URL_DERBYPOOL_PROPERTIES));
+        newProperties = getProperties(managementClient.get(URL_DERBYPOOL_PROPERTIES));
         for (Map<String, String> property : newProperties) {
             if (property.get("name").equals("connectionAttributes")) {
                 assertEquals(";create=true", property.get("value"));
@@ -157,8 +156,6 @@
         }
     }
 
-    // FIXME: the prop name can not contain .
-    // need to remove the . test when http://java.net/jira/browse/GLASSFISH-15418  is fixed
     @Test
     public void testPropertiesWithDots() {
         List<Map<String, String>> properties = new ArrayList<>();
@@ -168,7 +165,7 @@
         properties.add(createProperty(key, value, description));
         createProperties(URL_DERBYPOOL_PROPERTIES, properties);
 
-        List<Map<String, String>> newProperties = getProperties(get(URL_DERBYPOOL_PROPERTIES));
+        List<Map<String, String>> newProperties = getProperties(managementClient.get(URL_DERBYPOOL_PROPERTIES));
         Map<String, String> newProp = getProperty(newProperties, key);
         assertNotNull(newProp);
         assertEquals(value, newProp.get("value"));
@@ -209,9 +206,9 @@
             put("property", propertyList);
         }};
 
-        final String URL = "domain/resources/resource-adapter-config";
-        delete(URL+"/jmsra");
-        Response response = post(URL, attrs);
+        final String url = "/domain/resources/resource-adapter-config";
+        managementClient.delete(url + "/jmsra");
+        Response response = managementClient.post(url, attrs);
         assertEquals(200, response.getStatus());
 
         // Change one property value (AddressListIterations) and update the object
@@ -232,9 +229,9 @@
            add(createProperty("doBind", "false"));
            add(createProperty("startRMIRegistry", "false"));
         }};
-        createProperties(URL+"/jmsra/property", props);
+        createProperties(url + "/jmsra/property", props);
 
-        delete(URL+"/jmsra");
+        managementClient.delete(url + "/jmsra");
     }
 
     @Test
@@ -248,18 +245,17 @@
         payload.put("persistenceStoreHealthCheckEnabled","false");
         payload.put("ssoFailoverEnabled","false");
 
-        final String wcaUri = "domain/configs/config/default-config/availability-service/web-container-availability";
-        Response response = post(wcaUri, payload);
+        final String wcaUri = "/domain/configs/config/default-config/availability-service/web-container-availability";
+        Response response = managementClient.post(wcaUri, payload);
         assertThat(response.getStatus(), equalTo(200));
 
-        assertThat(get(wcaUri).getStatus(), equalTo(200));
+        assertThat(managementClient.get(wcaUri).getStatus(), equalTo(200));
 
-        response = getClient()
-                .target(getAddress("domain/configs/config/default-config/availability-service/web-container-availability/property")).
-                request(getResponseType())
-                .post(Entity.json(new JSONArray()), Response.class);
+        response = managementClient.post(
+            "/domain/configs/config/default-config/availability-service/web-container-availability/property",
+            Entity.json(new JSONArray()));
         assertThat(response.getStatus(), equalTo(200));
-        assertThat(get(wcaUri).getStatus(), equalTo(200));
+        assertThat(managementClient.get(wcaUri).getStatus(), equalTo(200));
     }
 
     private String buildPropertyList(List<Map<String, String>> props) {
@@ -274,7 +270,7 @@
     }
 
     private void createAndDeleteProperties(String endpoint) {
-        Response response = get(endpoint);
+        Response response = managementClient.get(endpoint);
         assertEquals(200, response.getStatus());
         assertNotNull(getProperties(response));
 
@@ -285,7 +281,7 @@
         }
 
         createProperties(endpoint, properties);
-        response = delete(endpoint);
+        response = managementClient.delete(endpoint);
         assertEquals(200, response.getStatus());
     }
 
@@ -294,30 +290,36 @@
     }
 
     private Map<String, String> createProperty(final String name, final String value, final String description) {
-        return new HashMap<>() {{
-                put ("name", name);
-                put ("value", value);
+        return new HashMap<>() {
+            {
+                put("name", name);
+                put("value", value);
                 if (description != null) {
-                    put ("description", description);
+                    put("description", description);
                 }
-            }};
+            }
+        };
     }
 
     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);
+
+        Response response = managementClient.post(endpoint, Entity.entity(payload, APPLICATION_JSON));
         assertEquals(200, response.getStatus());
-        response = get(endpoint);
+        response = managementClient.get(endpoint);
         assertEquals(200, response.getStatus());
 
         // Retrieve the properties and make sure they were created.
-//        List<Map<String, String>> newProperties = getProperties(response);
-//
-//        for (Map<String, String> property : properties) {
-//            assertTrue(isPropertyFound(newProperties, property.get("name")));
-//        }
+        List<Map<String, String>> newProperties = getProperties(response);
+        for (Map<String, String> property : properties) {
+            String name = property.get("name");
+            String value = property.get("value");
+            if (value == null || value.isBlank()) {
+                assertFalse(isPropertyFound(newProperties, name));
+            } else {
+                assertTrue(isPropertyFound(newProperties, name));
+            }
+        }
     }
 
     // Restore and verify the default domain properties
@@ -326,21 +328,16 @@
             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);
+        Response response = managementClient.put(URL_DOMAIN_PROPERTIES,
+            Entity.entity(buildPayload(List.of(domainProps)), APPLICATION_JSON));
         assertEquals(200, response.getStatus());
-        response = get(URL_DOMAIN_PROPERTIES);
+        response = managementClient.get(URL_DOMAIN_PROPERTIES);
         assertEquals(200, response.getStatus());
         assertTrue(isPropertyFound(getProperties(response), PROP_DOMAIN_NAME));
     }
 
     private String buildPayload(List<Map<String, String>> properties) {
-        if (RESPONSE_TYPE.equals(MediaType.APPLICATION_XML)) {
-            return MarshallingUtils.getXmlForProperties(properties);
-        } else {
-            return MarshallingUtils.getJsonForProperties(properties);
-        }
+        return MarshallingUtils.getJsonForProperties(properties);
     }
 
     private boolean isPropertyFound(List<Map<String, String>> properties, String name) {
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ProvidersITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ProvidersITest.java
index e6b2fc9..8d93960 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ProvidersITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ProvidersITest.java
@@ -19,6 +19,9 @@
 
 import jakarta.ws.rs.core.Response;
 
+import org.glassfish.nucleus.test.tool.DomainAdminRestClient;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -27,135 +30,145 @@
  * @author jasonlee
  */
 public class ProvidersITest 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 String URL_TREE_NODE;
+    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";
 
-    public ProvidersITest() {
-        URL_TREE_NODE = "http://localhost:" + getParameter("admin.port", "4848") + "/monitoring/domain";
+    private static DomainAdminRestClient monitoringClient;
+
+    @BeforeAll
+    public static void init() {
+        monitoringClient = new DomainAdminRestClient(getBaseAdminUrl() + "/monitoring/domain");
+    }
+
+
+    @AfterAll
+    public static void closeResources() {
+        if (monitoringClient != null) {
+            monitoringClient.close();
+        }
     }
 
     @Test
     public void testActionReportResultHtmlProvider() {
-        Response response = get(URL_ACTION_REPORT_RESULT + ".html");
+        Response response = managementClient.get(URL_ACTION_REPORT_RESULT + ".html");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testActionReportResultXmlProvider() {
-        Response response = get(URL_ACTION_REPORT_RESULT + ".xml");
+        Response response = managementClient.get(URL_ACTION_REPORT_RESULT + ".xml");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testActionReportResultJsonProvider() {
-        Response response = get(URL_ACTION_REPORT_RESULT + ".json");
+        Response response = managementClient.get(URL_ACTION_REPORT_RESULT + ".json");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testCommandResourceGetResultHtmlProvider() {
-        Response response = get(URL_COMMAND_RESOURCE_GET_RESULT + ".html");
+        Response response = managementClient.get(URL_COMMAND_RESOURCE_GET_RESULT + ".html");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testCommandResourceGetResultXmlProvider() {
-        Response response = get(URL_COMMAND_RESOURCE_GET_RESULT + ".xml");
+        Response response = managementClient.get(URL_COMMAND_RESOURCE_GET_RESULT + ".xml");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testCommandResourceGetResultJsonProvider() {
-        Response response = get(URL_COMMAND_RESOURCE_GET_RESULT + ".json");
+        Response response = managementClient.get(URL_COMMAND_RESOURCE_GET_RESULT + ".json");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testGetResultHtmlProvider() {
-        Response response = get(URL_GET_RESULT + ".html");
+        Response response = managementClient.get(URL_GET_RESULT + ".html");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testGetResultXmlProvider() {
-        Response response = get(URL_GET_RESULT + ".xml");
+        Response response = managementClient.get(URL_GET_RESULT + ".xml");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testGetResultJsonProvider() {
-        Response response = get(URL_GET_RESULT + ".json");
+        Response response = managementClient.get(URL_GET_RESULT + ".json");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testGetResultListHtmlProvider() {
-        Response response = get(URL_GET_RESULT_LIST + ".html");
+        Response response = managementClient.get(URL_GET_RESULT_LIST + ".html");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testGetResultListXmlProvider() {
-        Response response = get(URL_GET_RESULT_LIST + ".xml");
+        Response response = managementClient.get(URL_GET_RESULT_LIST + ".xml");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testGetResultListJsonProvider() {
-        Response response = get(URL_GET_RESULT_LIST + ".json");
+        Response response = managementClient.get(URL_GET_RESULT_LIST + ".json");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testOptionsResultXmlProvider() {
-        Response response = options(URL_OPTIONS_RESULT + ".xml");
+        Response response = managementClient.options(URL_OPTIONS_RESULT + ".xml");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testOptionsResultJsonProvider() {
-        Response response = options(URL_OPTIONS_RESULT + ".json");
+        Response response = managementClient.options(URL_OPTIONS_RESULT + ".json");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testStringListResultHtmlProvider() {
-        Response response = get(URL_STRING_LIST_RESULT + ".html");
+        Response response = managementClient.get(URL_STRING_LIST_RESULT + ".html");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testStringListResultXmlProvider() {
-        Response response = get(URL_STRING_LIST_RESULT + ".xml");
+        Response response = managementClient.get(URL_STRING_LIST_RESULT + ".xml");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testStringListResultJsonProvider() {
-        Response response = get(URL_STRING_LIST_RESULT + ".json");
+        Response response = managementClient.get(URL_STRING_LIST_RESULT + ".json");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testTreeNodeHtmlProvider() {
-        Response response = get(URL_TREE_NODE + ".html");
+        Response response = monitoringClient.get(".html");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testTreeNodeXmlProvider() {
-        Response response = get(URL_TREE_NODE + ".xml");
+        Response response = monitoringClient.get(".xml");
         assertEquals(200, response.getStatus());
     }
 
     @Test
     public void testTreeNodeJsonProvider() {
-        Response response = get(URL_TREE_NODE + ".json");
+        Response response = monitoringClient.get(".json");
         assertEquals(200, response.getStatus());
     }
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ResourceRefITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ResourceRefITest.java
index ce658d3..cb71888 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ResourceRefITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ResourceRefITest.java
@@ -22,22 +22,34 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.glassfish.nucleus.test.tool.asadmin.Asadmin;
+import org.glassfish.nucleus.test.tool.asadmin.GlassFishTestEnvironment;
+import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Test;
-
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
  * @author jasonlee
  */
 public class ResourceRefITest 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";
+
+    private final String instanceName = "instance_" + generateRandomString();
+    private final String jdbcResourceName = "jdbc_" + generateRandomString();
+
+    @AfterEach
+    public void cleanup() {
+        Asadmin asadmin = GlassFishTestEnvironment.getAsadmin();
+        asadmin.exec("delete-resource-ref", jdbcResourceName);
+        asadmin.exec("delete-jdbc-resource", jdbcResourceName);
+        asadmin.exec("delete-instance", instanceName);
+    }
+
 
     @Test
     public void testCreatingResourceRef() {
-        final String instanceName = "instance_" + generateRandomString();
-        final String jdbcResourceName = "jdbc_" + generateRandomString();
         Map<String, String> newInstance = new HashMap<>() {{
             put("id", instanceName);
             put("node", "localhost-domain1");
@@ -52,31 +64,29 @@
             put("target", "server");
         }};
 
-        try {
-            Response response = post(URL_CREATE_INSTANCE, newInstance);
-            assertEquals(200, response.getStatus());
+        Response response = managementClient.post(URL_CREATE_INSTANCE, newInstance);
+        assertEquals(200, response.getStatus());
 
-            response = post(URL_JDBC_RESOURCE, jdbcResource);
-            assertEquals(200, response.getStatus());
+        response = managementClient.post(URL_JDBC_RESOURCE, jdbcResource);
+        assertEquals(200, response.getStatus());
 
-            response = post(URL_RESOURCE_REF, resourceRef);
-            assertEquals(200, response.getStatus());
-        } finally {
-            Response response = delete("domain/servers/server/" + instanceName + "/resource-ref/" + jdbcResourceName,
-                Map.of("target", instanceName));
-            assertEquals(200, response.getStatus());
-            response = get("domain/servers/server/" + instanceName + "/resource-ref/" + jdbcResourceName);
-            assertEquals(404, response.getStatus());
+        response = managementClient.post(URL_RESOURCE_REF, resourceRef);
+        assertEquals(200, response.getStatus());
+        response = managementClient.delete(
+            "/domain/servers/server/" + instanceName + "/resource-ref/" + jdbcResourceName,
+            Map.of("target", instanceName));
+        assertEquals(200, response.getStatus());
+        response = managementClient.get("/domain/servers/server/" + instanceName + "/resource-ref/" + jdbcResourceName);
+        assertEquals(404, response.getStatus());
 
-            response = delete(URL_JDBC_RESOURCE + "/" + jdbcResourceName);
-            assertEquals(200, response.getStatus());
-            response = get(URL_JDBC_RESOURCE + "/" + jdbcResourceName);
-            assertEquals(404, response.getStatus());
+        response = managementClient.delete(URL_JDBC_RESOURCE + "/" + jdbcResourceName);
+        assertEquals(200, response.getStatus());
+        response = managementClient.get(URL_JDBC_RESOURCE + "/" + jdbcResourceName);
+        assertEquals(404, response.getStatus());
 
-            response = delete("domain/servers/server/" + instanceName + "/delete-instance");
-            assertEquals(200, response.getStatus());
-            response = get("domain/servers/server/" + instanceName);
-            assertEquals(404, response.getStatus());
-        }
+        response = managementClient.delete("/domain/servers/server/" + instanceName + "/delete-instance");
+        assertEquals(200, response.getStatus());
+        response = managementClient.get("/domain/servers/server/" + instanceName);
+        assertEquals(404, response.getStatus());
     }
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/RestTestBase.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/RestTestBase.java
index 3cc5ef7..76d9b9c 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/RestTestBase.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/RestTestBase.java
@@ -18,42 +18,26 @@
 package org.glassfish.nucleus.admin.rest;
 
 import jakarta.ws.rs.client.Client;
-import jakarta.ws.rs.client.Entity;
-import jakarta.ws.rs.client.WebTarget;
-import jakarta.ws.rs.core.MediaType;
-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.IOException;
 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.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 org.glassfish.nucleus.test.tool.DomainLifecycleExtension;
-import org.glassfish.nucleus.test.tool.NucleusTestUtils;
+import org.glassfish.nucleus.test.tool.DomainAdminRestClient;
 import org.glassfish.nucleus.test.webapp.HelloServlet;
 import org.jboss.shrinkwrap.api.ShrinkWrap;
 import org.jboss.shrinkwrap.api.exporter.ZipExporter;
@@ -62,79 +46,61 @@
 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 org.junit.jupiter.api.TestInfo;
 
-import static org.glassfish.nucleus.test.tool.NucleusTestUtils.ADMIN_PASSWORD;
-import static org.glassfish.nucleus.test.tool.NucleusTestUtils.ADMIN_USER;
+import static jakarta.ws.rs.core.MediaType.TEXT_PLAIN;
+import static org.glassfish.nucleus.test.tool.asadmin.GlassFishTestEnvironment.getTargetDirectory;
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-@ExtendWith(DomainLifecycleExtension.class)
 public class RestTestBase {
 
     private static final Logger LOG = Logger.getLogger(RestTestBase.class.getName());
 
-    protected static final String RESPONSE_TYPE = MediaType.APPLICATION_JSON;
+    protected static final String CONTEXT_ROOT_MANAGEMENT = "/management";
 
-    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";
+    protected static final String URL_CONFIGS = "/domain/configs";
+    protected static final String URL_JDBC_RESOURCE = "/domain/resources/jdbc-resource";
+    protected static final String URL_JDBC_CONNECTION_POOL = "/domain/resources/jdbc-connection-pool";
 
-    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";
-    protected static final String URL_CONFIGS = "domain/configs";
-    protected static final String URL_JDBC_RESOURCE = "domain/resources/jdbc-resource";
-    protected static final String URL_JDBC_CONNECTION_POOL = "domain/resources/jdbc-connection-pool";
-
-    private static String adminHost;
-    private static String adminPort;
-    private static String instancePort;
     private static String baseAdminUrl;
     private static String baseInstanceUrl;
+    protected static DomainAdminRestClient managementClient;
 
-    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");
-        baseAdminUrl = "http://" + adminHost + ':' + adminPort + '/';
-        baseInstanceUrl = "http://" + adminHost + ':' + instancePort + '/';
-
-        final RestTestBase rtb = new RestTestBase();
-        rtb.get("domain/rotate-log");
+        baseAdminUrl = "http://localhost:4848";
+        baseInstanceUrl = "http://localhost:8080";
+        managementClient = new DomainAdminRestClient(baseAdminUrl + CONTEXT_ROOT_MANAGEMENT);
+        Response response = managementClient.get("/domain/rotate-log");
+        assertThat(response.getStatus(), equalTo(200));
     }
 
     @AfterAll
-    public static void captureLog() {
-        try {
-            if (currentTestClass != null) {
-                RestTestBase rtb = new RestTestBase();
-                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));
-                }
+    public static void captureLogAndCloseClient(final TestInfo testInfo) throws Exception {
+        if (managementClient != null) {
+            managementClient.close();
+        }
+        try (DomainAdminRestClient client = new DomainAdminRestClient(baseAdminUrl + CONTEXT_ROOT_MANAGEMENT, TEXT_PLAIN)) {
+            Response response = client.get("/domain/view-log");
+            assertThat(response.getStatus(), equalTo(200));
+            File directory = new File(getTargetDirectory(), "surefire-reports");
+            directory.mkdirs();
+            File output = new File(directory, testInfo.getTestClass().get().getName() + "-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.SEVERE, null, ex);
         }
     }
 
-    @BeforeEach
-    public void setup() {
-        currentTestClass = this.getClass().getName();
-    }
-
     @AfterEach
-    protected void resetClient() {
+    protected void closeClient() throws Exception {
         if (client == null) {
             return;
         }
@@ -143,19 +109,19 @@
     }
 
     public void createAndVerifyConfig(String configName, MultivaluedMap<String, String> configData) {
-        Response response = post(URL_CONFIGS + "/copy-config", configData);
+        Response response = managementClient.post(URL_CONFIGS + "/copy-config", configData);
         assertThat(response.getStatus(), equalTo(200));
 
-        response = get(URL_CONFIGS + "/config/" + configName);
-        assertEquals(200, response.getStatus());
+        response = managementClient.get(URL_CONFIGS + "/config/" + configName);
+        assertThat(response.getStatus(), equalTo(200));
     }
 
     public void deleteAndVerifyConfig(String configName) {
-        Response response = post(URL_CONFIGS + "/config/" + configName + "/delete-config");
+        Response response = managementClient.post(URL_CONFIGS + "/config/" + configName + "/delete-config");
         assertThat(response.getStatus(), equalTo(200));
 
-        response = get(URL_CONFIGS + "/config/" + configName);
-        assertEquals(404, response.getStatus());
+        response = managementClient.get(URL_CONFIGS + "/config/" + configName);
+        assertThat(response.getStatus(), equalTo(404));
     }
 
     public String createCluster() {
@@ -166,48 +132,46 @@
 
     public void createCluster(final String clusterName) {
         Map<String, String> newCluster = Map.of("id", clusterName);
-        Response response = post(URL_CLUSTER, newCluster);
+        Response response = managementClient.post(URL_CLUSTER, newCluster);
         assertThat(response.getStatus(), equalTo(200));
     }
 
     public void startCluster(String clusterName) {
-        Response response = post(URL_CLUSTER + "/" + clusterName + "/start-cluster");
+        Response response = managementClient.post(URL_CLUSTER + "/" + clusterName + "/start-cluster");
         assertThat(response.getStatus(), equalTo(200));
     }
 
     public void stopCluster(String clusterName) {
-        Response response = post(URL_CLUSTER + "/" + clusterName + "/stop-cluster");
+        Response response = managementClient.post(URL_CLUSTER + "/" + clusterName + "/stop-cluster");
         assertThat(response.getStatus(), equalTo(200));
     }
 
     public void createClusterInstance(final String clusterName, final String instanceName) {
-        Response response = post("domain/create-instance",
+        Response response = managementClient.post("/domain/create-instance",
             Map.of("cluster", clusterName, "id", instanceName, "node", "localhost-domain1"));
         assertThat(response.getStatus(), equalTo(200));
     }
 
     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");
+        Response response = managementClient.get(URL_CLUSTER + "/" + clusterName + "/list-instances");
+        Map<String, ?> body = MarshallingUtils.buildMapFromDocument(response.readEntity(String.class));
+        Map<String, ?> extraProperties = (Map<String, ?>) body.get("extraProperties");
         if (extraProperties != null) {
             List<Map<String, String>> instanceList = (List<Map<String, String>>) extraProperties.get("instanceList");
+            LOG.log(Level.INFO, "Found instances: {0}", 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");
-                        assertThat(response.getStatus(), equalTo(200));
-                    }
-                    response = delete("domain/servers/server/" + instanceName + "/delete-instance");
-                    assertThat(response.getStatus(), equalTo(200));
+                    response = managementClient.post("/domain/servers/server/" + instanceName + "/stop-instance");
+                    assertThat(instanceName, response.getStatus(), equalTo(200));
+                    response = managementClient.delete("/domain/servers/server/" + instanceName + "/delete-instance");
+                    assertThat(instanceName, response.getStatus(), equalTo(200));
                 }
             }
         }
-        response = delete(URL_CLUSTER + "/" + clusterName);
+        response = managementClient.delete(URL_CLUSTER + "/" + clusterName);
         assertEquals(200, response.getStatus());
-        response = get(URL_CLUSTER + "/" + clusterName);
+        response = managementClient.get(URL_CLUSTER + "/" + clusterName);
         assertEquals(404, response.getStatus());
     }
 
@@ -217,36 +181,25 @@
             "contextroot", contextRoot,
             "name", name
         );
-        Response response = postWithUpload(URL_APPLICATION_DEPLOY, app);
+        Response response = managementClient.postWithUpload(URL_APPLICATION_DEPLOY, app);
         assertThat(response.getStatus(), equalTo(200));
-        return getEntityValues(get(URL_APPLICATION_DEPLOY + "/" + app.get("name")));
+        return getEntityValues(managementClient.get(URL_APPLICATION_DEPLOY + "/" + app.get("name")));
     }
 
     public void addAppRef(final String applicationName, final String targetName){
-        Response response = post("domain/servers/server/" + targetName + "/application-ref",
+        Response response = managementClient.post("/domain/servers/server/" + targetName + "/application-ref",
             Map.of("id", applicationName, "target", targetName));
         assertThat(response.getStatus(), equalTo(200));
     }
 
     public Response undeployApp(String appName) {
-        Response response = delete(URL_APPLICATION_DEPLOY + "/" + appName);
+        Response response = managementClient.delete(URL_APPLICATION_DEPLOY + "/" + appName);
         assertThat(response.getStatus(), equalTo(200));
         return response;
     }
 
-    protected <T> T getTestClass(Class<T> clazz) {
-        try {
-            T test = clazz.getDeclaredConstructor().newInstance();
-            ((RestTestBase) test).setup();
-            return test;
-        } catch (Exception ex) {
-            throw new RuntimeException(ex);
-        }
-    }
-
     protected static String generateRandomString() {
         SecureRandom random = new SecureRandom();
-
         return new BigInteger(130, random).toString(16);
     }
 
@@ -260,11 +213,6 @@
         return Math.abs(r.nextInt(max - 1)) + 1;
     }
 
-    protected String getResponseType() {
-        return RESPONSE_TYPE;
-    }
-
-
     protected static String getBaseAdminUrl() {
         return baseAdminUrl;
     }
@@ -274,100 +222,6 @@
     }
 
 
-    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>());
-    }
-
-    protected Response get(String address, Map<String, String> payload) {
-        WebTarget target = getClient().target(getAddress(address));
-        for (Map.Entry<String, String> entry : payload.entrySet()) {
-            target = target.queryParam(entry.getKey(), entry.getValue());
-        }
-        return target.request(getResponseType())
-                .get(Response.class);
-    }
-
-    protected Response options(String address) {
-        return getClient().target(getAddress(address)).
-                request(getResponseType()).
-                options(Response.class);
-    }
-
-    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(payload, MediaType.APPLICATION_FORM_URLENCODED), Response.class);
-    }
-
-    protected Response post(String address) {
-        return getClient().target(getAddress(address)).
-                request(getResponseType()).
-                post(Entity.entity(null, MediaType.APPLICATION_FORM_URLENCODED), Response.class);
-    }
-
-    protected Response put(String address, Map<String, String> payload) {
-        return getClient().target(getAddress(address)).
-                request(getResponseType()).
-                put(Entity.entity(buildMultivaluedMap(payload), MediaType.APPLICATION_FORM_URLENCODED), Response.class);
-    }
-
-    protected Response put(String address) {
-        return getClient().target(getAddress(address)).
-                request(getResponseType()).
-                put(Entity.entity(null, MediaType.APPLICATION_FORM_URLENCODED), Response.class);
-    }
-
-    protected Response postWithUpload(String address, Map<String, Object> payload) {
-        FormDataMultiPart form = new FormDataMultiPart();
-        for (Map.Entry<String, Object> entry : payload.entrySet()) {
-            if (entry.getValue() instanceof File) {
-                form.getBodyParts().
-                        add((new FileDataBodyPart(entry.getKey(), (File) entry.getValue())));
-            } else {
-                form.field(entry.getKey(), entry.getValue(), MediaType.TEXT_PLAIN_TYPE);
-            }
-        }
-        return getClient().target(getAddress(address)).
-                request(getResponseType()).
-                post(Entity.entity(form, MediaType.MULTIPART_FORM_DATA), Response.class);
-    }
-
-    protected Response delete(String address) {
-        return delete(address, new HashMap<String, String>());
-    }
-
-    protected Response delete(String address, Map<String, String> payload) {
-        WebTarget target = getClient().target(getAddress(address));
-        for (Map.Entry<String, String> entry : payload.entrySet()) {
-            target = target.queryParam(entry.getKey(), entry.getValue());
-        }
-        return target.request(getResponseType()).delete(Response.class);
-    }
-
     /**
      * This method will parse the provided XML document and return a map of the attributes and values on the root
      * element
@@ -396,7 +250,6 @@
         if (message != null && !"".equals(message)) {
             results.add(message);
         }
-
         Object children = map.get("children");
         if (children instanceof List) {
             for (Object child : (List) children) {
@@ -407,7 +260,6 @@
                 }
             }
         }
-
         return results;
     }
 
@@ -422,18 +274,8 @@
         return new HashMap<>();
     }
 
-    public Document getDocument(String input) {
-        try {
-            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
-            DocumentBuilder db = dbf.newDocumentBuilder();
-            Document doc = db.parse(new ByteArrayInputStream(input.getBytes()));
-            return doc;
-        } catch (Exception ex) {
-            return null;
-        }
-    }
 
-    public List<Map<String, String>> getProperties(Response response) {
+    protected List<Map<String, String>> getProperties(Response response) {
         Map responseMap = MarshallingUtils.buildMapFromDocument(response.readEntity(String.class));
         Map extraProperties = (Map) responseMap.get("extraProperties");
         if (extraProperties != null) {
@@ -442,38 +284,6 @@
         return new ArrayList<>();
     }
 
-    private MultivaluedMap<String, String> buildMultivaluedMap(Map<String, String> payload) {
-        MultivaluedMap<String, String> formData = new MultivaluedHashMap<>();
-        if (payload != null) {
-            for (final Entry<String, String> entry : payload.entrySet()) {
-                formData.add(entry.getKey(), entry.getValue());
-            }
-        }
-        return formData;
-    }
-
-    protected String getErrorMessage(Response cr) {
-        String message = null;
-        Map map = MarshallingUtils.buildMapFromDocument(cr.readEntity(String.class));
-        if (map != null) {
-            message = (String) map.get("message");
-        }
-
-        return message;
-    }
-
-    protected static String getParameter(String paramName, String defaultValue) {
-        String value = System.getenv(paramName);
-        if (value == null) {
-            value = System.getProperty(paramName);
-        }
-        if (value == null) {
-            value = defaultValue;
-        }
-
-        return value;
-    }
-
 
     protected static File getEar(final String appName) {
         final EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class).addAsModule(getWar(appName), "simple.war");
@@ -498,5 +308,4 @@
             throw new IllegalStateException("Deployment failed - cannot load the input archive!", e);
         }
     }
-
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/SystemPropertiesITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/SystemPropertiesITest.java
index a5e79f4..a68d242 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/SystemPropertiesITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/SystemPropertiesITest.java
@@ -23,9 +23,9 @@
 import java.util.List;
 import java.util.Map;
 
-import org.glassfish.admin.rest.client.utils.MarshallingUtils;
 import org.junit.jupiter.api.Test;
 
+import static org.glassfish.admin.rest.client.utils.MarshallingUtils.buildMapFromDocument;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
@@ -33,33 +33,39 @@
  * @author jasonlee
  */
 public class SystemPropertiesITest 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);
+        Response response = managementClient.get(URL_DAS_SYSTEM_PROPERTIES);
         assertEquals(200, response.getStatus());
-        List<Map<String, String>> systemProperties = getSystemProperties(MarshallingUtils.buildMapFromDocument(response.readEntity(String.class)));
+        List<Map<String, String>> systemProperties = getSystemProperties(
+            buildMapFromDocument(response.readEntity(String.class)));
         assertNotNull(systemProperties);
     }
 
+
     @Test
     public void createSystemProperties() {
         final String prop1 = "property" + generateRandomString();
         final String prop2 = "property" + generateRandomString();
-        Map<String, String> payload = new HashMap<>() {{
-            put(prop1, "value1");
-            put(prop2, "value2");
-        }};
-        Response response = post(URL_DAS_SYSTEM_PROPERTIES, payload);
+        Map<String, String> payload = new HashMap<>() {
+
+            {
+                put(prop1, "value1");
+                put(prop2, "value2");
+            }
+        };
+        Response response = managementClient.post(URL_DAS_SYSTEM_PROPERTIES, payload);
         assertEquals(200, response.getStatus());
-        response = get(URL_DAS_SYSTEM_PROPERTIES);
-        List<Map<String, String>> systemProperties = getSystemProperties(MarshallingUtils.buildMapFromDocument(response.readEntity(String.class)));
+        response = managementClient.get(URL_DAS_SYSTEM_PROPERTIES);
+        List<Map<String, String>> systemProperties = getSystemProperties(
+            buildMapFromDocument(response.readEntity(String.class)));
         assertNotNull(systemProperties);
 
         int testPropsFound = 0;
@@ -72,9 +78,9 @@
 
         assertEquals(2, testPropsFound);
 
-        response = delete(URL_DAS_SYSTEM_PROPERTIES+"/"+prop1);
+        response = managementClient.delete(URL_DAS_SYSTEM_PROPERTIES+"/"+prop1);
         assertEquals(200, response.getStatus());
-        response = delete(URL_DAS_SYSTEM_PROPERTIES+"/"+prop2);
+        response = managementClient.delete(URL_DAS_SYSTEM_PROPERTIES+"/"+prop2);
         assertEquals(200, response.getStatus());
     }
 
@@ -84,11 +90,11 @@
         Map<String, String> payload = new HashMap<>() {{
             put(prop1, "http://localhost:4848");
         }};
-        Response response = post(URL_DAS_SYSTEM_PROPERTIES, payload);
+        Response response = managementClient.post(URL_DAS_SYSTEM_PROPERTIES, payload);
         assertEquals(200, response.getStatus());
-        response = get(URL_DAS_SYSTEM_PROPERTIES);
+        response = managementClient.get(URL_DAS_SYSTEM_PROPERTIES);
         List<Map<String, String>> systemProperties = getSystemProperties(
-            MarshallingUtils.buildMapFromDocument(response.readEntity(String.class)));
+            buildMapFromDocument(response.readEntity(String.class)));
         assertNotNull(systemProperties);
 
         int testPropsFound = 0;
@@ -101,7 +107,7 @@
 
         assertEquals(1, testPropsFound);
 
-        response = delete(URL_DAS_SYSTEM_PROPERTIES + "/" + prop1);
+        response = managementClient.delete(URL_DAS_SYSTEM_PROPERTIES + "/" + prop1);
         assertEquals(200, response.getStatus());
     }
 
@@ -117,7 +123,7 @@
         final String instanceName = "in" + generateRandomNumber();
         final String propertyName = "property" + generateRandomString();
 
-        Response response = post(URL_CREATE_INSTANCE, Map.of("id", instanceName, "node", "localhost-domain1"));
+        Response response = managementClient.post(URL_CREATE_INSTANCE, Map.of("id", instanceName, "node", "localhost-domain1"));
         assertEquals(200, response.getStatus());
 
         createAndTestConfigProperty(propertyName, PROP_VALUE, instanceName + "-config");
@@ -127,8 +133,8 @@
     @Test
     public void testNotResolvingClusterProperties() {
         final String propertyName = "property" + generateRandomString();
-        final String clusterName = "c" + generateRandomNumber();
-        final String instanceName = clusterName + "in" + generateRandomNumber();
+        final String clusterName = "cluster_" + generateRandomNumber();
+        final String instanceName = clusterName + "_instance_" + generateRandomNumber();
         createCluster(clusterName);
         createClusterInstance(clusterName, instanceName);
 
@@ -141,14 +147,14 @@
 
     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))));
+        Response response = managementClient.get(url);
+        Map<String, String> payload = getSystemPropertiesMap(getSystemProperties(buildMapFromDocument(response.readEntity(String.class))));
         payload.put(propertyName, propertyValue);
-        response = post(url, payload);
+        response = managementClient.post(url, payload);
         assertEquals(200, response.getStatus());
 
-        response = get(url);
-        List<Map<String, String>> systemProperties = getSystemProperties(MarshallingUtils.buildMapFromDocument(response.readEntity(String.class)));
+        response = managementClient.get(url);
+        List<Map<String, String>> systemProperties = getSystemProperties(buildMapFromDocument(response.readEntity(String.class)));
         Map<String, String> sysProp = getSystemProperty(propertyName, systemProperties);
         assertNotNull(sysProp);
         assertEquals(propertyValue, sysProp.get("value"));
@@ -157,18 +163,18 @@
     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);
-        List<Map<String, String>> systemProperties = getSystemProperties(MarshallingUtils.buildMapFromDocument(response.readEntity(String.class)));
+        Response response = managementClient.get(clusterSysPropsUrl);
+        List<Map<String, String>> systemProperties = getSystemProperties(buildMapFromDocument(response.readEntity(String.class)));
         Map<String, String> sysProp = getSystemProperty(propertyName, systemProperties);
         assertNotNull(sysProp);
         assertEquals(sysProp.get("defaultValue"), defaultValue);
 
-        response = post(clusterSysPropsUrl, Map.of(propertyName, propertyValue));
+        response = managementClient.post(clusterSysPropsUrl, Map.of(propertyName, propertyValue));
         assertEquals(200, response.getStatus());
 
         // Check updated/overriden system property
-        response = get(clusterSysPropsUrl);
-        systemProperties = getSystemProperties(MarshallingUtils.buildMapFromDocument(response.readEntity(String.class)));
+        response = managementClient.get(clusterSysPropsUrl);
+        systemProperties = getSystemProperties(buildMapFromDocument(response.readEntity(String.class)));
         sysProp = getSystemProperty(propertyName, systemProperties);
         assertNotNull(sysProp);
         assertEquals(sysProp.get("value"), propertyValue);
@@ -178,18 +184,18 @@
     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);
-        List<Map<String, String>> systemProperties = getSystemProperties(MarshallingUtils.buildMapFromDocument(response.readEntity(String.class)));
+        Response response = managementClient.get(instanceSysPropsUrl);
+        List<Map<String, String>> systemProperties = getSystemProperties(buildMapFromDocument(response.readEntity(String.class)));
         Map<String, String> sysProp = getSystemProperty(propertyName, systemProperties);
         assertNotNull(sysProp);
         assertEquals(sysProp.get("defaultValue"), defaultValue);
 
-        response = post(instanceSysPropsUrl, Map.of(propertyName, propertyValue));
+        response = managementClient.post(instanceSysPropsUrl, Map.of(propertyName, propertyValue));
         assertEquals(200, response.getStatus());
 
         // Check updated/overriden system property
-        response = get(instanceSysPropsUrl);
-        systemProperties = getSystemProperties(MarshallingUtils.buildMapFromDocument(response.readEntity(String.class)));
+        response = managementClient.get(instanceSysPropsUrl);
+        systemProperties = getSystemProperties(buildMapFromDocument(response.readEntity(String.class)));
         sysProp = getSystemProperty(propertyName, systemProperties);
         assertNotNull(sysProp);
         assertEquals(propertyValue, sysProp.get("value"));
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/TokenAuthenticationITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/TokenAuthenticationITest.java
index 92a3619..db2456d 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/TokenAuthenticationITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/TokenAuthenticationITest.java
@@ -17,21 +17,19 @@
 
 package org.glassfish.nucleus.admin.rest;
 
-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 org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
-import org.junit.jupiter.api.AfterEach;
+import org.glassfish.nucleus.test.tool.DomainAdminRestClient;
+import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Test;
 
+import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
@@ -39,85 +37,85 @@
  * @author Mitesh Meswani
  */
 public class TokenAuthenticationITest 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();
-        }
+    @AfterAll
+    public static void cleanup() {
+        managementClient.delete(URL_DELETE_USER, Map.of("id", AUTH_USER_NAME));
     }
 
 
     @Test
     public void testTokenCreateAndDelete() {
-        String token = getSessionToken(this);
+        String token = getSessionToken(managementClient);
         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);
+        Response response = managementClient.getRequestBuilder("/domain")
+            .cookie(new Cookie(GF_REST_TOKEN_COOKIE_NAME, token)).get(Response.class);
         assertEquals(200, response.getStatus());
 
         // 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);
+        response = managementClient.getRequestBuilder(URL_DOMAIN_SESSIONS + "/" + token)
+            .cookie(new Cookie(GF_REST_TOKEN_COOKIE_NAME, token)).delete(Response.class);
+        managementClient.delete(URL_DOMAIN_SESSIONS);
         assertEquals(200, response.getStatus());
     }
 
+
     @Test
     public void testAuthRequired() {
-        String token = null;
-        try {
-            deleteUserAuthTestUser(null);
+        Response delResponse = managementClient.delete(URL_DELETE_USER, Map.of("id", AUTH_USER_NAME));
+        // as of gf6 any error means 500. The user doesn't exist.
+        assertEquals(500, delResponse.getStatus());
 
-            // Verify that we can get unauthenticated access to the server
-            Response response = client.get("domain");
+        try (DummyClient client = new DummyClient()) {
+            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);
-            assertEquals(200, response.getStatus());
-
-            // Verify that we must now authentication (response.status = 401)
-            response = client.get("domain");
+                );
+            Response createUserResponse = managementClient.post(URL_CREATE_USER, newUser);
+            assertEquals(200, createUserResponse.getStatus());
+        }
+        try (AnonymousClient client = new AnonymousClient()) {
+            Response response = client.getRequestBuilder("/domain").get(Response.class);
             assertEquals(401, response.getStatus());
+        }
+        final String token;
+        try (DummyClient dummyClient = new DummyClient()) {
+            token = getSessionToken(dummyClient);
+        }
 
-            // Authenticate, get the token, then "clear" the authentication
-            client.getClient().register(AUTH_DUMMY);
-            token = getSessionToken(client);
-            client.resetClient();
-
-            // Build this request manually so we can pass the cookie
-            response = client.getClient().target(getAddress("domain")).request().cookie(new Cookie(GF_REST_TOKEN_COOKIE_NAME, token)).get(Response.class);
+        try (CookieClient cookieClient = new CookieClient(token)) {
+            Response response = cookieClient.get("/domain");
             assertEquals(200, response.getStatus());
-            client.resetClient();
-
-            // Request again w/o the cookie.  This should fail.
-            response = client.getClient().target(getAddress("domain")).request().get(Response.class);
+        }
+        try (AnonymousClient client = new AnonymousClient()) {
+            Response response = client.getRequestBuilder("/domain").get(Response.class);
             assertEquals(401, response.getStatus());
-        } finally {
-            deleteUserAuthTestUser(token);
+        }
+        try (CookieClient cookieClient = new CookieClient(token)) {
+            Response response = cookieClient.delete(URL_DELETE_USER, Map.of("id", AUTH_USER_NAME));
+            assertEquals(200, response.getStatus());
         }
     }
 
-    private String getSessionToken(RestTestBase client) {
+
+    private String getSessionToken(DomainAdminRestClient client) {
         Response response = client.post(URL_DOMAIN_SESSIONS);
         assertEquals(200, response.getStatus());
         Map<String, ?> responseMap = MarshallingUtils.buildMapFromDocument(response.readEntity(String.class));
@@ -125,48 +123,50 @@
         return (String) extraProperties.get("token");
     }
 
-    private void deleteUserAuthTestUser(String token) {
-        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);
-            assertEquals(200, response.getStatus());
+
+    private static final class AnonymousClient extends DomainAdminRestClient {
+
+        public AnonymousClient() {
+            super(new ClientWrapper(), managementClient.getBaseUrl(), APPLICATION_JSON);
         }
     }
 
 
-    private static class DummyClient extends RestTestBase implements Closeable {
+    private static final class DummyClient extends DomainAdminRestClient {
 
-        Client client;
+        public DummyClient() {
+            super(createClient(), managementClient.getBaseUrl(), APPLICATION_JSON);
+        }
 
-        @Override
-        protected Client getClient() {
-            if (client == null) {
-                client = new ClientWrapper(new HashMap<String, String>(), null, null);
-            }
+        private static ClientWrapper createClient() {
+            ClientWrapper client = new ClientWrapper();
+            client.register(AUTH_DUMMY);
             return client;
         }
+    }
 
 
+    private static final class CookieClient extends DomainAdminRestClient {
+
+        private final String securityCookie;
+
+        public CookieClient(final String securityCookie) {
+            super(new ClientWrapper(), managementClient.getBaseUrl(), APPLICATION_JSON);
+            this.securityCookie = securityCookie;
+        }
+
         @Override
-        protected void resetClient() {
-            if (client == null) {
-                return;
-            }
-            client.close();
-            client = null;
+        public Response delete(final String relativePath, final Map<String, String> queryParams) {
+            return getTarget(relativePath, queryParams).request()
+                .cookie(new Cookie(GF_REST_TOKEN_COOKIE_NAME, securityCookie)).delete(Response.class);
         }
 
 
         @Override
-        public void close() throws IOException {
-            resetClient();
+        public Response get(final String relativePath, final Map<String, String> queryParams) {
+            return getTarget(relativePath, queryParams).request()
+                .cookie(new Cookie(GF_REST_TOKEN_COOKIE_NAME, securityCookie)).get(Response.class);
         }
+
     }
 }
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ZeroConfigITest.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ZeroConfigITest.java
index 5016830..5e3da6b 100644
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ZeroConfigITest.java
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/admin/rest/ZeroConfigITest.java
@@ -37,15 +37,16 @@
  * @author jdlee
  */
 public class ZeroConfigITest 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
+     * server-config stdOut of the box.  This should continue to be the case once
      * zero-config is fully implemented and integrated.
      */
     @Test
     public void testTransactionService() {
-        final Response response = get(BASE_SERVER_CONFIG_URL + "/transaction-service");
+        final Response response = managementClient.get(BASE_SERVER_CONFIG_URL + "/transaction-service");
         assertEquals(200, response.getStatus());
         Map<String, String> entity = getEntityValues(response);
         assertNotNull(entity);
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/AsadminResultMatcher.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/AsadminResultMatcher.java
new file mode 100644
index 0000000..960ae54
--- /dev/null
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/AsadminResultMatcher.java
@@ -0,0 +1,48 @@
+/*
+ * 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.glassfish.nucleus.test.tool.asadmin.Asadmin;
+import org.glassfish.nucleus.test.tool.asadmin.AsadminResult;
+import org.hamcrest.CustomTypeSafeMatcher;
+
+
+/**
+ * Matcher checking that {@link Asadmin} command succeeded. Prints it's output otherwise.
+ *
+ * @author David Matejcek
+ */
+public class AsadminResultMatcher extends CustomTypeSafeMatcher<AsadminResult> {
+
+    private AsadminResultMatcher() {
+        super("asadmin succeeded");
+    }
+
+
+    @Override
+    protected boolean matchesSafely(AsadminResult item) {
+        return !item.isError();
+    }
+
+
+    /**
+     * @return matcher checking that {@link Asadmin} command succeeded. Prints it's output otherwise.
+     */
+    public static AsadminResultMatcher asadminOK() {
+        return new AsadminResultMatcher();
+    }
+}
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/DomainAdminRestClient.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/DomainAdminRestClient.java
new file mode 100644
index 0000000..0c86fb7
--- /dev/null
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/DomainAdminRestClient.java
@@ -0,0 +1,168 @@
+/*
+ * 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 jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.client.Invocation.Builder;
+import jakarta.ws.rs.client.WebTarget;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.MultivaluedHashMap;
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.Response;
+
+import java.io.Closeable;
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.glassfish.admin.rest.client.ClientWrapper;
+import org.glassfish.jersey.media.multipart.FormDataMultiPart;
+import org.glassfish.jersey.media.multipart.file.FileDataBodyPart;
+import org.glassfish.nucleus.test.tool.asadmin.GlassFishTestEnvironment;
+
+import static jakarta.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED;
+
+/**
+ * @author David Matejcek
+ */
+public class DomainAdminRestClient implements Closeable {
+
+    private final ClientWrapper client;
+    private final String baseUrl;
+    private final String responseType;
+
+    public DomainAdminRestClient(final String baseUrl) {
+        this(baseUrl, MediaType.APPLICATION_JSON);
+    }
+
+
+    public DomainAdminRestClient(final String baseUrl, final String responseType) {
+        this(GlassFishTestEnvironment.createClient(), baseUrl, responseType);
+    }
+
+
+    public DomainAdminRestClient(final ClientWrapper client, final String baseUrl, final String responseType) {
+        this.client = client;
+        this.baseUrl = baseUrl;
+        this.responseType = responseType;
+    }
+
+
+    /**
+     * @return http://localhost:4848/management or something else, see constructor.
+     */
+    public final String getBaseUrl() {
+        return baseUrl;
+    }
+
+
+    public Response options(final String relativePath) {
+        return getRequestBuilder(relativePath).options(Response.class);
+    }
+
+
+    public Response get(final String relativePath) {
+        return get(relativePath, new HashMap<String, String>());
+    }
+
+
+    public Response get(final String relativePath, final Map<String, String> queryParams) {
+        final WebTarget target = getTarget(relativePath, queryParams);
+        return target.request(responseType).get(Response.class);
+    }
+
+    public <T> Response put(final String relativePath, final Entity<T> entityPayload) {
+        return getRequestBuilder(relativePath).put(entityPayload, Response.class);
+    }
+
+
+    public Response post(final String relativePath) {
+        return getRequestBuilder(relativePath).post(Entity.entity(null, APPLICATION_FORM_URLENCODED), Response.class);
+    }
+
+
+    public Response post(final String relativePath, final Map<String, String> payload) {
+        return post(relativePath, buildMultivaluedMap(payload));
+    }
+
+
+    public Response post(final String relativePath, final MultivaluedMap<String, String> payload) {
+        return getRequestBuilder(relativePath).post(Entity.entity(payload, APPLICATION_FORM_URLENCODED), Response.class);
+    }
+
+
+    public <T> Response post(final String relativePath, final Entity<T> entityPayload) {
+        return getRequestBuilder(relativePath).post(entityPayload, Response.class);
+    }
+
+    public Response postWithUpload(final String relativePath, final Map<String, Object> payload) {
+        final FormDataMultiPart form = new FormDataMultiPart();
+        for (final Map.Entry<String, Object> entry : payload.entrySet()) {
+            if (entry.getValue() instanceof File) {
+                form.getBodyParts().add((new FileDataBodyPart(entry.getKey(), (File) entry.getValue())));
+            } else {
+                form.field(entry.getKey(), entry.getValue(), MediaType.TEXT_PLAIN_TYPE);
+            }
+        }
+        return getRequestBuilder(relativePath).post(Entity.entity(form, MediaType.MULTIPART_FORM_DATA), Response.class);
+    }
+
+
+    public Response delete(final String relativePath) {
+        return delete(relativePath, new HashMap<String, String>());
+    }
+
+    public Response delete(final String relativePath, final Map<String, String> queryParams) {
+        final WebTarget target = getTarget(relativePath, queryParams);
+        return target.request(responseType).delete(Response.class);
+    }
+
+
+    public Builder getRequestBuilder(final String relativePath) {
+        return getTarget(relativePath, null).request(responseType);
+    }
+
+
+    public WebTarget getTarget(final String relativePath, final Map<String, String> queryParams) {
+        WebTarget target = client.target(baseUrl + relativePath);
+        if (queryParams == null) {
+            return target;
+        }
+        for (final Map.Entry<String, String> entry : queryParams.entrySet()) {
+            target = target.queryParam(entry.getKey(), entry.getValue());
+        }
+        return target;
+    }
+
+
+    @Override
+    public void close() {
+        client.close();
+    }
+
+
+    private MultivaluedMap<String, String> buildMultivaluedMap(final Map<String, String> payload) {
+        final MultivaluedMap<String, String> formData = new MultivaluedHashMap<>();
+        if (payload != null) {
+            for (final Entry<String, String> entry : payload.entrySet()) {
+                formData.add(entry.getKey(), entry.getValue());
+            }
+        }
+        return formData;
+    }
+}
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/DomainLifecycleExtension.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/DomainLifecycleExtension.java
deleted file mode 100644
index 866c4a0..0000000
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/DomainLifecycleExtension.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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", "--debug", "domain1");
-    }
-}
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/NucleusTestUtils.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/NucleusTestUtils.java
deleted file mode 100644
index 0072006..0000000
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/NucleusTestUtils.java
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- * 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/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/StopDomainExtension.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/StopDomainExtension.java
deleted file mode 100644
index ea5699a..0000000
--- a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/StopDomainExtension.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/asadmin/Asadmin.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/asadmin/Asadmin.java
new file mode 100644
index 0000000..12da171
--- /dev/null
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/asadmin/Asadmin.java
@@ -0,0 +1,143 @@
+/*
+ * 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.asadmin;
+
+import com.sun.enterprise.universal.process.ProcessManager;
+import com.sun.enterprise.universal.process.ProcessManagerException;
+import com.sun.enterprise.universal.process.ProcessManagerTimeoutException;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import static java.util.Arrays.asList;
+
+/**
+ * Tool for executing asadmin/asadmin.bat commands.
+ * The tool is stateless.
+ *
+ * @author David Matejcek
+ */
+public class Asadmin {
+    private static final Logger LOG = Logger.getLogger(Asadmin.class.getName());
+
+    private static final int DEFAULT_TIMEOUT_MSEC = 10 * 1000;
+
+    private final File asadmin;
+    private final String adminUser;
+    private final File adminPasswordFile;
+
+
+    /**
+     * Creates a stateless instance of the tool.
+     *
+     * @param asadmin - executable file
+     * @param adminUser - username authorized to use the domain
+     * @param adminPasswordFile - a file containing admin's password set as <code>AS_ADMIN_PASSWORD=...</code>
+     */
+    public Asadmin(final File asadmin, final String adminUser, final File adminPasswordFile) {
+        this.asadmin = asadmin;
+        this.adminUser = adminUser;
+        this.adminPasswordFile = adminPasswordFile;
+    }
+
+
+    /**
+     * @return asadmin command file name
+     */
+    public String getCommandName() {
+        return asadmin.getName();
+    }
+
+
+    /**
+     * Executes the command with arguments asynchronously with {@value #DEFAULT_TIMEOUT_MSEC} ms timeout.
+     * The command can be attached by the attach command.
+     * You should find the job id in the {@link AsadminResult#getStdOut()} as <code>Job ID: [0-9]+</code>
+     *
+     * @param args
+     * @return {@link AsadminResult} never null.
+     */
+    public AsadminResult execDetached(final String... args) {
+        return exec(DEFAULT_TIMEOUT_MSEC, true, args);
+    }
+
+    /**
+     * Executes the command with arguments synchronously with {@value #DEFAULT_TIMEOUT_MSEC} ms timeout.
+     *
+     * @param args
+     * @return {@link AsadminResult} never null.
+     */
+    public AsadminResult exec(final String... args) {
+        return exec(DEFAULT_TIMEOUT_MSEC, false, args);
+    }
+
+
+    /**
+     * Executes the command with arguments.
+     *
+     * @param timeout timeout in millis
+     * @param detached - detached command is executed asynchronously, can be attached later by the attach command.
+     * @param args - command and arguments.
+     * @return {@link AsadminResult} never null.
+     */
+    public AsadminResult exec(final int timeout, final boolean detached, final String... args) {
+        final List<String> parameters = asList(args);
+        LOG.log(Level.INFO, "exec(timeout={0}, detached={1}, args={2})", new Object[] {timeout, detached, parameters});
+        final List<String> command = new ArrayList<>();
+        command.add(asadmin.getAbsolutePath());
+        command.add("--user");
+        command.add(adminUser);
+        command.add("--passwordfile");
+        command.add(adminPasswordFile.getAbsolutePath());
+        if (detached) {
+            command.add("--detach");
+        }
+        command.addAll(parameters);
+
+        final ProcessManager pm = new ProcessManager(command);
+        pm.setTimeoutMsec(timeout);
+        pm.setEcho(false);
+
+        int exitCode;
+        String asadminErrorMessage = "";
+        try {
+            exitCode = pm.execute();
+        } catch (final ProcessManagerTimeoutException e) {
+            asadminErrorMessage = "ProcessManagerTimeoutException: command timed stdOut after " + timeout + " ms.\n";
+            exitCode = 1;
+        } catch (final ProcessManagerException e) {
+            LOG.log(Level.SEVERE, "The execution failed.", e);
+            asadminErrorMessage = e.getMessage();
+            exitCode = 1;
+        }
+
+        final String stdErr = pm.getStderr() + '\n' + asadminErrorMessage;
+        final AsadminResult ret = new AsadminResult(args[0], exitCode, pm.getStdout(), stdErr);
+        writeToStdOut(ret.getOutput());
+        return ret;
+    }
+
+
+    private static void writeToStdOut(final String text) {
+        if (!text.isEmpty()) {
+            System.out.print(text);
+        }
+    }
+}
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/asadmin/AsadminResult.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/asadmin/AsadminResult.java
new file mode 100644
index 0000000..1850ea5
--- /dev/null
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/asadmin/AsadminResult.java
@@ -0,0 +1,95 @@
+/*
+ * 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.asadmin;
+
+/**
+ * Result of the {@link Asadmin} execution.
+ *
+ * @author David Matejcek
+ */
+public class AsadminResult {
+
+    private final boolean error;
+    private final String stdOut;
+    private final String stdErr;
+    private final String output;
+
+    /**
+     * Creates a value object instance.
+     *
+     * @param cmd - command name
+     * @param exitCode
+     * @param stdOut
+     * @param stdErr
+     */
+    public AsadminResult(final String cmd, final int exitCode, final String stdOut, final String stdErr) {
+        this.error = exitCode != 0 || containsError(stdOut, String.format("Command %s failed.", cmd));
+        this.stdOut = stdOut;
+        this.stdErr = stdErr;
+        this.output = this.stdOut + this.stdErr;
+    }
+
+
+    /**
+     * @return true if the error code was not zero OR stdOut contained text <i>Command x failed</i>.
+     */
+    public boolean isError() {
+        return error;
+    }
+
+
+    /**
+     * @return standard output made by the command.
+     */
+    public String getStdOut() {
+        return stdOut;
+    }
+
+    /**
+     * @return error output made by the command.
+     */
+    public String getStdErr() {
+        return stdErr;
+    }
+
+
+    /**
+     * @return {@link #getStdOut()} + {@link #getStdErr()}
+     */
+    public String getOutput() {
+        return output;
+    }
+
+
+    /**
+     * Returns {@link #getOutput()}. Important for hamcrest matchers!
+     */
+    @Override
+    public String toString() {
+        return getOutput();
+    }
+
+
+    private static boolean containsError(final String text, final String... invalidResults) {
+        for (final String result : invalidResults) {
+            if (text.contains(result)) {
+                return true;
+            }
+        }
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/asadmin/GlassFishTestEnvironment.java b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/asadmin/GlassFishTestEnvironment.java
new file mode 100644
index 0000000..a8f057f
--- /dev/null
+++ b/appserver/tests/admin/tests/src/test/java/org/glassfish/nucleus/test/tool/asadmin/GlassFishTestEnvironment.java
@@ -0,0 +1,222 @@
+/*
+ * 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.asadmin;
+
+import jakarta.ws.rs.client.Client;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.Authenticator;
+import java.net.HttpURLConnection;
+import java.net.PasswordAuthentication;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.glassfish.admin.rest.client.ClientWrapper;
+import org.glassfish.nucleus.test.tool.AsadminResultMatcher;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * This class represents GlassFish installation outside test environment.
+ * <p>
+ * Ensures that the domain in executed before first test started, and that the domain stops
+ * after tests are finished.
+ *
+ * @author David Matejcek
+ */
+public class GlassFishTestEnvironment {
+    private static final Logger LOG = Logger.getLogger(GlassFishTestEnvironment.class.getName());
+
+    private static final File BASEDIR = detectBasedir();
+    private static final File GF_ROOT = resolveGlassFishRoot();
+
+    private static final String ADMIN_USER = "admin";
+    private static final String ADMIN_PASSWORD = "admintest";
+
+    private static final File ASADMIN = findAsadmin();
+    private static final File PASSWORD_FILE_FOR_UPDATE = findPasswordFile("password_update.txt");
+    private static final File PASSWORD_FILE = findPasswordFile("password.txt");
+
+
+    static {
+        LOG.log(Level.INFO, "Using basedir: {0}", BASEDIR);
+        LOG.log(Level.INFO, "Expected GlassFish directory: {0}", GF_ROOT);
+        changePassword();
+        Thread hook = new Thread(() -> {
+            getAsadmin().exec(10_000, false, "stop-domain", "--kill", "--force");
+        });
+        Runtime.getRuntime().addShutdownHook(hook);
+        assertThat(getAsadmin().exec(30_000, false, "start-domain"), AsadminResultMatcher.asadminOK());
+    }
+
+    /**
+     * @return {@link Asadmin} command api for tests.
+     */
+    public static Asadmin getAsadmin() {
+        return new Asadmin(ASADMIN, ADMIN_USER, PASSWORD_FILE);
+    }
+
+
+    /**
+     * @return project's target directory.
+     */
+    public static File getTargetDirectory() {
+        return new File(BASEDIR, "target");
+    }
+
+
+    /**
+     * Creates a {@link Client} instance for the domain administrator.
+     * Caller is responsible for closing.
+     *
+     * @return new {@link Client} instance
+     */
+    public static ClientWrapper createClient() {
+        return new ClientWrapper(new HashMap<String, String>(), ADMIN_USER, ADMIN_PASSWORD);
+    }
+
+
+    /**
+     * Creates a {@link HttpURLConnection} for the admin administrator.
+     *
+     * @param context - part of the url behind the <code>http://localhost:4848</code>
+     * @return a new disconnected {@link HttpURLConnection}.
+     * @throws IOException
+     */
+    public static HttpURLConnection openConnection(final String context) throws IOException {
+        final HttpURLConnection connection = (HttpURLConnection) new URL("http://localhost:4848" + context)
+            .openConnection();
+        connection.setRequestProperty("X-Requested-By", "JUnit5Test");
+        connection.setAuthenticator(new DasAuthenticator());
+        return connection;
+    }
+
+
+    /**
+     * This will delete the jobs.xml file
+     */
+    public static void deleteJobsFile() {
+        Path path = GF_ROOT.toPath().resolve(Paths.get("domains", "domain1", "config", "jobs.xml"));
+        LOG.log(Level.CONFIG, "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(GlassFishTestEnvironment::deleteSubpaths);
+        } catch (IOException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+
+    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);
+        }
+    }
+
+
+    /**
+     * Useful for a heuristic inside Eclipse and other environments.
+     *
+     * @return Absolute path to the glassfish directory.
+     */
+    private static File detectBasedir() {
+        final String basedir = System.getProperty("basedir");
+        if (basedir != null) {
+            return new File(basedir);
+        }
+        final File target = new File("target");
+        if (target.exists()) {
+            return target.getAbsoluteFile().getParentFile();
+        }
+        return new File(".").getAbsoluteFile().getParentFile();
+    }
+
+
+    private static File resolveGlassFishRoot() {
+        final File gfDir = BASEDIR.toPath().resolve(Path.of("target", "glassfish6", "glassfish")).toFile();
+        if (gfDir == null || !gfDir.exists()) {
+            throw new IllegalStateException("The expected GlassFish home directory doesn't exist: " + gfDir);
+        }
+        return gfDir;
+    }
+
+
+    private static File findAsadmin() {
+        return new File(GF_ROOT, isWindows() ? "bin/asadmin.bat" : "bin/asadmin");
+    }
+
+
+    private static boolean isWindows() {
+        return System.getProperty("os.name").toLowerCase(Locale.ENGLISH).contains("win");
+    }
+
+
+    private static File findPasswordFile(final String filename) {
+        try {
+            final URL url = Asadmin.class.getResource("/" + filename);
+            if (url == null) {
+                throw new IllegalStateException(filename + " not found");
+            }
+            return Path.of(url.toURI()).toFile().getAbsoluteFile();
+        } catch (final URISyntaxException e) {
+            throw new IllegalStateException(e);
+        }
+    }
+
+
+    private static void changePassword() {
+        final Asadmin asadmin = new Asadmin(ASADMIN, ADMIN_USER, PASSWORD_FILE_FOR_UPDATE);
+        final AsadminResult result = asadmin.exec(5_000, false, "change-admin-password");
+        if (result.isError()) {
+            // probably changed by previous execution without maven clean
+            System.out.println("Admin password NOT changed.");
+        } else {
+            System.out.println("Admin password changed.");
+        }
+    }
+
+    private static class DasAuthenticator extends Authenticator {
+
+        @Override
+        protected PasswordAuthentication getPasswordAuthentication() {
+            return new PasswordAuthentication(ADMIN_USER, ADMIN_PASSWORD.toCharArray());
+        }
+    }
+}
