You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by kl...@apache.org on 2018/11/30 17:50:12 UTC

[geode] branch develop updated: GEODE-6096: Cleanup dunit internals (#2919)

This is an automated email from the ASF dual-hosted git repository.

klund pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new 9918f9b  GEODE-6096: Cleanup dunit internals (#2919)
9918f9b is described below

commit 9918f9b13621a6318346c795d127ba94d718953f
Author: Kirk Lund <kl...@apache.org>
AuthorDate: Fri Nov 30 09:50:01 2018 -0800

    GEODE-6096: Cleanup dunit internals (#2919)
    
    * Move all dunit internals to test.dunit.internal package.
    * Move VersionManager to test.version package.
    * Move greplogs to test.greplogs package.
    * Rename some classes to be more informative.
    * Reduce public to package-protected where it's appropriate.
    * Extract inner classes/interfaces to be top-level classes.
---
 .../cli/commands/ConnectCommandAcceptanceTest.java |   2 +-
 .../geode/test/junit/rules/GfshRuleTest.java       |   2 +-
 ...omcatSessionBackwardsCompatibilityTestBase.java |   2 +-
 .../distributed/DistributedLockBlackboardImpl.java |   2 +-
 .../apache/geode/distributed/LocatorDUnitTest.java |   2 +-
 .../geode/distributed/SystemAdminDUnitTest.java    |   2 +-
 .../alerting/AlertingServiceDistributedTest.java   |   2 +-
 ...rtingServiceWithoutListenerDistributedTest.java |   2 +-
 ...overWithMixedVersionServersDistributedTest.java |   2 +-
 .../CompressionRegionConfigDUnitTest.java          |   2 +-
 .../DistributedSystemMXBeanDistributedTest.java    |   2 +-
 ...butedSystemMXBeanWithAlertsDistributedTest.java |   2 +-
 ...stemMXBeanWithNotificationsDistributedTest.java |   2 +-
 .../geode/management/ManagementTestRule.java       |   2 +-
 .../apache/geode/security/ClientAuthDUnitTest.java |   2 +-
 .../security/ClientAuthenticationDUnitTest.java    |   2 +-
 .../ClientAuthenticationPart2DUnitTest.java        |   2 +-
 .../security/ClientAuthenticationTestCase.java     |   2 +-
 ...tAuthorizationLegacyConfigurationDUnitTest.java |   2 +-
 ...aAuthorizationUsingLegacySecurityDUnitTest.java |   2 +-
 ...onUsingLegacySecurityWithFailoverDUnitTest.java |   2 +-
 .../DistributedSystemMXBeanIntegrationTest.java    |   2 +-
 .../internal/cache/TxCommitMessageBCTestBase.java  |   2 +-
 .../RollingUpgrade2DUnitTestBase.java              |   4 +-
 .../rollingupgrade/RollingUpgradeDUnitTest.java    |   2 +-
 ...gradeHARegionNameOnDifferentServerVersions.java |   2 +-
 .../RollingUpgradeNonHAFunction.java               |   2 +-
 .../rollingupgrade/RollingUpgradeTracePRQuery.java |   2 +-
 .../RollingUpgradeVerifyXmlEntity.java             |   2 +-
 .../tier/sockets/ClientServerMiscBCDUnitTest.java  |   2 +-
 .../security/ClientAuthorizationCQDUnitTest.java   |   2 +-
 ...tartupRuleCanSpecifyOlderVersionsDUnitTest.java |   2 +-
 .../dunit/examples/BeforeClassExampleTest.java     |   2 +-
 geode-dunit/src/main/java/hydra/MethExecutor.java  | 363 ---------------------
 .../src/main/java/hydra/MethExecutorResult.java    | 182 -----------
 .../sockets/ClientServerMiscDUnitTestBase.java     |   4 +-
 .../security/ClientAuthorizationTestCase.java      |   2 +-
 .../java/org/apache/geode/test/dunit/DUnitEnv.java |   2 +-
 .../java/org/apache/geode/test/dunit/Host.java     |   4 +-
 .../main/java/org/apache/geode/test/dunit/VM.java  |  21 +-
 .../{standalone => internal}/BounceResult.java     |   2 +-
 .../dunit/{standalone => internal}/ChildVM.java    |   5 +-
 .../geode/test/dunit/internal/DUnitHost.java       | 119 +++++++
 .../{standalone => internal}/DUnitLauncher.java    | 174 +---------
 .../dunit/internal/InternalBlackboardImpl.java     |   2 -
 .../dunit/internal/JUnit4DistributedTestCase.java  |   1 -
 .../apache/geode/test/dunit/internal/Master.java   |  71 ++++
 .../MasterRemote.java}                             |  25 +-
 .../geode/test/dunit/internal/MethodInvoker.java   | 255 +++++++++++++++
 .../test/dunit/internal/MethodInvokerResult.java   | 139 ++++++++
 .../{standalone => internal}/ProcessHolder.java    |   2 +-
 .../{standalone => internal}/ProcessManager.java   |   3 +-
 .../{standalone => internal}/RemoteDUnitVM.java    |  23 +-
 .../{standalone => internal}/RemoteDUnitVMIF.java  |  11 +-
 .../StandAloneDUnitEnv.java                        |   4 +-
 .../test/dunit/rules/AbstractDistributedRule.java  |   2 +-
 .../apache/geode/test/dunit/rules/CacheRule.java   |   2 +-
 .../geode/test/dunit/rules/ClusterStartupRule.java |   6 +-
 .../test/dunit/rules/DistributedDiskDirRule.java   |   2 +-
 .../geode/test/dunit/rules/DistributedRule.java    |   2 +-
 .../DistributedUseJacksonForJsonPathRule.java      |   2 +-
 .../geode/test}/greplogs/ExpectedStrings.java      |   2 +-
 .../apache/geode/test}/greplogs/LogConsumer.java   |   2 +-
 .../test/dunit/internal/MethodInvokerTest.java}    |  31 +-
 .../geode/test/junit/rules/gfsh/GfshRule.java      |   2 +-
 .../standalone => version}/VersionManager.java     |   2 +-
 .../VersionManagerJUnitTest.java                   |   2 +-
 .../LuceneSearchWithRollingUpgradeDUnit.java       |   4 +-
 ...ateGatewaySenderMixedSiteOneCurrentSiteTwo.java |   2 +-
 .../cache/wan/WANRollingUpgradeDUnitTest.java      |   4 +-
 ...eEventProcessingMixedSiteOneCurrentSiteTwo.java |   2 +-
 ...adeEventProcessingOldSiteOneCurrentSiteTwo.java |   2 +-
 ...ipleReceiversDefinedInClusterConfiguration.java |   2 +-
 ...tReprocessedAfterCurrentSiteMemberFailover.java |   2 +-
 ...fterCurrentSiteMemberFailoverWithOldClient.java |   2 +-
 ...tsNotReprocessedAfterOldSiteMemberFailover.java |   2 +-
 ...eCacheServerProfileToMembersOlderThan1dot5.java |   2 +-
 ...ANRollingUpgradeVerifyGatewaySenderProfile.java |   2 +-
 78 files changed, 722 insertions(+), 843 deletions(-)

diff --git a/geode-assembly/src/acceptanceTest/java/org/apache/geode/management/internal/cli/commands/ConnectCommandAcceptanceTest.java b/geode-assembly/src/acceptanceTest/java/org/apache/geode/management/internal/cli/commands/ConnectCommandAcceptanceTest.java
index 11bf876..fc2a3b8 100644
--- a/geode-assembly/src/acceptanceTest/java/org/apache/geode/management/internal/cli/commands/ConnectCommandAcceptanceTest.java
+++ b/geode-assembly/src/acceptanceTest/java/org/apache/geode/management/internal/cli/commands/ConnectCommandAcceptanceTest.java
@@ -26,11 +26,11 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.categories.GfshTest;
 import org.apache.geode.test.junit.rules.gfsh.GfshExecution;
 import org.apache.geode.test.junit.rules.gfsh.GfshRule;
 import org.apache.geode.test.junit.rules.gfsh.GfshScript;
+import org.apache.geode.test.version.VersionManager;
 
 @Category(GfshTest.class)
 public class ConnectCommandAcceptanceTest {
diff --git a/geode-assembly/src/test/java/org/apache/geode/test/junit/rules/GfshRuleTest.java b/geode-assembly/src/test/java/org/apache/geode/test/junit/rules/GfshRuleTest.java
index 6f28cae..ec887dc 100644
--- a/geode-assembly/src/test/java/org/apache/geode/test/junit/rules/GfshRuleTest.java
+++ b/geode-assembly/src/test/java/org/apache/geode/test/junit/rules/GfshRuleTest.java
@@ -23,9 +23,9 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.categories.GfshTest;
 import org.apache.geode.test.junit.rules.gfsh.GfshRule;
+import org.apache.geode.test.version.VersionManager;
 
 @Category({GfshTest.class})
 public class GfshRuleTest {
diff --git a/geode-assembly/src/upgradeTest/java/org/apache/geode/session/tests/TomcatSessionBackwardsCompatibilityTestBase.java b/geode-assembly/src/upgradeTest/java/org/apache/geode/session/tests/TomcatSessionBackwardsCompatibilityTestBase.java
index 5744e0b..f8a5356 100644
--- a/geode-assembly/src/upgradeTest/java/org/apache/geode/session/tests/TomcatSessionBackwardsCompatibilityTestBase.java
+++ b/geode-assembly/src/upgradeTest/java/org/apache/geode/session/tests/TomcatSessionBackwardsCompatibilityTestBase.java
@@ -34,10 +34,10 @@ import org.junit.runners.Parameterized;
 import org.apache.geode.internal.AvailablePortHelper;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.util.CommandStringBuilder;
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.categories.BackwardCompatibilityTest;
 import org.apache.geode.test.junit.rules.GfshCommandRule;
 import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
+import org.apache.geode.test.version.VersionManager;
 
 /**
  * This test iterates through the versions of Geode and executes session client compatibility with
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/distributed/DistributedLockBlackboardImpl.java b/geode-core/src/distributedTest/java/org/apache/geode/distributed/DistributedLockBlackboardImpl.java
index 04f19a0..599c28e 100755
--- a/geode-core/src/distributedTest/java/org/apache/geode/distributed/DistributedLockBlackboardImpl.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/distributed/DistributedLockBlackboardImpl.java
@@ -20,7 +20,7 @@ import java.rmi.RemoteException;
 import java.rmi.server.UnicastRemoteObject;
 
 import org.apache.geode.internal.Assert;
-import org.apache.geode.test.dunit.standalone.DUnitLauncher;
+import org.apache.geode.test.dunit.internal.DUnitLauncher;
 
 
 public class DistributedLockBlackboardImpl extends UnicastRemoteObject
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorDUnitTest.java
index 6095aad..c16349e 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/distributed/LocatorDUnitTest.java
@@ -94,8 +94,8 @@ import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.SerializableRunnable;
 import org.apache.geode.test.dunit.VM;
 import org.apache.geode.test.dunit.Wait;
+import org.apache.geode.test.dunit.internal.DUnitLauncher;
 import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase;
-import org.apache.geode.test.dunit.standalone.DUnitLauncher;
 import org.apache.geode.test.junit.categories.MembershipTest;
 import org.apache.geode.util.test.TestUtil;
 
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/distributed/SystemAdminDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/distributed/SystemAdminDUnitTest.java
index 56a62f1..a516a5c 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/distributed/SystemAdminDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/distributed/SystemAdminDUnitTest.java
@@ -17,7 +17,7 @@ package org.apache.geode.distributed;
 import static java.util.Arrays.asList;
 import static org.apache.geode.test.dunit.Disconnect.disconnectFromDS;
 import static org.apache.geode.test.dunit.DistributedTestUtils.getAllDistributedSystemProperties;
-import static org.apache.geode.test.dunit.standalone.DUnitLauncher.getDistributedSystemProperties;
+import static org.apache.geode.test.dunit.internal.DUnitLauncher.getDistributedSystemProperties;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.io.File;
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/alerting/AlertingServiceDistributedTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/alerting/AlertingServiceDistributedTest.java
index 7fe2058..487a43f 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/alerting/AlertingServiceDistributedTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/alerting/AlertingServiceDistributedTest.java
@@ -35,7 +35,7 @@ import static org.apache.geode.test.dunit.IgnoredException.addIgnoredException;
 import static org.apache.geode.test.dunit.VM.getController;
 import static org.apache.geode.test.dunit.VM.getVM;
 import static org.apache.geode.test.dunit.VM.toArray;
-import static org.apache.geode.test.dunit.standalone.DUnitLauncher.getDistributedSystemProperties;
+import static org.apache.geode.test.dunit.internal.DUnitLauncher.getDistributedSystemProperties;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.ArgumentMatchers.isNull;
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/alerting/AlertingServiceWithoutListenerDistributedTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/alerting/AlertingServiceWithoutListenerDistributedTest.java
index c2bf009..4b6d21a 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/alerting/AlertingServiceWithoutListenerDistributedTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/alerting/AlertingServiceWithoutListenerDistributedTest.java
@@ -31,7 +31,7 @@ import static org.apache.geode.test.dunit.IgnoredException.addIgnoredException;
 import static org.apache.geode.test.dunit.VM.getController;
 import static org.apache.geode.test.dunit.VM.getVM;
 import static org.apache.geode.test.dunit.VM.toArray;
-import static org.apache.geode.test.dunit.standalone.DUnitLauncher.getDistributedSystemProperties;
+import static org.apache.geode.test.dunit.internal.DUnitLauncher.getDistributedSystemProperties;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ClientServerTransactionFailoverWithMixedVersionServersDistributedTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ClientServerTransactionFailoverWithMixedVersionServersDistributedTest.java
index 3b72c2d..92b6a3a 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ClientServerTransactionFailoverWithMixedVersionServersDistributedTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/ClientServerTransactionFailoverWithMixedVersionServersDistributedTest.java
@@ -56,9 +56,9 @@ import org.apache.geode.test.dunit.VM;
 import org.apache.geode.test.dunit.rules.CacheRule;
 import org.apache.geode.test.dunit.rules.ClientCacheRule;
 import org.apache.geode.test.dunit.rules.DistributedRule;
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.rules.serializable.SerializableTemporaryFolder;
 import org.apache.geode.test.junit.rules.serializable.SerializableTestName;
+import org.apache.geode.test.version.VersionManager;
 
 @SuppressWarnings("serial")
 public class ClientServerTransactionFailoverWithMixedVersionServersDistributedTest
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/compression/CompressionRegionConfigDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/compression/CompressionRegionConfigDUnitTest.java
index 8fd193e..f307758 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/compression/CompressionRegionConfigDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/compression/CompressionRegionConfigDUnitTest.java
@@ -40,7 +40,7 @@ import org.apache.geode.test.dunit.SerializableRunnable;
 import org.apache.geode.test.dunit.VM;
 import org.apache.geode.test.dunit.WaitCriterion;
 import org.apache.geode.test.dunit.cache.internal.JUnit4CacheTestCase;
-import org.apache.geode.test.dunit.standalone.DUnitLauncher;
+import org.apache.geode.test.dunit.internal.DUnitLauncher;
 
 /**
  * Sanity checks on a number of basic cluster configurations with compression turned on.
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/management/DistributedSystemMXBeanDistributedTest.java b/geode-core/src/distributedTest/java/org/apache/geode/management/DistributedSystemMXBeanDistributedTest.java
index 21d99bf..0fa6ecc 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/management/DistributedSystemMXBeanDistributedTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/management/DistributedSystemMXBeanDistributedTest.java
@@ -23,7 +23,7 @@ import static org.apache.geode.management.internal.MBeanJMXAdapter.getMemberMBea
 import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
 import static org.apache.geode.test.dunit.VM.getVM;
 import static org.apache.geode.test.dunit.VM.toArray;
-import static org.apache.geode.test.dunit.standalone.DUnitLauncher.getDistributedSystemProperties;
+import static org.apache.geode.test.dunit.internal.DUnitLauncher.getDistributedSystemProperties;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.io.Serializable;
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/management/DistributedSystemMXBeanWithAlertsDistributedTest.java b/geode-core/src/distributedTest/java/org/apache/geode/management/DistributedSystemMXBeanWithAlertsDistributedTest.java
index 67478b6..fb16425 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/management/DistributedSystemMXBeanWithAlertsDistributedTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/management/DistributedSystemMXBeanWithAlertsDistributedTest.java
@@ -33,7 +33,7 @@ import static org.apache.geode.test.awaitility.GeodeAwaitility.getTimeout;
 import static org.apache.geode.test.dunit.IgnoredException.addIgnoredException;
 import static org.apache.geode.test.dunit.VM.getVM;
 import static org.apache.geode.test.dunit.VM.toArray;
-import static org.apache.geode.test.dunit.standalone.DUnitLauncher.getDistributedSystemProperties;
+import static org.apache.geode.test.dunit.internal.DUnitLauncher.getDistributedSystemProperties;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.isNull;
 import static org.mockito.Mockito.spy;
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/management/DistributedSystemMXBeanWithNotificationsDistributedTest.java b/geode-core/src/distributedTest/java/org/apache/geode/management/DistributedSystemMXBeanWithNotificationsDistributedTest.java
index b7a581a..9527fd2 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/management/DistributedSystemMXBeanWithNotificationsDistributedTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/management/DistributedSystemMXBeanWithNotificationsDistributedTest.java
@@ -28,7 +28,7 @@ import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
 import static org.apache.geode.test.awaitility.GeodeAwaitility.getTimeout;
 import static org.apache.geode.test.dunit.VM.getVM;
 import static org.apache.geode.test.dunit.VM.toArray;
-import static org.apache.geode.test.dunit.standalone.DUnitLauncher.getDistributedSystemProperties;
+import static org.apache.geode.test.dunit.internal.DUnitLauncher.getDistributedSystemProperties;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.isA;
 import static org.mockito.ArgumentMatchers.isNull;
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/management/ManagementTestRule.java b/geode-core/src/distributedTest/java/org/apache/geode/management/ManagementTestRule.java
index 80a861a..e40aac2 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/management/ManagementTestRule.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/management/ManagementTestRule.java
@@ -48,8 +48,8 @@ import org.apache.geode.management.internal.SystemManagementService;
 import org.apache.geode.test.dunit.Invoke;
 import org.apache.geode.test.dunit.VM;
 import org.apache.geode.test.dunit.cache.internal.JUnit4CacheTestCase;
+import org.apache.geode.test.dunit.internal.DUnitLauncher;
 import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase;
-import org.apache.geode.test.dunit.standalone.DUnitLauncher;
 
 /**
  * Note: Overriding MethodRule is only way to get {@code Object target}
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthDUnitTest.java
index c750fb0..c52322f 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthDUnitTest.java
@@ -35,10 +35,10 @@ import org.apache.geode.cache.client.ServerOperationException;
 import org.apache.geode.test.dunit.IgnoredException;
 import org.apache.geode.test.dunit.rules.ClientVM;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.categories.SecurityTest;
 import org.apache.geode.test.junit.rules.ServerStarterRule;
 import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
+import org.apache.geode.test.version.VersionManager;
 
 @Category({SecurityTest.class})
 @RunWith(Parameterized.class)
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthenticationDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthenticationDUnitTest.java
index 4ee981e..9ae0f79 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthenticationDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthenticationDUnitTest.java
@@ -23,9 +23,9 @@ import org.junit.experimental.categories.Category;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.categories.SecurityTest;
 import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
+import org.apache.geode.test.version.VersionManager;
 
 /**
  * Test for authentication from client to server. This tests for both valid and invalid
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthenticationPart2DUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthenticationPart2DUnitTest.java
index b808a9f..bdadf1b 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthenticationPart2DUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthenticationPart2DUnitTest.java
@@ -31,9 +31,9 @@ import org.junit.runners.Parameterized;
 import org.apache.geode.internal.cache.tier.MessageType;
 import org.apache.geode.internal.cache.tier.sockets.Message;
 import org.apache.geode.internal.cache.tier.sockets.ServerConnection;
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.categories.SecurityTest;
 import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
+import org.apache.geode.test.version.VersionManager;
 
 /**
  * this class contains test methods that used to be in its superclass but that test started taking
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthenticationTestCase.java b/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthenticationTestCase.java
index 0283d66..446daa9 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthenticationTestCase.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthenticationTestCase.java
@@ -70,7 +70,7 @@ import org.apache.geode.security.generator.DummyCredentialGenerator;
 import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.VM;
 import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.version.VersionManager;
 
 public abstract class ClientAuthenticationTestCase extends JUnit4DistributedTestCase {
 
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthorizationLegacyConfigurationDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthorizationLegacyConfigurationDUnitTest.java
index d8caf8b..9a2ce36 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthorizationLegacyConfigurationDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/security/ClientAuthorizationLegacyConfigurationDUnitTest.java
@@ -42,9 +42,9 @@ import org.apache.geode.security.templates.UserPasswordAuthInit;
 import org.apache.geode.test.dunit.rules.ClientVM;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.categories.SecurityTest;
 import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
+import org.apache.geode.test.version.VersionManager;
 
 @Category({SecurityTest.class})
 @RunWith(Parameterized.class)
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/security/ClientDataAuthorizationUsingLegacySecurityDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/security/ClientDataAuthorizationUsingLegacySecurityDUnitTest.java
index 04c9f5e..32da834 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/security/ClientDataAuthorizationUsingLegacySecurityDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/security/ClientDataAuthorizationUsingLegacySecurityDUnitTest.java
@@ -48,9 +48,9 @@ import org.apache.geode.security.templates.UsernamePrincipal;
 import org.apache.geode.test.dunit.rules.ClientVM;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.categories.SecurityTest;
 import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
+import org.apache.geode.test.version.VersionManager;
 
 /**
  * Tests for authorization from client to server for data puts and gets. For similar test in the
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/security/ClientDataAuthorizationUsingLegacySecurityWithFailoverDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/security/ClientDataAuthorizationUsingLegacySecurityWithFailoverDUnitTest.java
index 593575c..f829c21 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/security/ClientDataAuthorizationUsingLegacySecurityWithFailoverDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/security/ClientDataAuthorizationUsingLegacySecurityWithFailoverDUnitTest.java
@@ -55,9 +55,9 @@ import org.apache.geode.security.templates.UsernamePrincipal;
 import org.apache.geode.test.dunit.rules.ClientVM;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.categories.SecurityTest;
 import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
+import org.apache.geode.test.version.VersionManager;
 
 /**
  * This test class reproduces the tests present in
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/management/DistributedSystemMXBeanIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/management/DistributedSystemMXBeanIntegrationTest.java
index ed11dd1..d694c00 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/management/DistributedSystemMXBeanIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/management/DistributedSystemMXBeanIntegrationTest.java
@@ -32,7 +32,7 @@ import static org.apache.geode.management.internal.MBeanJMXAdapter.getDistribute
 import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
 import static org.apache.geode.test.awaitility.GeodeAwaitility.getTimeout;
 import static org.apache.geode.test.dunit.NetworkUtils.getServerHostName;
-import static org.apache.geode.test.dunit.standalone.DUnitLauncher.getDistributedSystemProperties;
+import static org.apache.geode.test.dunit.internal.DUnitLauncher.getDistributedSystemProperties;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.isNull;
 import static org.mockito.Mockito.spy;
diff --git a/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/TxCommitMessageBCTestBase.java b/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/TxCommitMessageBCTestBase.java
index 11a65a3..bf96829 100644
--- a/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/TxCommitMessageBCTestBase.java
+++ b/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/TxCommitMessageBCTestBase.java
@@ -48,9 +48,9 @@ import org.apache.geode.internal.Version;
 import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.VM;
 import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase;
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.categories.BackwardCompatibilityTest;
 import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
+import org.apache.geode.test.version.VersionManager;
 
 /**
  * This test class tests the communication pattern of a transaction for replicate and partition
diff --git a/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgrade2DUnitTestBase.java b/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgrade2DUnitTestBase.java
index 435f6d0..75fd7e9 100755
--- a/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgrade2DUnitTestBase.java
+++ b/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgrade2DUnitTestBase.java
@@ -95,12 +95,12 @@ import org.apache.geode.test.dunit.IgnoredException;
 import org.apache.geode.test.dunit.Invoke;
 import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.VM;
+import org.apache.geode.test.dunit.internal.DUnitLauncher;
 import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.DistributedRule;
-import org.apache.geode.test.dunit.standalone.DUnitLauncher;
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
+import org.apache.geode.test.version.VersionManager;
 
 /**
  * This test will not run properly in eclipse at this point due to having to bounce vms Currently,
diff --git a/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeDUnitTest.java b/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeDUnitTest.java
index 590bd8f..a5bfa5a 100644
--- a/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeDUnitTest.java
+++ b/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeDUnitTest.java
@@ -57,8 +57,8 @@ import org.apache.geode.test.dunit.LogWriterUtils;
 import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.VM;
 import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase;
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
+import org.apache.geode.test.version.VersionManager;
 
 /**
  * RollingUpgrade dunit tests are distributed among subclasses of RollingUpgradeDUnitTest to avoid
diff --git a/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeHARegionNameOnDifferentServerVersions.java b/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeHARegionNameOnDifferentServerVersions.java
index 9b465d9..1bd2788 100644
--- a/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeHARegionNameOnDifferentServerVersions.java
+++ b/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeHARegionNameOnDifferentServerVersions.java
@@ -26,7 +26,7 @@ import org.apache.geode.test.dunit.DistributedTestUtils;
 import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.VM;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.version.VersionManager;
 
 public class RollingUpgradeHARegionNameOnDifferentServerVersions
     extends RollingUpgrade2DUnitTestBase {
diff --git a/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeNonHAFunction.java b/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeNonHAFunction.java
index 2fc56a4..2ce9794 100644
--- a/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeNonHAFunction.java
+++ b/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeNonHAFunction.java
@@ -40,7 +40,7 @@ import org.apache.geode.internal.Version;
 import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.VM;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.version.VersionManager;
 
 public class RollingUpgradeNonHAFunction extends RollingUpgrade2DUnitTestBase {
 
diff --git a/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeTracePRQuery.java b/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeTracePRQuery.java
index 87c3d72..4b1042b 100644
--- a/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeTracePRQuery.java
+++ b/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeTracePRQuery.java
@@ -29,7 +29,7 @@ import org.apache.geode.internal.Version;
 import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.VM;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.version.VersionManager;
 
 public class RollingUpgradeTracePRQuery extends RollingUpgrade2DUnitTestBase {
 
diff --git a/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeVerifyXmlEntity.java b/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeVerifyXmlEntity.java
index 77aba67..2aad309 100644
--- a/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeVerifyXmlEntity.java
+++ b/geode-core/src/upgradeTest/java/org/apache/geode/internal/cache/rollingupgrade/RollingUpgradeVerifyXmlEntity.java
@@ -28,7 +28,7 @@ import org.apache.geode.test.dunit.DistributedTestUtils;
 import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.VM;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.version.VersionManager;
 
 public class RollingUpgradeVerifyXmlEntity extends RollingUpgrade2DUnitTestBase {
 
diff --git a/geode-cq/src/upgradeTest/java/org/apache/geode/internal/cache/tier/sockets/ClientServerMiscBCDUnitTest.java b/geode-cq/src/upgradeTest/java/org/apache/geode/internal/cache/tier/sockets/ClientServerMiscBCDUnitTest.java
index 05383ab..ec2bce7 100755
--- a/geode-cq/src/upgradeTest/java/org/apache/geode/internal/cache/tier/sockets/ClientServerMiscBCDUnitTest.java
+++ b/geode-cq/src/upgradeTest/java/org/apache/geode/internal/cache/tier/sockets/ClientServerMiscBCDUnitTest.java
@@ -50,10 +50,10 @@ import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.IgnoredException;
 import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.VM;
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.categories.BackwardCompatibilityTest;
 import org.apache.geode.test.junit.categories.ClientServerTest;
 import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
+import org.apache.geode.test.version.VersionManager;
 
 @Category({ClientServerTest.class, BackwardCompatibilityTest.class})
 @RunWith(Parameterized.class)
diff --git a/geode-cq/src/upgradeTest/java/org/apache/geode/security/ClientAuthorizationCQDUnitTest.java b/geode-cq/src/upgradeTest/java/org/apache/geode/security/ClientAuthorizationCQDUnitTest.java
index a73738b..543152e 100644
--- a/geode-cq/src/upgradeTest/java/org/apache/geode/security/ClientAuthorizationCQDUnitTest.java
+++ b/geode-cq/src/upgradeTest/java/org/apache/geode/security/ClientAuthorizationCQDUnitTest.java
@@ -26,9 +26,9 @@ import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
 import org.apache.geode.cache.operations.OperationContext.OperationCode;
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.categories.SecurityTest;
 import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
+import org.apache.geode.test.version.VersionManager;
 
 /**
  * Tests for authorization from client to server. This tests for authorization of all operations
diff --git a/geode-dunit/src/distributedTest/java/org/apache/geode/test/dunit/rules/tests/ClusterStartupRuleCanSpecifyOlderVersionsDUnitTest.java b/geode-dunit/src/distributedTest/java/org/apache/geode/test/dunit/rules/tests/ClusterStartupRuleCanSpecifyOlderVersionsDUnitTest.java
index e5cc88e..4e04513 100644
--- a/geode-dunit/src/distributedTest/java/org/apache/geode/test/dunit/rules/tests/ClusterStartupRuleCanSpecifyOlderVersionsDUnitTest.java
+++ b/geode-dunit/src/distributedTest/java/org/apache/geode/test/dunit/rules/tests/ClusterStartupRuleCanSpecifyOlderVersionsDUnitTest.java
@@ -28,8 +28,8 @@ import org.apache.geode.internal.GemFireVersion;
 import org.apache.geode.test.dunit.rules.ClientVM;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
+import org.apache.geode.test.version.VersionManager;
 
 
 @RunWith(Parameterized.class)
diff --git a/geode-dunit/src/integrationTest/java/org/apache/geode/test/dunit/examples/BeforeClassExampleTest.java b/geode-dunit/src/integrationTest/java/org/apache/geode/test/dunit/examples/BeforeClassExampleTest.java
index c11ff4b..e9e3c4a 100644
--- a/geode-dunit/src/integrationTest/java/org/apache/geode/test/dunit/examples/BeforeClassExampleTest.java
+++ b/geode-dunit/src/integrationTest/java/org/apache/geode/test/dunit/examples/BeforeClassExampleTest.java
@@ -20,7 +20,7 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 
 import org.apache.geode.test.dunit.Host;
-import org.apache.geode.test.dunit.standalone.DUnitLauncher;
+import org.apache.geode.test.dunit.internal.DUnitLauncher;
 
 
 public class BeforeClassExampleTest {
diff --git a/geode-dunit/src/main/java/hydra/MethExecutor.java b/geode-dunit/src/main/java/hydra/MethExecutor.java
deleted file mode 100644
index e70bbb6..0000000
--- a/geode-dunit/src/main/java/hydra/MethExecutor.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package hydra;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-
-import org.apache.geode.SystemFailure;
-
-/**
- *
- * A class specialized for executing (via reflection) the receiver/selector pairs found in
- * TestTasks.
- *
- */
-public class MethExecutor {
-
-  // @todo lises add static args method
-
-  /**
-   * Helper method that searches a class (and its superclasses) for a method with the given name and
-   * parameter types.
-   *
-   * @throws NoSuchMethodException If the method cannot be found
-   */
-  public static Method getMethod(Class c, String methodName, Class[] paramTypes)
-      throws NoSuchMethodException {
-
-    ArrayList matchingMethods = new ArrayList();
-    for (Class q = c; q != null; q = q.getSuperclass()) {
-      Method[] methods = q.getDeclaredMethods();
-      NEXT_METHOD: for (int i = 0; i < methods.length; i++) {
-        Method m = methods[i];
-        if (!m.getName().equals(methodName)) {
-          continue;
-        }
-
-        Class[] argTypes = m.getParameterTypes();
-        if (argTypes.length != paramTypes.length) {
-          continue;
-        }
-
-        for (int j = 0; j < argTypes.length; j++) {
-          if (paramTypes[j] == null) {
-            if (argTypes[j].isPrimitive()) {
-              // this parameter is not ok, the parameter is a primative and the value is null
-              continue NEXT_METHOD;
-            } else {
-              // this parameter is ok, the argument is an object and the value is null
-              continue;
-            }
-          }
-          if (!argTypes[j].isAssignableFrom(paramTypes[j])) {
-            Class argType = argTypes[j];
-            Class paramType = paramTypes[j];
-
-            if (argType.isPrimitive()) {
-              if ((argType.equals(boolean.class) && paramType.equals(Boolean.class))
-                  || (argType.equals(short.class) && paramType.equals(Short.class))
-                  || (argType.equals(int.class) && paramType.equals(Integer.class))
-                  || (argType.equals(long.class) && paramType.equals(Long.class))
-                  || (argType.equals(float.class) && paramType.equals(Float.class))
-                  || (argType.equals(double.class) && paramType.equals(Double.class))
-                  || (argType.equals(char.class) && paramType.equals(Character.class))
-                  || (argType.equals(byte.class) && paramType.equals(Byte.class)) || false) {
-
-                // This parameter is okay, try the next arg
-                continue;
-              }
-            }
-            continue NEXT_METHOD;
-          }
-        }
-
-        matchingMethods.add(m);
-      }
-
-      // We want to check to make sure there aren't two
-      // ambiguous methods on the same class. But a subclass
-      // can still override a method on a super class, so we'll stop
-      // if we found a method on the subclass.
-      if (matchingMethods.size() > 0) {
-        break;
-      }
-    }
-
-    if (matchingMethods.isEmpty()) {
-      StringBuffer sb = new StringBuffer();
-      sb.append("Could not find method ");
-      sb.append(methodName);
-      sb.append(" with ");
-      sb.append(paramTypes.length);
-      sb.append(" parameters [");
-      for (int i = 0; i < paramTypes.length; i++) {
-        String name = paramTypes[i] == null ? null : paramTypes[i].getName();
-        sb.append(name);
-        if (i < paramTypes.length - 1) {
-          sb.append(", ");
-        }
-      }
-      sb.append("] in class ");
-      sb.append(c.getName());
-      throw new NoSuchMethodException(sb.toString());
-    }
-    if (matchingMethods.size() > 1) {
-      StringBuffer sb = new StringBuffer();
-      sb.append("Method is ambiguous ");
-      sb.append(methodName);
-      sb.append(" with ");
-      sb.append(paramTypes.length);
-      sb.append(" parameters [");
-      for (int i = 0; i < paramTypes.length; i++) {
-        String name = paramTypes[i] == null ? null : paramTypes[i].getName();
-        sb.append(name);
-        if (i < paramTypes.length - 1) {
-          sb.append(", ");
-        }
-      }
-      sb.append("] in class ");
-      sb.append(c.getName());
-      sb.append(" methods=" + matchingMethods);
-      throw new NoSuchMethodException(sb.toString());
-    } else
-      return (Method) matchingMethods.get(0);
-  }
-
-  /**
-   *
-   * Send the message "selector" to the class named "receiver". Return the result, including stack
-   * trace (if any).
-   *
-   */
-  public static MethExecutorResult execute(String receiver, String selector) {
-    return execute(receiver, selector, null);
-  }
-
-  /**
-   * Executes the given static method on the given class with the given arguments.
-   */
-  public static MethExecutorResult execute(String receiver, String selector, Object[] args) {
-    try {
-      // get the class
-      Class receiverClass = Class.forName(receiver);
-
-      // invoke the method
-      Object res = null;
-      try {
-        Class[] paramTypes;
-        if (args == null) {
-          paramTypes = new Class[0];
-
-        } else {
-          paramTypes = new Class[args.length];
-          for (int i = 0; i < args.length; i++) {
-            if (args[i] == null) {
-              paramTypes[i] = null;
-
-            } else {
-              paramTypes[i] = args[i].getClass();
-            }
-          }
-        }
-
-        Method theMethod = getMethod(receiverClass, selector, paramTypes);
-        theMethod.setAccessible(true);
-        res = theMethod.invoke(receiverClass, args);
-        return new MethExecutorResult(res);
-
-      } catch (InvocationTargetException invTargEx) {
-        Throwable targEx = invTargEx.getTargetException();
-        if (targEx == null) {
-          return new MethExecutorResult(res);
-
-        } else {
-          return new MethExecutorResult(targEx);
-        }
-      }
-
-    } catch (VirtualMachineError e) {
-      SystemFailure.initiateFailure(e);
-      throw e;
-    } catch (Throwable t) {
-      // String s = "While trying to invoke " + receiver + "." +
-      // selector;
-      // t = new HydraConfigException(s, t);
-      return new MethExecutorResult(t);
-    }
-  }
-
-  /**
-   *
-   * Send the message "selector" to the object "target". Return the result, including stack trace
-   * (if any).
-   *
-   */
-  public static MethExecutorResult executeObject(Object target, String selector) {
-    return executeObject(target, selector, null);
-  }
-
-  /**
-   * Executes the given instance method on the given object with the given arguments.
-   */
-  public static MethExecutorResult executeObject(Object target, String selector, Object[] args) {
-    try {
-      // get the class
-      Class receiverClass = target.getClass();
-
-      // invoke the method
-      Object res = null;
-      try {
-        Class[] paramTypes;
-        if (args == null) {
-          paramTypes = new Class[0];
-
-        } else {
-          paramTypes = new Class[args.length];
-          for (int i = 0; i < args.length; i++) {
-            if (args[i] == null) {
-              paramTypes[i] = Object.class;
-
-            } else {
-              paramTypes[i] = args[i].getClass();
-            }
-          }
-        }
-
-        Method theMethod = getMethod(receiverClass, selector, paramTypes);
-        theMethod.setAccessible(true);
-        res = theMethod.invoke(target, args);
-        return new MethExecutorResult(res);
-
-      } catch (InvocationTargetException invTargEx) {
-        Throwable targEx = invTargEx.getTargetException();
-        if (targEx == null) {
-          return new MethExecutorResult(res);
-
-        } else {
-          return new MethExecutorResult(targEx);
-        }
-      }
-
-    } catch (VirtualMachineError e) {
-      SystemFailure.initiateFailure(e);
-      throw e;
-    } catch (Throwable t) {
-      return new MethExecutorResult(t);
-    }
-  }
-
-  /**
-   *
-   * Send the message "selector" to an instance of the class named "receiver". Return the result,
-   * including stack trace (if any).
-   *
-   */
-  public static MethExecutorResult executeInstance(String receiver, String selector) {
-
-    try {
-      // get the class
-      Class receiverClass = Class.forName(receiver);
-      Object target = receiverClass.newInstance();
-
-      // invoke the method
-      Object res = null;
-      try {
-        Method theMethod = getMethod(receiverClass, selector, new Class[0]);
-        res = theMethod.invoke(target, new Object[0]);
-        return new MethExecutorResult(res);
-
-      } catch (InvocationTargetException invTargEx) {
-        Throwable targEx = invTargEx.getTargetException();
-        if (targEx == null) {
-          return new MethExecutorResult(res);
-        } else {
-          return new MethExecutorResult(targEx);
-        }
-      }
-
-    } catch (VirtualMachineError e) {
-      SystemFailure.initiateFailure(e);
-      throw e;
-    } catch (Throwable t) {
-      return new MethExecutorResult(t);
-    }
-  }
-
-  /**
-   *
-   * Send the message "selector" to an instance of the class named "receiver". Return the result,
-   * including stack trace (if any).
-   *
-   */
-  public static MethExecutorResult executeInstance(String receiver, String selector, Class[] types,
-      Object[] args) {
-
-    try {
-      // get the class
-      Class receiverClass = Class.forName(receiver);
-      Constructor init = receiverClass.getDeclaredConstructor(new Class[0]);
-      init.setAccessible(true);
-      Object target = init.newInstance(new Object[0]);
-
-      // invoke the method
-      Object res = null;
-      try {
-        Method theMethod = getMethod(receiverClass, selector, types);
-        res = theMethod.invoke(target, args);
-        return new MethExecutorResult(res);
-
-      } catch (InvocationTargetException invTargEx) {
-        Throwable targEx = invTargEx.getTargetException();
-        if (targEx == null) {
-          return new MethExecutorResult(res);
-
-        } else {
-          return new MethExecutorResult(targEx);
-        }
-      }
-
-    } catch (VirtualMachineError e) {
-      SystemFailure.initiateFailure(e);
-      throw e;
-    } catch (Throwable t) {
-      return new MethExecutorResult(t);
-    }
-  }
-
-  /**
-   *
-   * A small program for testing this class.
-   *
-   */
-  public static String testMethod1() {
-    return "The result is: " + System.currentTimeMillis();
-  }
-
-  public static String testMethod2() {
-    throw new ArrayIndexOutOfBoundsException("frip");
-  }
-
-  public static void main(String[] args) {
-    MethExecutorResult result = null;
-    result = MethExecutor.execute("hydra.MethExecutor", "testMethod1");
-    System.out.println(result.toString());
-    result = MethExecutor.execute("hydra.MethExecutor", "testMethod2");
-    System.out.println(result.toString());
-  }
-}
diff --git a/geode-dunit/src/main/java/hydra/MethExecutorResult.java b/geode-dunit/src/main/java/hydra/MethExecutorResult.java
deleted file mode 100644
index 1adc765..0000000
--- a/geode-dunit/src/main/java/hydra/MethExecutorResult.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package hydra;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectOutputStream;
-import java.io.PrintWriter;
-import java.io.Serializable;
-import java.io.StringWriter;
-
-/**
- *
- * The result of a MethExecutor execute method.
- *
- */
-public class MethExecutorResult implements Serializable {
-
-  /**
-   * A "result" object that indicates that an exception occurred while invoking the method
-   */
-  public static final Serializable EXCEPTION_OCCURRED = new Serializable() {
-    public boolean equals(Object o) {
-      // Allows instances to be compared across VMs
-      return o != null && this.getClass().equals(o.getClass());
-    }
-
-    public int hashCode() {
-      return this.getClass().hashCode();
-    }
-
-    public String toString() {
-      return "EXCEPTION_OCCURRED";
-    }
-  };
-
-  /**
-   * A "exception" object that indicates that an exception could not be serialized.
-   */
-  public static final Throwable NONSERIALIZABLE_EXCEPTION = new Throwable() {
-    public boolean equals(Object o) {
-      // Allows instances to be compared across VMs
-      return o != null && this.getClass().equals(o.getClass());
-    }
-
-    public int hashCode() {
-      return this.getClass().hashCode();
-    }
-
-    public String toString() {
-      return "NONSERIALIZABLE_EXCEPTION";
-    }
-  };
-
-
-  //////////////////// Instance Methods ///////////////////////////
-
-  /** The result of execution (may be an exception or error type) */
-  private Object result;
-
-  /** The exception that resulted from invoking the method */
-  private Throwable exception;
-
-  /** Type of the exception (if applicable) */
-  private String exceptionClassName;
-
-  /** Message of the exception (if applicable) */
-  private String exceptionMessage;
-
-  /** Stack trace information (if applicable) */
-  private String stackTrace;
-
-  public MethExecutorResult() {
-    this.result = null;
-  }
-
-  public MethExecutorResult(Object result) {
-    this.result = result;
-  }
-
-  /**
-   * This constructor is invoked when invoking a method resulted in an exception being thrown. The
-   * "result" is set to {@link #EXCEPTION_OCCURRED}. If the exception could not be serialized,
-   * {@link #getException()} will return IOException with the exception stack as the message.
-   */
-  public MethExecutorResult(Throwable thr) {
-    this.result = EXCEPTION_OCCURRED;
-    this.exceptionClassName = thr.getClass().getName();
-    this.exceptionMessage = thr.getMessage();
-
-    StringWriter sw = new StringWriter();
-
-    thr.printStackTrace(new PrintWriter(sw, true));
-    this.stackTrace = sw.toString();
-
-    try {
-      ByteArrayOutputStream baos = new ByteArrayOutputStream();
-      ObjectOutputStream oos = new ObjectOutputStream(baos);
-      oos.writeObject(thr);
-      this.exception = thr;
-
-    } catch (IOException ex) {
-      sw = new StringWriter();
-      ex.printStackTrace(new PrintWriter(sw, true));
-      this.exception = new IOException(sw.toString());
-    }
-  }
-
-  public String toString() {
-    StringBuffer s = new StringBuffer();
-    s.append(this.getResult());
-    s.append("\n");
-    if (this.getStackTrace() != null) {
-      s.append(this.getStackTrace());
-    }
-    return s.toString();
-  }
-
-  /**
-   * Returns the result of the method call. If an exception was thrown during the method call,
-   * {@link #EXCEPTION_OCCURRED} is returned.
-   *
-   * @see #exceptionOccurred()
-   */
-  public Object getResult() {
-    return this.result;
-  }
-
-  /**
-   * Returns the name of the exception class of the exception that was thrown while invoking a
-   * method. If no exception was thrown, <code>null</code> is returned.
-   */
-  public String getExceptionClassName() {
-    return this.exceptionClassName;
-  }
-
-  /**
-   * Returns the message of the exception that was thrown while invoking a method. If no exception
-   * was thrown, <code>null</code> is returned.
-   */
-  public String getExceptionMessage() {
-    return this.exceptionMessage;
-  }
-
-  /**
-   * Returns the stack trace of the exception that was thrown while invoking a method. If no
-   * exception was thrown, <code>null</code> is returned.
-   */
-  public String getStackTrace() {
-    return this.stackTrace;
-  }
-
-  /**
-   * Returns the exception that was thrown while invoking a method. If the exception could not be
-   * serialized, then {@link #NONSERIALIZABLE_EXCEPTION} is returned. If no exception was thrown,
-   * <code>null</code> is returned.
-   */
-  public Throwable getException() {
-    return this.exception;
-  }
-
-  /**
-   * Returns whether or not an exception occurred while invoking the method
-   */
-  public boolean exceptionOccurred() {
-    return EXCEPTION_OCCURRED.equals(this.result);
-  }
-
-}
diff --git a/geode-dunit/src/main/java/org/apache/geode/internal/cache/tier/sockets/ClientServerMiscDUnitTestBase.java b/geode-dunit/src/main/java/org/apache/geode/internal/cache/tier/sockets/ClientServerMiscDUnitTestBase.java
index fae7104..4911add 100755
--- a/geode-dunit/src/main/java/org/apache/geode/internal/cache/tier/sockets/ClientServerMiscDUnitTestBase.java
+++ b/geode-dunit/src/main/java/org/apache/geode/internal/cache/tier/sockets/ClientServerMiscDUnitTestBase.java
@@ -86,9 +86,9 @@ import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.VM;
 import org.apache.geode.test.dunit.Wait;
 import org.apache.geode.test.dunit.cache.internal.JUnit4CacheTestCase;
-import org.apache.geode.test.dunit.standalone.DUnitLauncher;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.dunit.internal.DUnitLauncher;
 import org.apache.geode.test.junit.categories.ClientServerTest;
+import org.apache.geode.test.version.VersionManager;
 
 /**
  * Tests client server corner cases between Region and Pool
diff --git a/geode-dunit/src/main/java/org/apache/geode/security/ClientAuthorizationTestCase.java b/geode-dunit/src/main/java/org/apache/geode/security/ClientAuthorizationTestCase.java
index aae3a4a..161449c 100644
--- a/geode-dunit/src/main/java/org/apache/geode/security/ClientAuthorizationTestCase.java
+++ b/geode-dunit/src/main/java/org/apache/geode/security/ClientAuthorizationTestCase.java
@@ -90,7 +90,7 @@ import org.apache.geode.test.dunit.WaitCriterion;
 import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.DistributedRule;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.version.VersionManager;
 
 /**
  * Base class for tests for authorization from client to server. It contains utility functions for
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/DUnitEnv.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/DUnitEnv.java
index 85fd14a..86880e7 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/DUnitEnv.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/DUnitEnv.java
@@ -18,7 +18,7 @@ import java.io.File;
 import java.rmi.RemoteException;
 import java.util.Properties;
 
-import org.apache.geode.test.dunit.standalone.BounceResult;
+import org.apache.geode.test.dunit.internal.BounceResult;
 
 /**
  * This class provides an abstraction over the environment that is used to run dunit. This will
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/Host.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/Host.java
index 18f17c3..be99201 100755
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/Host.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/Host.java
@@ -18,8 +18,8 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.geode.test.dunit.standalone.RemoteDUnitVMIF;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.dunit.internal.RemoteDUnitVMIF;
+import org.apache.geode.test.version.VersionManager;
 
 /**
  * This class represents a host on which a remote method may be invoked. It provides access to the
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/VM.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/VM.java
index 32643ec..572d058 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/VM.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/VM.java
@@ -14,7 +14,7 @@
  */
 package org.apache.geode.test.dunit;
 
-import static org.apache.geode.test.dunit.standalone.DUnitLauncher.NUM_VMS;
+import static org.apache.geode.test.dunit.internal.DUnitLauncher.NUM_VMS;
 
 import java.io.File;
 import java.io.PrintWriter;
@@ -24,13 +24,12 @@ import java.rmi.RemoteException;
 import java.util.List;
 import java.util.concurrent.Callable;
 
-import hydra.MethExecutorResult;
-
 import org.apache.geode.internal.process.ProcessUtils;
-import org.apache.geode.test.dunit.standalone.BounceResult;
-import org.apache.geode.test.dunit.standalone.RemoteDUnitVMIF;
-import org.apache.geode.test.dunit.standalone.StandAloneDUnitEnv;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.dunit.internal.BounceResult;
+import org.apache.geode.test.dunit.internal.MethodInvokerResult;
+import org.apache.geode.test.dunit.internal.RemoteDUnitVMIF;
+import org.apache.geode.test.dunit.internal.StandAloneDUnitEnv;
+import org.apache.geode.test.version.VersionManager;
 
 /**
  * This class represents a Java Virtual Machine that runs in a DistributedTest.
@@ -240,7 +239,7 @@ public class VM implements Serializable {
           new IllegalStateException("VM not available: " + this));
     }
 
-    MethExecutorResult result = execute(targetClass, methodName, args);
+    MethodInvokerResult result = execute(targetClass, methodName, args);
 
     if (!result.exceptionOccurred()) {
       return (V) result.getResult();
@@ -423,7 +422,7 @@ public class VM implements Serializable {
           new IllegalStateException("VM not available: " + this));
     }
 
-    MethExecutorResult result = execute(targetObject, methodName, args);
+    MethodInvokerResult result = execute(targetObject, methodName, args);
 
     if (!result.exceptionOccurred()) {
       return (V) result.getResult();
@@ -517,7 +516,7 @@ public class VM implements Serializable {
         + (VersionManager.isCurrentVersion(version) ? "" : (" with version " + version));
   }
 
-  private MethExecutorResult execute(final Class<?> targetClass, final String methodName,
+  private MethodInvokerResult execute(final Class<?> targetClass, final String methodName,
       final Object[] args) {
     try {
       return client.executeMethodOnClass(targetClass.getName(), methodName, args);
@@ -526,7 +525,7 @@ public class VM implements Serializable {
     }
   }
 
-  private MethExecutorResult execute(final Object targetObject, final String methodName,
+  private MethodInvokerResult execute(final Object targetObject, final String methodName,
       final Object[] args) {
     try {
       if (args == null) {
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/BounceResult.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/BounceResult.java
similarity index 95%
copy from geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/BounceResult.java
copy to geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/BounceResult.java
index 754af47..95ae4a6 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/BounceResult.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/BounceResult.java
@@ -12,7 +12,7 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package org.apache.geode.test.dunit.standalone;
+package org.apache.geode.test.dunit.internal;
 
 public class BounceResult {
   private final int newId;
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/ChildVM.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/ChildVM.java
similarity index 93%
rename from geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/ChildVM.java
rename to geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/ChildVM.java
index fe3277b..c5cb336 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/ChildVM.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/ChildVM.java
@@ -12,7 +12,7 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package org.apache.geode.test.dunit.standalone;
+package org.apache.geode.test.dunit.internal;
 
 import java.rmi.Naming;
 
@@ -22,8 +22,7 @@ import org.apache.geode.internal.ExitCode;
 import org.apache.geode.internal.OSProcess;
 import org.apache.geode.internal.Version;
 import org.apache.geode.internal.logging.LogService;
-import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase;
-import org.apache.geode.test.dunit.standalone.DUnitLauncher.MasterRemote;
+import org.apache.geode.test.version.VersionManager;
 
 public class ChildVM {
 
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitHost.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitHost.java
new file mode 100644
index 0000000..947a055
--- /dev/null
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitHost.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.geode.test.dunit.internal;
+
+import java.io.IOException;
+import java.rmi.AccessException;
+import java.rmi.NotBoundException;
+import java.rmi.RemoteException;
+import java.rmi.registry.Registry;
+
+import org.apache.geode.test.dunit.Host;
+import org.apache.geode.test.dunit.VM;
+import org.apache.geode.test.version.VersionManager;
+
+class DUnitHost extends Host {
+  private static final long serialVersionUID = -8034165624503666383L;
+
+  /**
+   * VM ID for the VM to use for the debugger.
+   */
+  private static final int DEBUGGING_VM_NUM = -1;
+
+  private final transient VM debuggingVM;
+
+  private transient ProcessManager processManager;
+
+  public DUnitHost(String hostName, ProcessManager processManager) throws RemoteException {
+    super(hostName);
+    this.debuggingVM = new VM(this, -1, new RemoteDUnitVM());
+    this.processManager = processManager;
+  }
+
+  public void init(Registry registry, int numVMs)
+      throws AccessException, RemoteException, NotBoundException, InterruptedException {
+    for (int i = 0; i < numVMs; i++) {
+      RemoteDUnitVMIF remote = processManager.getStub(i);
+      addVM(i, remote);
+    }
+
+    addLocator(DUnitLauncher.LOCATOR_VM_NUM, processManager.getStub(DUnitLauncher.LOCATOR_VM_NUM));
+
+    addHost(this);
+  }
+
+  /**
+   * Retrieves one of this host's VMs based on the specified VM ID. This will not bounce VM to a
+   * different version. It will only get the current running VM or launch a new one if not already
+   * launched.
+   *
+   * @param n ID of the requested VM; a value of <code>-1</code> will return the controller VM,
+   *        which may be useful for debugging.
+   * @return VM for the requested VM ID.
+   */
+  @Override
+  public VM getVM(int n) {
+    if (n < getVMCount() && n != DEBUGGING_VM_NUM) {
+      VM current = super.getVM(n);
+      return getVM(current.getVersion(), n);
+    } else {
+      return getVM(VersionManager.CURRENT_VERSION, n);
+    }
+  }
+
+  @Override
+  public VM getVM(String version, int n) {
+    if (n == DEBUGGING_VM_NUM) {
+      // for ease of debugging, pass -1 to get the local VM
+      return debuggingVM;
+    }
+
+    if (n < getVMCount()) {
+      VM current = super.getVM(n);
+      if (!current.getVersion().equals(version)) {
+        System.out.println(
+            "Bouncing VM" + n + " from version " + current.getVersion() + " to " + version);
+        current.bounce(version);
+      }
+      return current;
+    }
+
+    int oldVMCount = getVMCount();
+    if (n >= oldVMCount) {
+      // If we don't have a VM with that number, dynamically create it.
+      try {
+        // first fill in any gaps, to keep the superclass, Host, happy
+        for (int i = oldVMCount; i < n; i++) {
+          processManager.launchVM(i);
+        }
+        processManager.waitForVMs(DUnitLauncher.STARTUP_TIMEOUT);
+
+        for (int i = oldVMCount; i < n; i++) {
+          addVM(i, processManager.getStub(i));
+        }
+
+        // now create the one we really want
+        processManager.launchVM(version, n, false);
+        processManager.waitForVMs(DUnitLauncher.STARTUP_TIMEOUT);
+        addVM(n, processManager.getStub(n));
+
+      } catch (IOException | InterruptedException | NotBoundException e) {
+        throw new RuntimeException("Could not dynamically launch vm + " + n, e);
+      }
+    }
+
+    return super.getVM(n);
+  }
+}
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/DUnitLauncher.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitLauncher.java
similarity index 73%
rename from geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/DUnitLauncher.java
rename to geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitLauncher.java
index 45bb9a3..0303bc4 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/DUnitLauncher.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/DUnitLauncher.java
@@ -12,7 +12,7 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package org.apache.geode.test.dunit.standalone;
+package org.apache.geode.test.dunit.internal;
 
 import static org.apache.geode.distributed.ConfigurationProperties.DISABLE_AUTO_RECONNECT;
 import static org.apache.geode.distributed.ConfigurationProperties.ENABLE_CLUSTER_CONFIGURATION;
@@ -35,20 +35,13 @@ import java.net.InetAddress;
 import java.net.URISyntaxException;
 import java.nio.channels.FileChannel;
 import java.nio.charset.Charset;
-import java.rmi.AccessException;
 import java.rmi.AlreadyBoundException;
 import java.rmi.NotBoundException;
-import java.rmi.Remote;
-import java.rmi.RemoteException;
 import java.rmi.registry.LocateRegistry;
 import java.rmi.registry.Registry;
-import java.rmi.server.UnicastRemoteObject;
 import java.util.List;
 import java.util.Properties;
 
-import batterytest.greplogs.ExpectedStrings;
-import batterytest.greplogs.LogConsumer;
-import hydra.MethExecutorResult;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.core.LoggerContext;
@@ -66,8 +59,8 @@ import org.apache.geode.internal.logging.Configuration;
 import org.apache.geode.test.dunit.DUnitEnv;
 import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.SerializableCallable;
-import org.apache.geode.test.dunit.VM;
-import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase;
+import org.apache.geode.test.greplogs.ExpectedStrings;
+import org.apache.geode.test.greplogs.LogConsumer;
 
 /**
  * A class to build a fake test configuration and launch some DUnit VMS.
@@ -101,18 +94,13 @@ public class DUnitLauncher {
   public static int NUM_VMS = 4;
 
   /**
-   * VM ID for the VM to use for the debugger.
-   */
-  private static final int DEBUGGING_VM_NUM = -1;
-
-  /**
    * VM ID for the VM to use for the locator.
    */
-  private static final int LOCATOR_VM_NUM = -2;
+  static final int LOCATOR_VM_NUM = -2;
 
   static final long STARTUP_TIMEOUT = 120 * 1000;
-  private static final String STARTUP_TIMEOUT_MESSAGE =
-      "VMs did not start up within " + (STARTUP_TIMEOUT / 1000) + " seconds";
+  static final String STARTUP_TIMEOUT_MESSAGE =
+      "VMs did not start up within " + STARTUP_TIMEOUT / 1000 + " seconds";
 
   private static final String SUSPECT_FILENAME = "dunit_suspect.log";
   private static File DUNIT_SUSPECT_FILE;
@@ -310,7 +298,7 @@ public class DUnitLauncher {
     RemoteDUnitVMIF remote = (RemoteDUnitVMIF) registry.lookup("vm" + LOCATOR_VM_NUM);
     final File locatorLogFile =
         LOCATOR_LOG_TO_DISK ? new File("locator-" + locatorPort + ".log") : new File("");
-    MethExecutorResult result = remote.executeMethodOnObject(new SerializableCallable() {
+    MethodInvokerResult result = remote.executeMethodOnObject(new SerializableCallable() {
       public Object call() throws IOException {
         Properties p = getDistributedSystemProperties();
         // I never want this locator to end up starting a jmx manager
@@ -418,152 +406,4 @@ public class DUnitLauncher {
   }
 
 
-  public interface MasterRemote extends Remote {
-    public int getLocatorPort() throws RemoteException;
-
-    public void signalVMReady() throws RemoteException;
-
-    public void ping() throws RemoteException;
-
-    public BounceResult bounce(int pid) throws RemoteException;
-
-    public BounceResult bounce(String version, int pid, boolean force) throws RemoteException;
-  }
-
-  public static class Master extends UnicastRemoteObject implements MasterRemote {
-    private static final long serialVersionUID = 1178600200232603119L;
-
-    private final Registry registry;
-    private final ProcessManager processManager;
-
-
-    public Master(Registry registry, ProcessManager processManager) throws RemoteException {
-      this.processManager = processManager;
-      this.registry = registry;
-    }
-
-    public int getLocatorPort() throws RemoteException {
-      return locatorPort;
-    }
-
-    public synchronized void signalVMReady() {
-      processManager.signalVMReady();
-    }
-
-    public void ping() {
-      // do nothing
-    }
-
-    @Override
-    public BounceResult bounce(int pid) {
-      return bounce(VersionManager.CURRENT_VERSION, pid, false);
-    }
-
-    @Override
-    public BounceResult bounce(String version, int pid, boolean force) {
-      processManager.bounce(version, pid, force);
-
-      try {
-        if (!processManager.waitForVMs(STARTUP_TIMEOUT)) {
-          throw new RuntimeException(STARTUP_TIMEOUT_MESSAGE);
-        }
-        RemoteDUnitVMIF remote =
-            (RemoteDUnitVMIF) registry.lookup(VM.getVMName(VersionManager.CURRENT_VERSION, pid));
-        return new BounceResult(pid, remote);
-      } catch (RemoteException | NotBoundException e) {
-        throw new RuntimeException("could not lookup name", e);
-      } catch (InterruptedException e) {
-        throw new RuntimeException("Failed waiting for VM", e);
-      }
-    }
-  }
-
-  private static class DUnitHost extends Host {
-    private static final long serialVersionUID = -8034165624503666383L;
-
-    private final transient VM debuggingVM;
-
-    private transient ProcessManager processManager;
-
-    public DUnitHost(String hostName, ProcessManager processManager) throws RemoteException {
-      super(hostName);
-      this.debuggingVM = new VM(this, -1, new RemoteDUnitVM());
-      this.processManager = processManager;
-    }
-
-    public void init(Registry registry, int numVMs)
-        throws AccessException, RemoteException, NotBoundException, InterruptedException {
-      for (int i = 0; i < numVMs; i++) {
-        RemoteDUnitVMIF remote = processManager.getStub(i);
-        addVM(i, remote);
-      }
-
-      addLocator(LOCATOR_VM_NUM, processManager.getStub(LOCATOR_VM_NUM));
-
-      addHost(this);
-    }
-
-    /**
-     * Retrieves one of this host's VMs based on the specified VM ID. This will not bounce VM to a
-     * different version. It will only get the current running VM or launch a new one if not already
-     * launched.
-     *
-     * @param n ID of the requested VM; a value of <code>-1</code> will return the controller VM,
-     *        which may be useful for debugging.
-     * @return VM for the requested VM ID.
-     */
-    @Override
-    public VM getVM(int n) {
-      if (n < getVMCount() && n != DEBUGGING_VM_NUM) {
-        VM current = super.getVM(n);
-        return getVM(current.getVersion(), n);
-      } else {
-        return getVM(VersionManager.CURRENT_VERSION, n);
-      }
-    }
-
-    @Override
-    public VM getVM(String version, int n) {
-      if (n == DEBUGGING_VM_NUM) {
-        // for ease of debugging, pass -1 to get the local VM
-        return debuggingVM;
-      }
-
-      if (n < getVMCount()) {
-        VM current = super.getVM(n);
-        if (!current.getVersion().equals(version)) {
-          System.out.println(
-              "Bouncing VM" + n + " from version " + current.getVersion() + " to " + version);
-          current.bounce(version);
-        }
-        return current;
-      }
-
-      int oldVMCount = getVMCount();
-      if (n >= oldVMCount) {
-        // If we don't have a VM with that number, dynamically create it.
-        try {
-          // first fill in any gaps, to keep the superclass, Host, happy
-          for (int i = oldVMCount; i < n; i++) {
-            processManager.launchVM(i);
-          }
-          processManager.waitForVMs(STARTUP_TIMEOUT);
-
-          for (int i = oldVMCount; i < n; i++) {
-            addVM(i, processManager.getStub(i));
-          }
-
-          // now create the one we really want
-          processManager.launchVM(version, n, false);
-          processManager.waitForVMs(STARTUP_TIMEOUT);
-          addVM(n, processManager.getStub(n));
-
-        } catch (IOException | InterruptedException | NotBoundException e) {
-          throw new RuntimeException("Could not dynamically launch vm + " + n, e);
-        }
-      }
-
-      return super.getVM(n);
-    }
-  }
 }
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/InternalBlackboardImpl.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/InternalBlackboardImpl.java
index 3519440..86da376 100755
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/InternalBlackboardImpl.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/InternalBlackboardImpl.java
@@ -23,8 +23,6 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
-import org.apache.geode.test.dunit.standalone.DUnitLauncher;
-
 
 public class InternalBlackboardImpl extends UnicastRemoteObject implements InternalBlackboard {
   public static InternalBlackboard blackboard;
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/JUnit4DistributedTestCase.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/JUnit4DistributedTestCase.java
index 74281ca..8c64555 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/JUnit4DistributedTestCase.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/JUnit4DistributedTestCase.java
@@ -58,7 +58,6 @@ import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.cache.internal.JUnit4CacheTestCase;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.DistributedRule;
-import org.apache.geode.test.dunit.standalone.DUnitLauncher;
 import org.apache.geode.test.junit.rules.serializable.SerializableTestName;
 
 /**
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/Master.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/Master.java
new file mode 100644
index 0000000..fab8539
--- /dev/null
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/Master.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.geode.test.dunit.internal;
+
+import java.rmi.NotBoundException;
+import java.rmi.RemoteException;
+import java.rmi.registry.Registry;
+import java.rmi.server.UnicastRemoteObject;
+
+import org.apache.geode.test.dunit.VM;
+import org.apache.geode.test.version.VersionManager;
+
+public class Master extends UnicastRemoteObject implements MasterRemote {
+  private static final long serialVersionUID = 1178600200232603119L;
+
+  private final Registry registry;
+  private final ProcessManager processManager;
+
+
+  public Master(Registry registry, ProcessManager processManager) throws RemoteException {
+    this.processManager = processManager;
+    this.registry = registry;
+  }
+
+  public int getLocatorPort() throws RemoteException {
+    return DUnitLauncher.locatorPort;
+  }
+
+  public synchronized void signalVMReady() {
+    processManager.signalVMReady();
+  }
+
+  public void ping() {
+    // do nothing
+  }
+
+  @Override
+  public BounceResult bounce(int pid) {
+    return bounce(VersionManager.CURRENT_VERSION, pid, false);
+  }
+
+  @Override
+  public BounceResult bounce(String version, int pid, boolean force) {
+    processManager.bounce(version, pid, force);
+
+    try {
+      if (!processManager.waitForVMs(DUnitLauncher.STARTUP_TIMEOUT)) {
+        throw new RuntimeException(DUnitLauncher.STARTUP_TIMEOUT_MESSAGE);
+      }
+      RemoteDUnitVMIF remote =
+          (RemoteDUnitVMIF) registry.lookup(VM.getVMName(VersionManager.CURRENT_VERSION, pid));
+      return new BounceResult(pid, remote);
+    } catch (RemoteException | NotBoundException e) {
+      throw new RuntimeException("could not lookup name", e);
+    } catch (InterruptedException e) {
+      throw new RuntimeException("Failed waiting for VM", e);
+    }
+  }
+}
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/BounceResult.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/MasterRemote.java
similarity index 65%
rename from geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/BounceResult.java
rename to geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/MasterRemote.java
index 754af47..f613f7e 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/BounceResult.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/MasterRemote.java
@@ -12,23 +12,20 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package org.apache.geode.test.dunit.standalone;
+package org.apache.geode.test.dunit.internal;
 
-public class BounceResult {
-  private final int newId;
-  private final RemoteDUnitVMIF newClient;
+import java.rmi.Remote;
+import java.rmi.RemoteException;
 
-  public BounceResult(int newId, RemoteDUnitVMIF newClient) {
-    this.newId = newId;
-    this.newClient = newClient;
-  }
+public interface MasterRemote extends Remote {
 
-  public int getNewId() {
-    return newId;
-  }
+  int getLocatorPort() throws RemoteException;
 
-  public RemoteDUnitVMIF getNewClient() {
-    return newClient;
-  }
+  void signalVMReady() throws RemoteException;
 
+  void ping() throws RemoteException;
+
+  BounceResult bounce(int pid) throws RemoteException;
+
+  BounceResult bounce(String version, int pid, boolean force) throws RemoteException;
 }
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/MethodInvoker.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/MethodInvoker.java
new file mode 100644
index 0000000..0d0997c
--- /dev/null
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/MethodInvoker.java
@@ -0,0 +1,255 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.geode.test.dunit.internal;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.geode.SystemFailure;
+
+/**
+ * A class specialized for invoking methods via reflection.
+ */
+class MethodInvoker {
+
+  /**
+   * Invoke the method "methodName" on the class named "target". Return the result, including stack
+   * trace (if any).
+   */
+  static MethodInvokerResult execute(String target, String methodName) {
+    return execute(target, methodName, null);
+  }
+
+  /**
+   * Executes the given static method on the given class with the given parameters.
+   */
+  static MethodInvokerResult execute(String target, String methodName, Object[] parameters) {
+    try {
+      // get the class
+      Class targetClass = Class.forName(target);
+
+      // invoke the method
+      try {
+        Class[] paramTypes;
+        if (parameters == null) {
+          paramTypes = new Class[0];
+
+        } else {
+          paramTypes = new Class[parameters.length];
+          for (int i = 0; i < parameters.length; i++) {
+            if (parameters[i] == null) {
+              paramTypes[i] = null;
+
+            } else {
+              paramTypes[i] = parameters[i].getClass();
+            }
+          }
+        }
+
+        Method method = getMethod(targetClass, methodName, paramTypes);
+        method.setAccessible(true);
+        Object result = method.invoke(targetClass, parameters);
+        return new MethodInvokerResult(result);
+
+      } catch (InvocationTargetException e) {
+        Throwable targetException = e.getTargetException();
+        if (targetException == null) {
+          return new MethodInvokerResult(null);
+
+        } else {
+          return new MethodInvokerResult(targetException);
+        }
+      }
+
+    } catch (VirtualMachineError e) {
+      SystemFailure.initiateFailure(e);
+      throw e;
+
+    } catch (Throwable t) {
+      return new MethodInvokerResult(t);
+    }
+  }
+
+  /**
+   * Send the message "methodName" to the object "target". Return the result, including stack trace
+   * (if any).
+   */
+  static MethodInvokerResult executeObject(Object target, String methodName) {
+    return executeObject(target, methodName, null);
+  }
+
+  /**
+   * Executes the given instance method on the given object with the given arguments.
+   */
+  static MethodInvokerResult executeObject(Object target, String methodName, Object[] arguments) {
+    try {
+      // get the class
+      Class receiverClass = target.getClass();
+
+      // invoke the method
+      try {
+        Class[] paramTypes;
+        if (arguments == null) {
+          paramTypes = new Class[0];
+
+        } else {
+          paramTypes = new Class[arguments.length];
+          for (int i = 0; i < arguments.length; i++) {
+            if (arguments[i] == null) {
+              paramTypes[i] = Object.class;
+
+            } else {
+              paramTypes[i] = arguments[i].getClass();
+            }
+          }
+        }
+
+        Method method = getMethod(receiverClass, methodName, paramTypes);
+        method.setAccessible(true);
+        Object result = method.invoke(target, arguments);
+        return new MethodInvokerResult(result);
+
+      } catch (InvocationTargetException e) {
+        Throwable targetException = e.getTargetException();
+        if (targetException == null) {
+          return new MethodInvokerResult(null);
+
+        } else {
+          return new MethodInvokerResult(targetException);
+        }
+      }
+
+    } catch (VirtualMachineError e) {
+      SystemFailure.initiateFailure(e);
+      throw e;
+
+    } catch (Throwable t) {
+      return new MethodInvokerResult(t);
+    }
+  }
+
+  /**
+   * Helper method that searches a class (and its superclasses) for a method with the given name and
+   * parameter types.
+   *
+   * @throws NoSuchMethodException If the method cannot be found
+   */
+  private static Method getMethod(Class targetClass, String methodName, Class[] parameterTypes)
+      throws NoSuchMethodException {
+    List<Method> matchingMethods = new ArrayList<>();
+    for (Class theClass = targetClass; theClass != null; theClass = theClass.getSuperclass()) {
+      Method[] methods = theClass.getDeclaredMethods();
+
+      NEXT_METHOD:
+
+      for (Method method : methods) {
+        if (!method.getName().equals(methodName)) {
+          continue;
+        }
+
+        Class[] methodParameterTypes = method.getParameterTypes();
+        if (methodParameterTypes.length != parameterTypes.length) {
+          continue;
+        }
+
+        for (int j = 0; j < methodParameterTypes.length; j++) {
+          if (parameterTypes[j] == null) {
+            if (methodParameterTypes[j].isPrimitive()) {
+              // this parameter is not ok, the parameter is a primitive and the value is null
+              continue NEXT_METHOD;
+            } else {
+              // this parameter is ok, the argument is an object and the value is null
+              continue;
+            }
+          }
+          if (!methodParameterTypes[j].isAssignableFrom(parameterTypes[j])) {
+            Class methodParameterType = methodParameterTypes[j];
+            Class parameterType = parameterTypes[j];
+
+            if (methodParameterType.isPrimitive()) {
+              if (methodParameterType.equals(boolean.class) && parameterType.equals(Boolean.class)
+                  || methodParameterType.equals(short.class) && parameterType.equals(Short.class)
+                  || methodParameterType.equals(int.class) && parameterType.equals(Integer.class)
+                  || methodParameterType.equals(long.class) && parameterType.equals(Long.class)
+                  || methodParameterType.equals(float.class) && parameterType.equals(Float.class)
+                  || methodParameterType.equals(double.class) && parameterType.equals(Double.class)
+                  || methodParameterType.equals(char.class) && parameterType.equals(Character.class)
+                  || methodParameterType.equals(byte.class) && parameterType.equals(Byte.class)) {
+
+                // This parameter is okay, try the next one
+                continue;
+              }
+            }
+            continue NEXT_METHOD;
+          }
+        }
+
+        matchingMethods.add(method);
+      }
+
+      // We want to check to make sure there aren't two
+      // ambiguous methods on the same class. But a subclass
+      // can still override a method on a super class, so we'll stop
+      // if we found a method on the subclass.
+      if (matchingMethods.size() > 0) {
+        break;
+      }
+    }
+
+    if (matchingMethods.isEmpty()) {
+      StringBuilder sb = new StringBuilder();
+      sb.append("Could not find method ");
+      sb.append(methodName);
+      sb.append(" with ");
+      sb.append(parameterTypes.length);
+      sb.append(" parameters [");
+      for (int i = 0; i < parameterTypes.length; i++) {
+        String name = parameterTypes[i] == null ? null : parameterTypes[i].getName();
+        sb.append(name);
+        if (i < parameterTypes.length - 1) {
+          sb.append(", ");
+        }
+      }
+      sb.append("] in class ");
+      sb.append(targetClass.getName());
+      throw new NoSuchMethodException(sb.toString());
+    }
+
+    if (matchingMethods.size() > 1) {
+      StringBuilder sb = new StringBuilder();
+      sb.append("Method is ambiguous ");
+      sb.append(methodName);
+      sb.append(" with ");
+      sb.append(parameterTypes.length);
+      sb.append(" parameters [");
+      for (int i = 0; i < parameterTypes.length; i++) {
+        String name = parameterTypes[i] == null ? null : parameterTypes[i].getName();
+        sb.append(name);
+        if (i < parameterTypes.length - 1) {
+          sb.append(", ");
+        }
+      }
+      sb.append("] in class ");
+      sb.append(targetClass.getName());
+      sb.append(" methods=").append(matchingMethods);
+      throw new NoSuchMethodException(sb.toString());
+
+    } else {
+      return matchingMethods.get(0);
+    }
+  }
+}
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/MethodInvokerResult.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/MethodInvokerResult.java
new file mode 100644
index 0000000..9c488f8
--- /dev/null
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/MethodInvokerResult.java
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.geode.test.dunit.internal;
+
+import static java.lang.System.lineSeparator;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectOutputStream;
+import java.io.PrintWriter;
+import java.io.Serializable;
+import java.io.StringWriter;
+
+/**
+ * The result of a {@link MethodInvoker} method invocation.
+ */
+public class MethodInvokerResult implements Serializable {
+
+  /**
+   * A "result" object that indicates that an exception occurred while invoking the method
+   */
+  public static final Serializable EXCEPTION_OCCURRED = new Serializable() {
+
+    @Override
+    public boolean equals(Object obj) {
+      // Allows instances to be compared across VMs
+      return obj != null && getClass().equals(obj.getClass());
+    }
+
+    @Override
+    public int hashCode() {
+      return getClass().hashCode();
+    }
+
+    @Override
+    public String toString() {
+      return "EXCEPTION_OCCURRED";
+    }
+  };
+
+  /** The result of execution (may be an exception or error type) */
+  private final Object result;
+
+  /** The exception that resulted from invoking the method */
+  private final Throwable exception;
+
+  /** Stack trace information (if applicable) */
+  private String stackTrace;
+
+  MethodInvokerResult(Object result) {
+    this.result = result;
+    exception = null;
+  }
+
+  /**
+   * This constructor is invoked when invoking a method resulted in an exception being thrown. The
+   * "result" is set to {@link #EXCEPTION_OCCURRED}. If the exception could not be serialized,
+   * {@link #getException()} will return IOException with the exception stack as the message.
+   */
+  MethodInvokerResult(Throwable throwable) {
+    result = EXCEPTION_OCCURRED;
+    exception = checkSerializable(throwable);
+    stackTrace = toStackTrace(throwable);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append(getResult());
+    sb.append(lineSeparator());
+    if (getStackTrace() != null) {
+      sb.append(getStackTrace());
+    }
+    return sb.toString();
+  }
+
+  /**
+   * Returns the result of the method call. If an exception was thrown during the method call,
+   * {@link #EXCEPTION_OCCURRED} is returned.
+   *
+   * @see #exceptionOccurred()
+   */
+  public Object getResult() {
+    return result;
+  }
+
+  /**
+   * Returns the stack trace of the exception that was thrown while invoking a method. If no
+   * exception was thrown, <code>null</code> is returned.
+   */
+  public String getStackTrace() {
+    return stackTrace;
+  }
+
+  /**
+   * Returns the exception that was thrown while invoking a method. If no exception was thrown,
+   * <code>null</code> is returned.
+   */
+  public Throwable getException() {
+    return exception;
+  }
+
+  /**
+   * Returns whether or not an exception occurred while invoking the method
+   */
+  public boolean exceptionOccurred() {
+    return EXCEPTION_OCCURRED.equals(result);
+  }
+
+  private static String toStackTrace(Throwable throwable) {
+    StringWriter sw = new StringWriter();
+    throwable.printStackTrace(new PrintWriter(sw, true));
+    return sw.toString();
+  }
+
+  private static Throwable checkSerializable(Throwable throwable) {
+    try (ObjectOutputStream oos = new ObjectOutputStream(new ByteArrayOutputStream())) {
+      oos.writeObject(throwable);
+      return throwable;
+
+    } catch (IOException e) {
+      StringWriter sw = new StringWriter();
+      e.printStackTrace(new PrintWriter(sw, true));
+      return new IOException(sw.toString());
+    }
+  }
+}
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/ProcessHolder.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/ProcessHolder.java
similarity index 96%
rename from geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/ProcessHolder.java
rename to geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/ProcessHolder.java
index ebc0530..15d022a 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/ProcessHolder.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/ProcessHolder.java
@@ -12,7 +12,7 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package org.apache.geode.test.dunit.standalone;
+package org.apache.geode.test.dunit.internal;
 
 import java.io.InputStream;
 
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/ProcessManager.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/ProcessManager.java
similarity index 99%
rename from geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/ProcessManager.java
rename to geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/ProcessManager.java
index 8b7ecc8..b3ddb32 100755
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/ProcessManager.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/ProcessManager.java
@@ -12,7 +12,7 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package org.apache.geode.test.dunit.standalone;
+package org.apache.geode.test.dunit.internal;
 
 import static org.apache.geode.distributed.ConfigurationProperties.ENABLE_NETWORK_PARTITION_DETECTION;
 import static org.apache.geode.distributed.ConfigurationProperties.LOG_LEVEL;
@@ -42,6 +42,7 @@ import org.apache.geode.distributed.ConfigurationProperties;
 import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.distributed.internal.InternalLocator;
 import org.apache.geode.test.dunit.VM;
+import org.apache.geode.test.version.VersionManager;
 
 public class ProcessManager {
   private int namingPort;
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/RemoteDUnitVM.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/RemoteDUnitVM.java
similarity index 82%
rename from geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/RemoteDUnitVM.java
rename to geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/RemoteDUnitVM.java
index d02ce74..46b7f86 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/RemoteDUnitVM.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/RemoteDUnitVM.java
@@ -12,14 +12,12 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package org.apache.geode.test.dunit.standalone;
+package org.apache.geode.test.dunit.internal;
 
 import java.rmi.RemoteException;
 import java.rmi.server.UnicastRemoteObject;
 import java.util.concurrent.TimeUnit;
 
-import hydra.MethExecutor;
-import hydra.MethExecutorResult;
 import org.apache.logging.log4j.Logger;
 
 import org.apache.geode.internal.logging.LogService;
@@ -41,10 +39,10 @@ public class RemoteDUnitVM extends UnicastRemoteObject implements RemoteDUnitVMI
    * @return the result of method execution
    */
   @Override
-  public MethExecutorResult executeMethodOnObject(Object target, String methodName) {
+  public MethodInvokerResult executeMethodOnObject(Object target, String methodName) {
     String name = target.getClass().getName() + '.' + methodName + " on object: " + target;
     long start = start(name);
-    MethExecutorResult result = MethExecutor.executeObject(target, methodName);
+    MethodInvokerResult result = MethodInvoker.executeObject(target, methodName);
     logDelta(name, start, result);
     return result;
   }
@@ -54,7 +52,7 @@ public class RemoteDUnitVM extends UnicastRemoteObject implements RemoteDUnitVMI
     return System.nanoTime();
   }
 
-  private void logDelta(String name, long start, MethExecutorResult result) {
+  private void logDelta(String name, long start, MethodInvokerResult result) {
     long delta = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
     logger.info("Got result: {} from {} (took {} ms)", result, name, delta);
   }
@@ -63,11 +61,12 @@ public class RemoteDUnitVM extends UnicastRemoteObject implements RemoteDUnitVMI
    * Executes a given instance method on a given object with the given arguments.
    */
   @Override
-  public MethExecutorResult executeMethodOnObject(Object target, String methodName, Object[] args) {
+  public MethodInvokerResult executeMethodOnObject(Object target, String methodName,
+      Object[] args) {
     String name = target.getClass().getName() + '.' + methodName
         + (args != null ? " with " + args.length + " args" : "") + " on object: " + target;
     long start = start(name);
-    MethExecutorResult result = MethExecutor.executeObject(target, methodName, args);
+    MethodInvokerResult result = MethodInvoker.executeObject(target, methodName, args);
     logDelta(name, start, result);
     return result;
   }
@@ -81,10 +80,10 @@ public class RemoteDUnitVM extends UnicastRemoteObject implements RemoteDUnitVMI
    * @param methodName the name of the method to execute
    * @return the result of method execution
    */
-  public MethExecutorResult executeMethodOnClass(String className, String methodName) {
+  public MethodInvokerResult executeMethodOnClass(String className, String methodName) {
     String name = className + '.' + methodName;
     long start = start(name);
-    MethExecutorResult result = MethExecutor.execute(className, methodName);
+    MethodInvokerResult result = MethodInvoker.execute(className, methodName);
     logDelta(name, start, result);
 
     return result;
@@ -94,12 +93,12 @@ public class RemoteDUnitVM extends UnicastRemoteObject implements RemoteDUnitVMI
    * Executes a given static method in a given class with the given arguments.
    */
   @Override
-  public MethExecutorResult executeMethodOnClass(String className, String methodName,
+  public MethodInvokerResult executeMethodOnClass(String className, String methodName,
       Object[] args) {
     String name =
         className + '.' + methodName + (args != null ? " with " + args.length + " args" : "");
     long start = start(name);
-    MethExecutorResult result = MethExecutor.execute(className, methodName, args);
+    MethodInvokerResult result = MethodInvoker.execute(className, methodName, args);
     logDelta(name, start, result);
     return result;
   }
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/RemoteDUnitVMIF.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/RemoteDUnitVMIF.java
similarity index 73%
rename from geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/RemoteDUnitVMIF.java
rename to geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/RemoteDUnitVMIF.java
index 9db6b06..b46d215 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/RemoteDUnitVMIF.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/RemoteDUnitVMIF.java
@@ -12,21 +12,20 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package org.apache.geode.test.dunit.standalone;
+package org.apache.geode.test.dunit.internal;
 
 import java.rmi.Remote;
 import java.rmi.RemoteException;
 
-import hydra.MethExecutorResult;
-
 public interface RemoteDUnitVMIF extends Remote {
 
-  MethExecutorResult executeMethodOnObject(Object target, String methodName) throws RemoteException;
+  MethodInvokerResult executeMethodOnObject(Object target, String methodName)
+      throws RemoteException;
 
-  MethExecutorResult executeMethodOnObject(Object target, String methodName, Object[] args)
+  MethodInvokerResult executeMethodOnObject(Object target, String methodName, Object[] args)
       throws RemoteException;
 
-  MethExecutorResult executeMethodOnClass(String className, String methodName, Object[] args)
+  MethodInvokerResult executeMethodOnClass(String className, String methodName, Object[] args)
       throws RemoteException;
 
   void shutDownVM() throws RemoteException;
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/StandAloneDUnitEnv.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/StandAloneDUnitEnv.java
similarity index 94%
rename from geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/StandAloneDUnitEnv.java
rename to geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/StandAloneDUnitEnv.java
index e8920a5..2e32ebb 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/standalone/StandAloneDUnitEnv.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/internal/StandAloneDUnitEnv.java
@@ -12,14 +12,14 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package org.apache.geode.test.dunit.standalone;
+package org.apache.geode.test.dunit.internal;
 
 import java.io.File;
 import java.rmi.RemoteException;
 import java.util.Properties;
 
 import org.apache.geode.test.dunit.DUnitEnv;
-import org.apache.geode.test.dunit.standalone.DUnitLauncher.MasterRemote;
+import org.apache.geode.test.version.VersionManager;
 
 public class StandAloneDUnitEnv extends DUnitEnv {
 
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/AbstractDistributedRule.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/AbstractDistributedRule.java
index 3d13c70..46bd45d 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/AbstractDistributedRule.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/AbstractDistributedRule.java
@@ -21,7 +21,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import org.junit.runner.Description;
 import org.junit.runners.model.Statement;
 
-import org.apache.geode.test.dunit.standalone.DUnitLauncher;
+import org.apache.geode.test.dunit.internal.DUnitLauncher;
 import org.apache.geode.test.junit.rules.serializable.SerializableStatement;
 import org.apache.geode.test.junit.rules.serializable.SerializableTestRule;
 
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/CacheRule.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/CacheRule.java
index 4169932..ca631f3 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/CacheRule.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/CacheRule.java
@@ -16,7 +16,7 @@ package org.apache.geode.test.dunit.rules;
 
 import static org.apache.geode.test.dunit.Disconnect.disconnectAllFromDS;
 import static org.apache.geode.test.dunit.VM.DEFAULT_VM_COUNT;
-import static org.apache.geode.test.dunit.standalone.DUnitLauncher.getDistributedSystemProperties;
+import static org.apache.geode.test.dunit.internal.DUnitLauncher.getDistributedSystemProperties;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import java.util.ArrayList;
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/ClusterStartupRule.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/ClusterStartupRule.java
index 0687cc6..a8a5746 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/ClusterStartupRule.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/ClusterStartupRule.java
@@ -18,7 +18,7 @@ package org.apache.geode.test.dunit.rules;
 import static org.apache.geode.distributed.ConfigurationProperties.GROUPS;
 import static org.apache.geode.test.awaitility.GeodeAwaitility.await;
 import static org.apache.geode.test.dunit.Host.getHost;
-import static org.apache.geode.test.dunit.standalone.DUnitLauncher.NUM_VMS;
+import static org.apache.geode.test.dunit.internal.DUnitLauncher.NUM_VMS;
 
 import java.io.File;
 import java.io.Serializable;
@@ -44,8 +44,7 @@ import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.RMIException;
 import org.apache.geode.test.dunit.SerializableConsumerIF;
 import org.apache.geode.test.dunit.VM;
-import org.apache.geode.test.dunit.standalone.DUnitLauncher;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.dunit.internal.DUnitLauncher;
 import org.apache.geode.test.junit.rules.ClientCacheRule;
 import org.apache.geode.test.junit.rules.Locator;
 import org.apache.geode.test.junit.rules.LocatorStarterRule;
@@ -54,6 +53,7 @@ import org.apache.geode.test.junit.rules.MemberStarterRule;
 import org.apache.geode.test.junit.rules.Server;
 import org.apache.geode.test.junit.rules.ServerStarterRule;
 import org.apache.geode.test.junit.rules.VMProvider;
+import org.apache.geode.test.version.VersionManager;
 
 /**
  * A rule to help you start locators and servers or clients inside of a
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedDiskDirRule.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedDiskDirRule.java
index f4cbd03..61ce9c4 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedDiskDirRule.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedDiskDirRule.java
@@ -31,7 +31,7 @@ import org.junit.rules.TestName;
 import org.junit.runner.Description;
 
 import org.apache.geode.test.dunit.VM;
-import org.apache.geode.test.dunit.standalone.DUnitLauncher;
+import org.apache.geode.test.dunit.internal.DUnitLauncher;
 import org.apache.geode.test.junit.rules.DiskDirRule;
 import org.apache.geode.test.junit.rules.serializable.SerializableTemporaryFolder;
 import org.apache.geode.test.junit.rules.serializable.SerializableTestName;
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedRule.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedRule.java
index 8b315cb..76f7338 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedRule.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedRule.java
@@ -43,7 +43,7 @@ import org.apache.geode.internal.net.SocketCreatorFactory;
 import org.apache.geode.management.internal.cli.LogWrapper;
 import org.apache.geode.pdx.internal.TypeRegistry;
 import org.apache.geode.test.dunit.IgnoredException;
-import org.apache.geode.test.dunit.standalone.DUnitLauncher;
+import org.apache.geode.test.dunit.internal.DUnitLauncher;
 import org.apache.geode.test.junit.rules.serializable.SerializableExternalResource;
 
 /**
diff --git a/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedUseJacksonForJsonPathRule.java b/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedUseJacksonForJsonPathRule.java
index ca81b2c..afa42ea 100644
--- a/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedUseJacksonForJsonPathRule.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/dunit/rules/DistributedUseJacksonForJsonPathRule.java
@@ -17,7 +17,7 @@ package org.apache.geode.test.dunit.rules;
 import static org.apache.geode.test.dunit.VM.getVMCount;
 import static org.assertj.core.api.Assertions.assertThat;
 
-import org.apache.geode.test.dunit.standalone.DUnitLauncher;
+import org.apache.geode.test.dunit.internal.DUnitLauncher;
 import org.apache.geode.test.junit.rules.UseJacksonForJsonPathRule;
 
 public class DistributedUseJacksonForJsonPathRule extends UseJacksonForJsonPathRule {
diff --git a/geode-dunit/src/main/java/batterytest/greplogs/ExpectedStrings.java b/geode-dunit/src/main/java/org/apache/geode/test/greplogs/ExpectedStrings.java
similarity index 99%
rename from geode-dunit/src/main/java/batterytest/greplogs/ExpectedStrings.java
rename to geode-dunit/src/main/java/org/apache/geode/test/greplogs/ExpectedStrings.java
index 7c1eb68..325a1ea 100644
--- a/geode-dunit/src/main/java/batterytest/greplogs/ExpectedStrings.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/greplogs/ExpectedStrings.java
@@ -12,7 +12,7 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package batterytest.greplogs;
+package org.apache.geode.test.greplogs;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/geode-dunit/src/main/java/batterytest/greplogs/LogConsumer.java b/geode-dunit/src/main/java/org/apache/geode/test/greplogs/LogConsumer.java
similarity index 99%
rename from geode-dunit/src/main/java/batterytest/greplogs/LogConsumer.java
rename to geode-dunit/src/main/java/org/apache/geode/test/greplogs/LogConsumer.java
index 2c382a7..c3e32e3 100644
--- a/geode-dunit/src/main/java/batterytest/greplogs/LogConsumer.java
+++ b/geode-dunit/src/main/java/org/apache/geode/test/greplogs/LogConsumer.java
@@ -12,7 +12,7 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package batterytest.greplogs;
+package org.apache.geode.test.greplogs;
 
 import java.util.ArrayList;
 import java.util.HashMap;
diff --git a/geode-dunit/src/integrationTest/java/org/apache/geode/test/dunit/examples/BeforeClassExampleTest.java b/geode-dunit/src/test/java/org/apache/geode/test/dunit/internal/MethodInvokerTest.java
similarity index 51%
copy from geode-dunit/src/integrationTest/java/org/apache/geode/test/dunit/examples/BeforeClassExampleTest.java
copy to geode-dunit/src/test/java/org/apache/geode/test/dunit/internal/MethodInvokerTest.java
index c11ff4b..9360ceb 100644
--- a/geode-dunit/src/integrationTest/java/org/apache/geode/test/dunit/examples/BeforeClassExampleTest.java
+++ b/geode-dunit/src/test/java/org/apache/geode/test/dunit/internal/MethodInvokerTest.java
@@ -12,26 +12,35 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package org.apache.geode.test.dunit.examples;
+package org.apache.geode.test.dunit.internal;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import org.junit.BeforeClass;
 import org.junit.Test;
 
-import org.apache.geode.test.dunit.Host;
-import org.apache.geode.test.dunit.standalone.DUnitLauncher;
+/**
+ * Unit tests for {@link MethodInvoker}. Extracted from {@link MethodInvoker}.
+ */
+@SuppressWarnings("unused")
+public class MethodInvokerTest {
 
+  @Test
+  public void invokesMethodWithReturn() {
+    MethodInvokerResult result = MethodInvoker.execute(getClass().getName(), "methodWithReturn");
+    assertThat(result.getResult()).isInstanceOf(String.class);
+  }
 
-public class BeforeClassExampleTest {
+  @Test
+  public void invokesMethodThatThrows() {
+    MethodInvokerResult result = MethodInvoker.execute(getClass().getName(), "methodThatThrows");
+    assertThat(result.getException()).isInstanceOf(ArrayIndexOutOfBoundsException.class);
+  }
 
-  @BeforeClass
-  public static void initializeDUnit() throws Exception {
-    DUnitLauncher.launchIfNeeded();
+  public static String methodWithReturn() {
+    return "The result is: " + System.currentTimeMillis();
   }
 
-  @Test
-  public void shouldHaveFourOrMoreDUnitVMsByDefault() throws Exception {
-    assertThat(Host.getHost(0).getVMCount()).isGreaterThanOrEqualTo(4);
+  public static String methodThatThrows() {
+    throw new ArrayIndexOutOfBoundsException("frip");
   }
 }
diff --git a/geode-junit/src/main/java/org/apache/geode/test/junit/rules/gfsh/GfshRule.java b/geode-junit/src/main/java/org/apache/geode/test/junit/rules/gfsh/GfshRule.java
index 4f152de..d911bf3 100644
--- a/geode-junit/src/main/java/org/apache/geode/test/junit/rules/gfsh/GfshRule.java
+++ b/geode-junit/src/main/java/org/apache/geode/test/junit/rules/gfsh/GfshRule.java
@@ -29,8 +29,8 @@ import java.util.stream.Collectors;
 import org.junit.rules.ExternalResource;
 import org.junit.rules.TemporaryFolder;
 
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.rules.RequiresGeodeHome;
+import org.apache.geode.test.version.VersionManager;
 
 /**
  * The {@code GfshRule} allows a test to execute Gfsh commands via the actual (fully-assembled) gfsh
diff --git a/geode-junit/src/main/java/org/apache/geode/test/dunit/standalone/VersionManager.java b/geode-junit/src/main/java/org/apache/geode/test/version/VersionManager.java
similarity index 99%
rename from geode-junit/src/main/java/org/apache/geode/test/dunit/standalone/VersionManager.java
rename to geode-junit/src/main/java/org/apache/geode/test/version/VersionManager.java
index d7c5598..c335d6e 100755
--- a/geode-junit/src/main/java/org/apache/geode/test/dunit/standalone/VersionManager.java
+++ b/geode-junit/src/main/java/org/apache/geode/test/version/VersionManager.java
@@ -12,7 +12,7 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package org.apache.geode.test.dunit.standalone;
+package org.apache.geode.test.version;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/geode-junit/src/test/java/org/apache/geode/test/dunit/standalone/VersionManagerJUnitTest.java b/geode-junit/src/test/java/org/apache/geode/test/version/VersionManagerJUnitTest.java
similarity index 97%
rename from geode-junit/src/test/java/org/apache/geode/test/dunit/standalone/VersionManagerJUnitTest.java
rename to geode-junit/src/test/java/org/apache/geode/test/version/VersionManagerJUnitTest.java
index 1abbe11..90c2bb3 100755
--- a/geode-junit/src/test/java/org/apache/geode/test/dunit/standalone/VersionManagerJUnitTest.java
+++ b/geode-junit/src/test/java/org/apache/geode/test/version/VersionManagerJUnitTest.java
@@ -12,7 +12,7 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package org.apache.geode.test.dunit.standalone;
+package org.apache.geode.test.version;
 
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 
diff --git a/geode-lucene/src/upgradeTest/java/org/apache/geode/cache/lucene/LuceneSearchWithRollingUpgradeDUnit.java b/geode-lucene/src/upgradeTest/java/org/apache/geode/cache/lucene/LuceneSearchWithRollingUpgradeDUnit.java
index 0cbdf0a..6b81709 100644
--- a/geode-lucene/src/upgradeTest/java/org/apache/geode/cache/lucene/LuceneSearchWithRollingUpgradeDUnit.java
+++ b/geode-lucene/src/upgradeTest/java/org/apache/geode/cache/lucene/LuceneSearchWithRollingUpgradeDUnit.java
@@ -57,10 +57,10 @@ import org.apache.geode.test.dunit.IgnoredException;
 import org.apache.geode.test.dunit.Invoke;
 import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.VM;
+import org.apache.geode.test.dunit.internal.DUnitLauncher;
 import org.apache.geode.test.dunit.internal.JUnit4DistributedTestCase;
-import org.apache.geode.test.dunit.standalone.DUnitLauncher;
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
+import org.apache.geode.test.version.VersionManager;
 
 @RunWith(Parameterized.class)
 @Parameterized.UseParametersRunnerFactory(CategoryWithParameterizedRunnerFactory.class)
diff --git a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeCreateGatewaySenderMixedSiteOneCurrentSiteTwo.java b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeCreateGatewaySenderMixedSiteOneCurrentSiteTwo.java
index eaac52c..703f028 100644
--- a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeCreateGatewaySenderMixedSiteOneCurrentSiteTwo.java
+++ b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeCreateGatewaySenderMixedSiteOneCurrentSiteTwo.java
@@ -26,8 +26,8 @@ import org.apache.geode.test.dunit.DistributedTestUtils;
 import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.VM;
-import org.apache.geode.test.dunit.standalone.VersionManager;
 import org.apache.geode.test.junit.rules.GfshCommandRule;
+import org.apache.geode.test.version.VersionManager;
 
 public class WANRollingUpgradeCreateGatewaySenderMixedSiteOneCurrentSiteTwo
     extends WANRollingUpgradeDUnitTest {
diff --git a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeDUnitTest.java b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeDUnitTest.java
index cc2e7ff..848d507 100644
--- a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeDUnitTest.java
+++ b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeDUnitTest.java
@@ -60,11 +60,11 @@ import org.apache.geode.management.internal.cli.util.CommandStringBuilder;
 import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.VM;
 import org.apache.geode.test.dunit.cache.internal.JUnit4CacheTestCase;
-import org.apache.geode.test.dunit.standalone.DUnitLauncher;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.dunit.internal.DUnitLauncher;
 import org.apache.geode.test.junit.categories.WanTest;
 import org.apache.geode.test.junit.rules.GfshCommandRule;
 import org.apache.geode.test.junit.runners.CategoryWithParameterizedRunnerFactory;
+import org.apache.geode.test.version.VersionManager;
 
 @SuppressWarnings("ConstantConditions")
 @Category(WanTest.class)
diff --git a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeEventProcessingMixedSiteOneCurrentSiteTwo.java b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeEventProcessingMixedSiteOneCurrentSiteTwo.java
index 181d1fe..9c0ba9b 100644
--- a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeEventProcessingMixedSiteOneCurrentSiteTwo.java
+++ b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeEventProcessingMixedSiteOneCurrentSiteTwo.java
@@ -26,7 +26,7 @@ import org.apache.geode.test.dunit.DistributedTestUtils;
 import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.VM;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.version.VersionManager;
 
 public class WANRollingUpgradeEventProcessingMixedSiteOneCurrentSiteTwo
     extends WANRollingUpgradeDUnitTest {
diff --git a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeEventProcessingOldSiteOneCurrentSiteTwo.java b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeEventProcessingOldSiteOneCurrentSiteTwo.java
index 2b71c4d..3868b0f 100644
--- a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeEventProcessingOldSiteOneCurrentSiteTwo.java
+++ b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeEventProcessingOldSiteOneCurrentSiteTwo.java
@@ -26,7 +26,7 @@ import org.apache.geode.test.dunit.DistributedTestUtils;
 import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.VM;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.version.VersionManager;
 
 public class WANRollingUpgradeEventProcessingOldSiteOneCurrentSiteTwo
     extends WANRollingUpgradeDUnitTest {
diff --git a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeMultipleReceiversDefinedInClusterConfiguration.java b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeMultipleReceiversDefinedInClusterConfiguration.java
index 306b97b..24ca251 100644
--- a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeMultipleReceiversDefinedInClusterConfiguration.java
+++ b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeMultipleReceiversDefinedInClusterConfiguration.java
@@ -46,7 +46,7 @@ import org.apache.geode.test.dunit.DistributedTestUtils;
 import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.VM;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.version.VersionManager;
 
 public class WANRollingUpgradeMultipleReceiversDefinedInClusterConfiguration
     extends WANRollingUpgradeDUnitTest {
diff --git a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeSecondaryEventsNotReprocessedAfterCurrentSiteMemberFailover.java b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeSecondaryEventsNotReprocessedAfterCurrentSiteMemberFailover.java
index 5f6c5b3..4a10e31 100644
--- a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeSecondaryEventsNotReprocessedAfterCurrentSiteMemberFailover.java
+++ b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeSecondaryEventsNotReprocessedAfterCurrentSiteMemberFailover.java
@@ -25,7 +25,7 @@ import org.apache.geode.test.dunit.DistributedTestUtils;
 import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.VM;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.version.VersionManager;
 
 public class WANRollingUpgradeSecondaryEventsNotReprocessedAfterCurrentSiteMemberFailover
     extends WANRollingUpgradeDUnitTest {
diff --git a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeSecondaryEventsNotReprocessedAfterCurrentSiteMemberFailoverWithOldClient.java b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeSecondaryEventsNotReprocessedAfterCurrentSiteMemberFailoverWithOldClient.java
index 0763af6..68e29d2 100644
--- a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeSecondaryEventsNotReprocessedAfterCurrentSiteMemberFailoverWithOldClient.java
+++ b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeSecondaryEventsNotReprocessedAfterCurrentSiteMemberFailoverWithOldClient.java
@@ -25,7 +25,7 @@ import org.apache.geode.test.dunit.DistributedTestUtils;
 import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.VM;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.version.VersionManager;
 
 public class WANRollingUpgradeSecondaryEventsNotReprocessedAfterCurrentSiteMemberFailoverWithOldClient
     extends WANRollingUpgradeDUnitTest {
diff --git a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeSecondaryEventsNotReprocessedAfterOldSiteMemberFailover.java b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeSecondaryEventsNotReprocessedAfterOldSiteMemberFailover.java
index c5f7a22..a0318d1 100644
--- a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeSecondaryEventsNotReprocessedAfterOldSiteMemberFailover.java
+++ b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeSecondaryEventsNotReprocessedAfterOldSiteMemberFailover.java
@@ -25,7 +25,7 @@ import org.apache.geode.test.dunit.DistributedTestUtils;
 import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.VM;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.version.VersionManager;
 
 public class WANRollingUpgradeSecondaryEventsNotReprocessedAfterOldSiteMemberFailover
     extends WANRollingUpgradeDUnitTest {
diff --git a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeVerifyGatewayReceiverDoesNotSendRemoveCacheServerProfileToMembersOlderThan1dot5.java b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeVerifyGatewayReceiverDoesNotSendRemoveCacheServerProfileToMembersOlderThan1dot5.java
index 756ad10..34a9bc9 100644
--- a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeVerifyGatewayReceiverDoesNotSendRemoveCacheServerProfileToMembersOlderThan1dot5.java
+++ b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeVerifyGatewayReceiverDoesNotSendRemoveCacheServerProfileToMembersOlderThan1dot5.java
@@ -26,7 +26,7 @@ import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.IgnoredException;
 import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.VM;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.version.VersionManager;
 
 public class WANRollingUpgradeVerifyGatewayReceiverDoesNotSendRemoveCacheServerProfileToMembersOlderThan1dot5
     extends WANRollingUpgradeDUnitTest {
diff --git a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeVerifyGatewaySenderProfile.java b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeVerifyGatewaySenderProfile.java
index f6fa588..2aaae6c 100644
--- a/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeVerifyGatewaySenderProfile.java
+++ b/geode-wan/src/upgradeTest/java/org/apache/geode/cache/wan/WANRollingUpgradeVerifyGatewaySenderProfile.java
@@ -27,7 +27,7 @@ import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.IgnoredException;
 import org.apache.geode.test.dunit.NetworkUtils;
 import org.apache.geode.test.dunit.VM;
-import org.apache.geode.test.dunit.standalone.VersionManager;
+import org.apache.geode.test.version.VersionManager;
 
 public class WANRollingUpgradeVerifyGatewaySenderProfile extends WANRollingUpgradeDUnitTest {
   @Test