You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by up...@apache.org on 2018/08/30 23:03:42 UTC

[geode] branch develop updated: GEODE-3451: Adding awaitility and cleaning up warnings in MultiVMRegionTestCase

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

upthewaterspout 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 8722963  GEODE-3451: Adding awaitility and cleaning up warnings in MultiVMRegionTestCase
8722963 is described below

commit 87229631af5d461d3d674682fb34965d0f337e13
Author: mhansonp <mh...@pivotal.io>
AuthorDate: Thu Aug 30 16:03:35 2018 -0700

    GEODE-3451: Adding awaitility and cleaning up warnings in MultiVMRegionTestCase
    
    * added awaitility to testConcurrentEventsOnEmptyRegion to handle the case where no-ack region upgrades are not completely propagated.
    * Cleaned up warnings
    
    Co-Authored-By: Dale Emery <de...@pivotal.io>
    Co-Authored-By: Mark Hanson <mh...@pivotal.io>
---
 .../web/controllers/RestAPIsWithSSLDUnitTest.java  |   19 +-
 .../integrationTest/resources/assembly_content.txt |    1 -
 .../cache30/DistributedAckRegionCCEDUnitTest.java  |  126 +-
 .../geode/cache30/GlobalRegionCCEDUnitTest.java    |    2 +-
 .../geode/cache30/GlobalRegionDUnitTest.java       |   12 +-
 .../geode/cache30/PartitionedRegionDUnitTest.java  |    4 +-
 .../internal/cache/RemoteTransactionDUnitTest.java |   17 +-
 .../java/org/apache/geode/TXJUnitTest.java         |  115 +-
 .../apache/geode/cache/CacheListenerJUnitTest.java |    2 +-
 .../org/apache/geode/cache/TransactionEvent.java   |    4 +-
 .../apache/geode/cache/TransactionListener.java    |    8 +-
 .../cache/RemoteCQTransactionDUnitTest.java        |    3 +-
 .../geode/cache30/MultiVMRegionTestCase.java       | 5576 +++++++++-----------
 .../org/apache/geode/cache30/RegionTestCase.java   |   44 +-
 .../apache/geode/cache30/TestCacheListener.java    |   87 +-
 .../org/apache/geode/cache30/TestCacheLoader.java  |    6 +-
 .../org/apache/geode/cache30/TestCacheWriter.java  |   34 +-
 .../dunit/cache/internal/JUnit4CacheTestCase.java  |   26 +-
 .../geode/test/dunit/rules/DistributedRule.java    |    2 -
 .../apache/geode/cache/util/TxEventTestUtil.java   |  100 +-
 20 files changed, 2910 insertions(+), 3278 deletions(-)

diff --git a/geode-assembly/src/distributedTest/java/org/apache/geode/rest/internal/web/controllers/RestAPIsWithSSLDUnitTest.java b/geode-assembly/src/distributedTest/java/org/apache/geode/rest/internal/web/controllers/RestAPIsWithSSLDUnitTest.java
index 662db12..8399570 100644
--- a/geode-assembly/src/distributedTest/java/org/apache/geode/rest/internal/web/controllers/RestAPIsWithSSLDUnitTest.java
+++ b/geode-assembly/src/distributedTest/java/org/apache/geode/rest/internal/web/controllers/RestAPIsWithSSLDUnitTest.java
@@ -106,7 +106,6 @@ import org.apache.geode.internal.cache.GemFireCacheImpl;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.security.SecurableCommunicationChannel;
 import org.apache.geode.management.ManagementException;
-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;
@@ -238,11 +237,10 @@ public class RestAPIsWithSSLDUnitTest extends LocatorTestBase {
   private String startInfraWithSSL(final Properties sslProperties, boolean clusterLevel)
       throws Exception {
 
-    final Host host = Host.getHost(0);
-    VM locator = host.getVM(0);
-    VM manager = host.getVM(1);
-    VM server = host.getVM(2);
-    VM client = host.getVM(3);
+    VM locator = VM.getVM(0);
+    VM manager = VM.getVM(1);
+    VM server = VM.getVM(2);
+    VM client = VM.getVM(3);
 
     // start locator
     final String hostName = NetworkUtils.getServerHostName(locator.getHost());
@@ -285,11 +283,10 @@ public class RestAPIsWithSSLDUnitTest extends LocatorTestBase {
 
   private void closeInfra() throws Exception {
 
-    final Host host = Host.getHost(0);
-    VM locator = host.getVM(0);
-    VM manager = host.getVM(1);
-    VM server = host.getVM(2);
-    VM client = host.getVM(3);
+    VM locator = VM.getVM(0);
+    VM manager = VM.getVM(1);
+    VM server = VM.getVM(2);
+    VM client = VM.getVM(3);
 
     // stop the client and make sure the bridge server notifies
     // stopBridgeMemberVM(client);
diff --git a/geode-assembly/src/integrationTest/resources/assembly_content.txt b/geode-assembly/src/integrationTest/resources/assembly_content.txt
index a363398..6e68900 100644
--- a/geode-assembly/src/integrationTest/resources/assembly_content.txt
+++ b/geode-assembly/src/integrationTest/resources/assembly_content.txt
@@ -648,7 +648,6 @@ javadoc/org/apache/geode/cache30/CacheXmlTestCase.html
 javadoc/org/apache/geode/cache30/CertifiableTestCacheListener.html
 javadoc/org/apache/geode/cache30/ClientServerTestCase.CacheServerCacheLoader.html
 javadoc/org/apache/geode/cache30/ClientServerTestCase.html
-javadoc/org/apache/geode/cache30/MultiVMRegionTestCase.MyTransactionListener.html
 javadoc/org/apache/geode/cache30/MultiVMRegionTestCase.html
 javadoc/org/apache/geode/cache30/MyGatewayEventFilter1.html
 javadoc/org/apache/geode/cache30/MyGatewayEventFilter2.html
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/cache30/DistributedAckRegionCCEDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/cache30/DistributedAckRegionCCEDUnitTest.java
index e565861..c2dc023 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/cache30/DistributedAckRegionCCEDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/cache30/DistributedAckRegionCCEDUnitTest.java
@@ -17,16 +17,16 @@ package org.apache.geode.cache30;
 
 import static org.apache.geode.distributed.ConfigurationProperties.CONSERVE_SOCKETS;
 import static org.apache.geode.distributed.ConfigurationProperties.DISTRIBUTED_SYSTEM_ID;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.fail;
+import static org.assertj.core.api.Assumptions.assumeThat;
 
 import java.net.UnknownHostException;
 import java.util.Properties;
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
 
+import org.awaitility.Awaitility;
 import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
@@ -55,17 +55,14 @@ import org.apache.geode.internal.cache.UpdateOperation;
 import org.apache.geode.internal.cache.VersionTagHolder;
 import org.apache.geode.internal.cache.tier.sockets.ClientProxyMembershipID;
 import org.apache.geode.internal.cache.versions.VMVersionTag;
+import org.apache.geode.internal.cache.versions.VersionStamp;
 import org.apache.geode.internal.cache.versions.VersionTag;
 import org.apache.geode.internal.cache.vmotion.VMotionObserver;
 import org.apache.geode.internal.cache.vmotion.VMotionObserverHolder;
 import org.apache.geode.test.dunit.AsyncInvocation;
-import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.SerializableCallable;
 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.WaitCriterion;
-import org.apache.geode.test.junit.categories.FlakyTest;
 import org.apache.geode.test.junit.categories.OffHeapTest;
 
 @Category({OffHeapTest.class})
@@ -112,14 +109,14 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
   @Ignore("replicates don't allow local destroy")
   @Override
   @Test
-  public void testLocalDestroy() throws InterruptedException {
+  public void testLocalDestroy() {
     // replicates don't allow local destroy
   }
 
   @Ignore("replicates don't allow local destroy")
   @Override
   @Test
-  public void testEntryTtlLocalDestroy() throws InterruptedException {
+  public void testEntryTtlLocalDestroy() {
     // replicates don't allow local destroy
   }
 
@@ -129,7 +126,7 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
    * same sort of check is performed for register-interest.
    */
   @Test
-  public void testGIISendsTombstones() throws Exception {
+  public void testGIISendsTombstones() {
     versionTestGIISendsTombstones();
   }
 
@@ -145,8 +142,8 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
     }
     final String name = this.getUniqueName() + "-CC";
     final String key = "mykey";
-    VM vm1 = Host.getHost(0).getVM(1);
-    VM vm2 = Host.getHost(0).getVM(2);
+    VM vm1 = VM.getVM(1);
+    VM vm2 = VM.getVM(2);
 
     // create some destroyed entries so the GC service is populated
     SerializableCallable create = new SerializableCallable("create region") {
@@ -159,11 +156,11 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
     // do conflicting update() and destroy() on the region. We want the update() to
     // be sent with a message and the destroy() to be transferred in the initial image
     // and be the value that we want to keep
-    InternalDistributedMember vm1ID = (InternalDistributedMember) vm1.invoke(create);
+    vm1.invoke(create);
 
     AsyncInvocation partialCreate =
-        vm2.invokeAsync(new SerializableCallable("create region with stall") {
-          public Object call() throws Exception {
+        vm2.invokeAsync(new SerializableCallable<Object>("create region with stall") {
+          public Object call() {
             final GemFireCacheImpl cache = (GemFireCacheImpl) getCache();
             RegionFactory f = cache.createRegionFactory(getRegionAttributes());
             InitialImageOperation.VMOTION_DURING_GII = true;
@@ -201,8 +198,9 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
               // at this point we should have received the update op and then the GII, which should
               // overwrite
               // the conflicting update op
-              assertFalse("expected initial image transfer to destroy entry",
-                  CCRegion.containsKey(key));
+              assertThat(CCRegion.containsKey(key))
+                  .describedAs("entry was destroyed by initial image transfer")
+                  .isFalse();
             } finally {
               InitialImageOperation.VMOTION_DURING_GII = false;
             }
@@ -221,9 +219,10 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
             return;
           }
         }
-        if (adv.adviseGeneric().isEmpty()) {
-          fail("other member never came on line");
-        }
+        assertThat(adv.adviseGeneric())
+            .withFailMessage("other member never came on line")
+            .isNotEmpty();
+
         DistributedCacheOperation.LOSS_SIMULATION_RATIO = 200.0; // inhibit all messaging
         try {
           CCRegion.put("mykey", "initialValue");
@@ -233,7 +232,9 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
         }
 
         // generate a fake version tag for the message
-        VersionTag tag = CCRegion.getRegionEntry(key).getVersionStamp().asVersionTag();
+        final VersionStamp versionStamp = CCRegion.getRegionEntry(key).getVersionStamp();
+        VersionTag<InternalDistributedMember> tag =
+            (VersionTag<InternalDistributedMember>) versionStamp.asVersionTag();
         // create a fake member ID that will be < mine and lose a concurrency check
         NetMember nm = CCRegion.getDistributionManager().getDistributionManagerId().getNetMember();
         InternalDistributedMember mbr = null;
@@ -243,7 +244,7 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
               ClusterDistributionManager.NORMAL_DM_TYPE, null, null);
           tag.setMemberID(mbr);
         } catch (UnknownHostException e) {
-          org.apache.geode.test.dunit.Assert.fail("could not create member id", e);
+          fail("could not create member id: ", e);
         }
 
         // generate an event to distribute that contains the fake version tag
@@ -260,17 +261,12 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
       }
     });
     try {
-      partialCreate.getResult();
+      partialCreate.get();
     } catch (Throwable e) {
-      org.apache.geode.test.dunit.Assert.fail("async invocation in vm2 failed", e);
+      fail("async invocation in vm2 failed ", e);
     }
   }
 
-  protected void do_version_recovery_if_necessary(final VM vm0, final VM vm1, final VM vm2,
-      final Object[] params) {
-    // do nothing here
-  }
-
   /**
    * This tests the concurrency versioning system to ensure that event conflation happens correctly
    * and that the statistic is being updated properly
@@ -281,8 +277,8 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
   }
 
   @Test
-  public void testClearWithConcurrentEvents() throws Exception {
-    z_versionTestClearWithConcurrentEvents(true);
+  public void testClearWithConcurrentEvents() {
+    versionTestClearWithConcurrentEvents();
   }
 
   @Test
@@ -307,9 +303,8 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
    */
   @Test
   public void testTombstoneExpirationRace() {
-    VM vm0 = Host.getHost(0).getVM(0);
-    VM vm1 = Host.getHost(0).getVM(1);
-    // VM vm2 = Host.getHost(0).getVM(2);
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
 
     final String name = this.getUniqueName() + "-CC";
     SerializableRunnable createRegion = new SerializableRunnable("Create Region") {
@@ -320,13 +315,14 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
           CCRegion.put("cckey0", "ccvalue");
           CCRegion.put("cckey0", "ccvalue"); // version number will end up at 4
         } catch (CacheException ex) {
-          org.apache.geode.test.dunit.Assert.fail("While creating region", ex);
+          ex.printStackTrace();
+          fail("While creating region ", ex);
         }
       }
     };
+
     vm0.invoke(createRegion);
     vm1.invoke(createRegion);
-    // vm2.invoke(createRegion);
     vm1.invoke(new SerializableRunnable("Create local tombstone and adjust time") {
       public void run() {
         // make the entry for cckey0 a tombstone in this VM and set its modification time to be
@@ -335,15 +331,15 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
         // distributed-GC
         RegionEntry entry = CCRegion.getRegionEntry("cckey0");
         VersionTag tag = entry.getVersionStamp().asVersionTag();
-        assertTrue(tag.getEntryVersion() > 1);
+        assertThat(tag.getEntryVersion()).isGreaterThan(1);
         tag.setVersionTimeStamp(
             System.currentTimeMillis() - TombstoneService.REPLICATE_TOMBSTONE_TIMEOUT - 1000);
         entry.getVersionStamp().setVersionTimeStamp(tag.getVersionTimeStamp());
         try {
           entry.makeTombstone(CCRegion, tag);
         } catch (RegionClearedException e) {
-          org.apache.geode.test.dunit.Assert
-              .fail("region was mysteriously cleared during unit testing", e);
+
+          fail("region was mysteriously cleared during unit testing ", e);
         }
       }
     });
@@ -354,7 +350,7 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
       public void run() {
         CCRegion.getRegionMap().removeEntry("cckey0", CCRegion.getRegionEntry("cckey0"), true);
         if (CCRegion.getRegionEntry("ckey0") != null) {
-          fail("expected removEntry to remove the entry from the region's map");
+          fail("expected removeEntry to remove the entry from the region's map");
         }
         CCRegion.put("cckey0", "updateAfterReap");
       }
@@ -362,7 +358,7 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
     vm1.invoke(new SerializableRunnable("Check that the create() was applied") {
       public void run() {
         RegionEntry entry = CCRegion.getRegionEntry("cckey0");
-        assertTrue(entry.getVersionStamp().getEntryVersion() == 1);
+        assertThat(entry.getVersionStamp().getEntryVersion()).isEqualTo(1);
       }
     });
     disconnectAllFromDS();
@@ -373,12 +369,11 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
    * distributed-GC. This could be moved to a JUnit test class.
    */
   @Test
-  public void testAggressiveTombstoneReaping() {
-    assumeTrue(getClass() == DistributedAckRegionCCEDUnitTest.class);
+  public void testAggressiveTombstoneReaping() throws InterruptedException {
+    assumeThat(getClass() == DistributedAckRegionCCEDUnitTest.class).isTrue();
 
     final String name = this.getUniqueName() + "-CC";
 
-
     final int saveExpiredTombstoneLimit = TombstoneService.EXPIRED_TOMBSTONE_LIMIT;
     final long saveTombstoneTimeout = TombstoneService.REPLICATE_TOMBSTONE_TIMEOUT;
     TombstoneService.EXPIRED_TOMBSTONE_LIMIT = 50;
@@ -394,22 +389,16 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
       }
       // now simulate a low free-memory condition
       TombstoneService.FORCE_GC_MEMORY_EVENTS = true;
-      WaitCriterion waitForGC = new WaitCriterion() {
-        public boolean done() {
-          return CCRegion.getCachePerfStats().getTombstoneGCCount() > initialCount;
-        }
+      Awaitility.waitAtMost(20, TimeUnit.SECONDS).pollInterval(1, TimeUnit.SECONDS)
+          .until(() -> CCRegion.getCachePerfStats().getTombstoneGCCount() > initialCount);
 
-        public String description() {
-          return "waiting for GC to occur";
-        }
-      };
-      Wait.waitForCriterion(waitForGC, 20000, 1000, true);
-      Wait.pause(5000);
+      Thread.sleep(5000);
       long gcCount = CCRegion.getCachePerfStats().getTombstoneGCCount();
-      assertTrue("expected a few GCs, but not " + (gcCount - initialCount),
-          gcCount < (initialCount + 20));
+      assertThat(gcCount)
+          .withFailMessage("expected a few GCs, but not " + (gcCount - initialCount))
+          .isLessThan(initialCount + 20);
     } catch (CacheException ex) {
-      org.apache.geode.test.dunit.Assert.fail("While creating region", ex);
+      fail("Exception while creating region ", ex);
     } finally {
       TombstoneService.EXPIRED_TOMBSTONE_LIMIT = saveExpiredTombstoneLimit;
       TombstoneService.FORCE_GC_MEMORY_EVENTS = false;
@@ -422,7 +411,6 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
    * and that the statistic is being updated properly
    */
   @Test
-  @Category(FlakyTest.class) // GEODE-3451
   public void testConcurrentEventsOnEmptyRegion() {
     versionTestConcurrentEventsOnEmptyRegion();
   }
@@ -443,7 +431,7 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
 
   @Test
   public void testEntryVersionRollover() throws Exception {
-    assumeTrue(getClass() == DistributedAckRegionCCEDUnitTest.class);
+    assumeThat(getClass() == DistributedAckRegionCCEDUnitTest.class).isTrue();
 
     final String name = this.getUniqueName() + "-CC";
     final int numEntries = 1;
@@ -455,14 +443,15 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
           for (int i = 0; i < numEntries; i++) {
             CCRegion.put("cckey" + i, "ccvalue");
           }
-          assertEquals("expected no conflated events", 0,
-              CCRegion.getCachePerfStats().getConflatedEventsCount());
+          assertThat(CCRegion.getCachePerfStats().getConflatedEventsCount())
+              .describedAs("conflated event count")
+              .isEqualTo(0);
         } catch (CacheException ex) {
-          org.apache.geode.test.dunit.Assert.fail("While creating region", ex);
+          fail("Exception while creating region ", ex);
         }
       }
     };
-    VM vm0 = Host.getHost(0).getVM(0);
+    VM vm0 = VM.getVM(0);
     vm0.invoke(createRegion);
     try {
       createRegion.run();
@@ -480,9 +469,10 @@ public class DistributedAckRegionCCEDUnitTest extends DistributedAckRegionDUnitT
       vm0.invoke(new SerializableRunnable("check conflation count") {
         public void run() {
           // after changed the 3rd try of AUO.doPutOrCreate to be ifOld=false ifNew=false
-          // ARM.updateEntry will be called one more time, so there will be 2 conflacted events
-          assertEquals("expected two conflated event", 2,
-              CCRegion.getCachePerfStats().getConflatedEventsCount());
+          // ARM.updateEntry will be called one more time, so there will be 2 conflicted events
+          assertThat(CCRegion.getCachePerfStats().getConflatedEventsCount())
+              .describedAs("conflated event count")
+              .isEqualTo(2);
         }
       });
     } finally {
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/cache30/GlobalRegionCCEDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/cache30/GlobalRegionCCEDUnitTest.java
index aca4aa4..045a0eb 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/cache30/GlobalRegionCCEDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/cache30/GlobalRegionCCEDUnitTest.java
@@ -132,7 +132,7 @@ public class GlobalRegionCCEDUnitTest extends GlobalRegionDUnitTest {
   @Ignore("TODO: takes too long with global regions and cause false dunit hangs")
   @Test
   public void testClearWithConcurrentEvents() throws Exception {
-    z_versionTestClearWithConcurrentEvents(true);
+    versionTestClearWithConcurrentEvents();
   }
 
   @Ignore("TODO: takes too long with global regions and cause false dunit hangs")
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/cache30/GlobalRegionDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/cache30/GlobalRegionDUnitTest.java
index 47d1d58..740a3ca 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/cache30/GlobalRegionDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/cache30/GlobalRegionDUnitTest.java
@@ -161,14 +161,14 @@ public class GlobalRegionDUnitTest extends MultiVMRegionTestCase {
     SerializableRunnable create = new CacheSerializableRunnable("Create Region") {
       public void run2() throws CacheException {
         Region region = createRegion(name);
-        loader = new TestCacheLoader() {
-          public Object load2(LoaderHelper helper) throws CacheLoaderException {
+        setLoader(new TestCacheLoader<Object, Object>() {
+          public Object load2(LoaderHelper<Object, Object> helper) throws CacheLoaderException {
 
             fail("Should not be invoked");
             return null;
           }
-        };
-        region.getAttributesMutator().setCacheLoader(loader);
+        });
+        region.getAttributesMutator().setCacheLoader(loader());
       }
     };
 
@@ -177,7 +177,7 @@ public class GlobalRegionDUnitTest extends MultiVMRegionTestCase {
       public void run2() throws CacheException {
         Region region = getRootRegion().getSubregion(name);
         region.put(key, value);
-        assertFalse(loader.wasInvoked());
+        assertFalse(loader().wasInvoked());
       }
     });
 
@@ -187,7 +187,7 @@ public class GlobalRegionDUnitTest extends MultiVMRegionTestCase {
       public void run2() throws CacheException {
         Region region = getRootRegion().getSubregion(name);
         assertEquals(value, region.get(key));
-        assertFalse(loader.wasInvoked());
+        assertFalse(loader().wasInvoked());
       }
     });
   }
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/cache30/PartitionedRegionDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/cache30/PartitionedRegionDUnitTest.java
index 836eb1c..d08360b 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/cache30/PartitionedRegionDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/cache30/PartitionedRegionDUnitTest.java
@@ -96,7 +96,7 @@ public class PartitionedRegionDUnitTest extends MultiVMRegionTestCase {
   @Ignore("TODO: test is not implemented for partioned regions")
   @Override
   @Test
-  public void testCacheLoaderModifyingArgument() throws InterruptedException {
+  public void testCacheLoaderModifyingArgument() {
     // TODO, implement a specific PR related test that properly reflects primary allocation
     // and event deliver based on that allocation
   }
@@ -104,7 +104,7 @@ public class PartitionedRegionDUnitTest extends MultiVMRegionTestCase {
   @Ignore("TODO: test is not implemented for partioned regions")
   @Override
   @Test
-  public void testLocalAndRemoteCacheWriters() throws InterruptedException {
+  public void testLocalAndRemoteCacheWriters() {
     // TODO, implement a specific PR related test that properly reflects primary allocation
     // and event deliver based on that allocation
   }
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/RemoteTransactionDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/RemoteTransactionDUnitTest.java
index 2d1dcff..7c2483b 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/RemoteTransactionDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/cache/RemoteTransactionDUnitTest.java
@@ -1771,8 +1771,8 @@ public class RemoteTransactionDUnitTest extends JUnit4CacheTestCase {
     protected boolean isAccessor;
     protected Exception ex = null;
 
-    protected void verify(TransactionEvent txEvent) {
-      for (CacheEvent e : txEvent.getEvents()) {
+    protected void verify(TransactionEvent<Object, Object> txEvent) {
+      for (CacheEvent<Object, Object> e : txEvent.getEvents()) {
         verifyOrigin(e);
         verifyPutAll(e);
       }
@@ -1786,11 +1786,11 @@ public class RemoteTransactionDUnitTest extends JUnit4CacheTestCase {
       }
     }
 
-    private void verifyPutAll(CacheEvent p_event) {
+    private void verifyPutAll(CacheEvent<Object, Object> p_event) {
       if (!(p_event instanceof EntryEvent)) {
         return;
       }
-      EntryEvent event = (EntryEvent) p_event;
+      EntryEvent<Object, Object> event = (EntryEvent<Object, Object>) p_event;
       CustId knownCustId = new CustId(1);
       OrderId knownOrderId = new OrderId(2, knownCustId);
       if (event.getKey().equals(knownOrderId)) {
@@ -2039,10 +2039,9 @@ public class RemoteTransactionDUnitTest extends JUnit4CacheTestCase {
   }
 
   private void doTestIterator(final OP iteratorType, final int redundancy, final OP op) {
-    Host host = Host.getHost(0);
-    VM accessor = host.getVM(0);
-    VM datastore1 = host.getVM(1);
-    VM datastore2 = host.getVM(2);
+    VM accessor = VM.getVM(0);
+    VM datastore1 = VM.getVM(1);
+    VM datastore2 = VM.getVM(2);
     initAccessorAndDataStore(accessor, datastore1, datastore2, redundancy);
 
     accessor.invoke(new SerializableCallable() {
@@ -3144,7 +3143,7 @@ public class RemoteTransactionDUnitTest extends JUnit4CacheTestCase {
       @Override
       public Object call() throws Exception {
         getGemfireCache().getTxManager().addListener(new TestTxListener(true));
-        Region custRegion = getCache().getRegion(CUSTOMER);
+        Region<CustId, Customer> custRegion = getCache().getRegion(CUSTOMER);
         Context ctx = getCache().getJNDIContext();
         UserTransaction tx = (UserTransaction) ctx.lookup("java:/UserTransaction");
         assertEquals(Status.STATUS_NO_TRANSACTION, tx.getStatus());
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/TXJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/TXJUnitTest.java
index 1917b01..a6bda30 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/TXJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/TXJUnitTest.java
@@ -476,7 +476,8 @@ public class TXJUnitTest {
     assertEquals("value2", reg2.get("key2"));
     assertEquals(txCommitChanges + 2, stats.getTxCommitChanges());
     {
-      List<EntryEvent<?, ?>> creates = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> creates =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(2, creates.size());
 
@@ -548,7 +549,8 @@ public class TXJUnitTest {
     {
       Cache teCache = this.te.getCache();
       assertEquals(teCache, this.cache);
-      List<EntryEvent<?, ?>> creates = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> creates =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, creates.size());
 
@@ -580,7 +582,7 @@ public class TXJUnitTest {
     {
       Cache teCache = this.te.getCache();
       assertEquals(teCache, this.cache);
-      List<EntryEvent<?, ?>> creates = TxEventTestUtil.getPutEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> creates = TxEventTestUtil.getPutEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, creates.size());
 
@@ -612,7 +614,8 @@ public class TXJUnitTest {
     {
       Cache teCache = this.te.getCache();
       assertEquals(teCache, this.cache);
-      List<EntryEvent<?, ?>> creates = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> creates =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, creates.size());
 
@@ -644,7 +647,8 @@ public class TXJUnitTest {
     {
       Cache teCache = this.te.getCache();
       assertEquals(teCache, this.cache);
-      List<EntryEvent<?, ?>> creates = TxEventTestUtil.getInvalidateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> creates =
+          TxEventTestUtil.getInvalidateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, creates.size());
 
@@ -677,7 +681,8 @@ public class TXJUnitTest {
     {
       Cache teCache = this.te.getCache();
       assertEquals(teCache, this.cache);
-      List<EntryEvent<?, ?>> creates = TxEventTestUtil.getInvalidateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> creates =
+          TxEventTestUtil.getInvalidateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, creates.size());
 
@@ -711,7 +716,8 @@ public class TXJUnitTest {
     {
       Cache teCache = this.te.getCache();
       assertEquals(teCache, this.cache);
-      List<EntryEvent<?, ?>> creates = TxEventTestUtil.getDestroyEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> creates =
+          TxEventTestUtil.getDestroyEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, creates.size());
 
@@ -744,7 +750,8 @@ public class TXJUnitTest {
     {
       Cache teCache = this.te.getCache();
       assertEquals(teCache, this.cache);
-      List<EntryEvent<?, ?>> creates = TxEventTestUtil.getDestroyEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> creates =
+          TxEventTestUtil.getDestroyEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, creates.size());
 
@@ -1151,7 +1158,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getInvalidateEvents(this.te.getEvents()).size());
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -1192,7 +1200,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getInvalidateEvents(this.te.getEvents()).size());
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -1258,7 +1267,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -1309,7 +1319,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -1437,7 +1448,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -1478,7 +1490,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -1527,7 +1540,7 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getPutEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events = TxEventTestUtil.getPutEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -1569,7 +1582,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getInvalidateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getInvalidateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -1610,7 +1624,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getInvalidateEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getDestroyEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getDestroyEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -1651,7 +1666,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getInvalidateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getInvalidateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -1702,7 +1718,7 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getPutEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events = TxEventTestUtil.getPutEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -1745,7 +1761,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getCreateEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getDestroyEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getDestroyEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -1786,7 +1803,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getCreateEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getDestroyEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getDestroyEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -1826,7 +1844,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getInvalidateEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getDestroyEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getDestroyEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -1894,7 +1913,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -1936,7 +1956,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -1982,7 +2003,7 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getPutEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events = TxEventTestUtil.getPutEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -2021,7 +2042,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getInvalidateEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getDestroyEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getDestroyEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -2060,7 +2082,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getInvalidateEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getDestroyEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getDestroyEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -2131,7 +2154,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -2175,7 +2199,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -2222,7 +2247,7 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getPutEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events = TxEventTestUtil.getPutEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -2262,7 +2287,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getInvalidateEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getDestroyEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getDestroyEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -2301,7 +2327,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getInvalidateEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getDestroyEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getDestroyEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -2372,7 +2399,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -2416,7 +2444,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -2462,7 +2491,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getCreateEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getInvalidateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getInvalidateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -2506,7 +2536,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getCreateEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getInvalidateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getInvalidateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -2547,7 +2578,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -2588,7 +2620,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -2629,7 +2662,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
@@ -2670,7 +2704,8 @@ public class TXJUnitTest {
     assertEquals(0, TxEventTestUtil.getDestroyEvents(this.te.getEvents()).size());
     assertEquals(1, this.te.getEvents().size());
     {
-      List<EntryEvent<?, ?>> events = TxEventTestUtil.getCreateEvents(this.te.getEvents());
+      List<EntryEvent<String, String>> events =
+          TxEventTestUtil.getCreateEvents(this.te.getEvents());
       assertEquals(myTxId, this.te.getTransactionId());
       assertEquals(1, events.size());
 
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/cache/CacheListenerJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/cache/CacheListenerJUnitTest.java
index 912306c..2430a3f 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/cache/CacheListenerJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/cache/CacheListenerJUnitTest.java
@@ -238,7 +238,7 @@ public class CacheListenerJUnitTest {
       public void afterRollback(TransactionEvent e) {
         CacheListenerJUnitTest.this.invokeCount = 1;
         assertEquals(1, e.getEvents().size());
-        CacheListenerJUnitTest.this.lastEvent = e.getEvents().get(0);
+        CacheListenerJUnitTest.this.lastEvent = (CacheEvent) e.getEvents().get(0);
       }
     };
     CacheTransactionManager ctm = this.c.getCacheTransactionManager();
diff --git a/geode-core/src/main/java/org/apache/geode/cache/TransactionEvent.java b/geode-core/src/main/java/org/apache/geode/cache/TransactionEvent.java
index f594ec3..ad02a84 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/TransactionEvent.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/TransactionEvent.java
@@ -47,7 +47,7 @@ import java.util.List;
  * @see EntryEvent
  * @since GemFire 4.0
  */
-public interface TransactionEvent {
+public interface TransactionEvent<K, V> {
 
   /**
    * Gets the <code>TransactionId</code> associated this TransactionEvent.
@@ -63,7 +63,7 @@ public interface TransactionEvent {
    *         operation performed by this transaction.
    * @since GemFire 5.0
    */
-  List<CacheEvent<?, ?>> getEvents();
+  List<CacheEvent<K, V>> getEvents();
 
   /**
    * Gets the Cache for this transaction event
diff --git a/geode-core/src/main/java/org/apache/geode/cache/TransactionListener.java b/geode-core/src/main/java/org/apache/geode/cache/TransactionListener.java
index 58a91ed..ec77e49 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/TransactionListener.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/TransactionListener.java
@@ -39,7 +39,7 @@ package org.apache.geode.cache;
  * @see CacheTransactionManager#getListener
  * @since GemFire 4.0
  */
-public interface TransactionListener extends CacheCallback {
+public interface TransactionListener<K, V> extends CacheCallback {
 
   /**
    * Called after a successful commit of a transaction.
@@ -47,7 +47,7 @@ public interface TransactionListener extends CacheCallback {
    * @param event the TransactionEvent
    * @see CacheTransactionManager#commit
    */
-  void afterCommit(TransactionEvent event);
+  void afterCommit(TransactionEvent<K, V> event);
 
   /**
    * Called after an unsuccessful commit operation.
@@ -55,7 +55,7 @@ public interface TransactionListener extends CacheCallback {
    * @param event the TransactionEvent
    * @see CacheTransactionManager#commit
    */
-  void afterFailedCommit(TransactionEvent event);
+  void afterFailedCommit(TransactionEvent<K, V> event);
 
   /**
    * Called after an explicit rollback of a transaction.
@@ -64,5 +64,5 @@ public interface TransactionListener extends CacheCallback {
    * @see CacheTransactionManager#rollback
    * @see CacheTransactionManager#commit
    */
-  void afterRollback(TransactionEvent event);
+  void afterRollback(TransactionEvent<K, V> event);
 }
diff --git a/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/RemoteCQTransactionDUnitTest.java b/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/RemoteCQTransactionDUnitTest.java
index 7f306e1..77d7277 100755
--- a/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/RemoteCQTransactionDUnitTest.java
+++ b/geode-cq/src/distributedTest/java/org/apache/geode/internal/cache/RemoteCQTransactionDUnitTest.java
@@ -23,6 +23,7 @@ import static org.junit.Assert.fail;
 
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 import org.junit.Test;
@@ -523,7 +524,7 @@ public class RemoteCQTransactionDUnitTest extends JUnit4CacheTestCase {
     protected Exception ex = null;
 
     protected void verify(TransactionEvent txEvent) {
-      for (CacheEvent e : txEvent.getEvents()) {
+      for (CacheEvent e : (List<CacheEvent>) txEvent.getEvents()) {
         verifyOrigin(e);
         verifyPutAll(e);
       }
diff --git a/geode-dunit/src/main/java/org/apache/geode/cache30/MultiVMRegionTestCase.java b/geode-dunit/src/main/java/org/apache/geode/cache30/MultiVMRegionTestCase.java
index c4da413..91babff 100644
--- a/geode-dunit/src/main/java/org/apache/geode/cache30/MultiVMRegionTestCase.java
+++ b/geode-dunit/src/main/java/org/apache/geode/cache30/MultiVMRegionTestCase.java
@@ -14,17 +14,19 @@
  */
 package org.apache.geode.cache30;
 
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.MINUTES;
+import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.geode.internal.lang.ThrowableUtils.hasCauseMessage;
-import static org.apache.geode.test.dunit.Assert.assertEquals;
-import static org.apache.geode.test.dunit.Assert.assertFalse;
-import static org.apache.geode.test.dunit.Assert.assertNotNull;
-import static org.apache.geode.test.dunit.Assert.assertNotSame;
-import static org.apache.geode.test.dunit.Assert.assertNull;
-import static org.apache.geode.test.dunit.Assert.assertSame;
-import static org.apache.geode.test.dunit.Assert.assertTrue;
-import static org.apache.geode.test.dunit.Assert.fail;
-import static org.junit.Assume.assumeFalse;
-import static org.junit.Assume.assumeTrue;
+import static org.apache.geode.test.dunit.Invoke.invokeInEveryVM;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.assertj.core.api.Assertions.fail;
+import static org.assertj.core.api.Assumptions.assumeThat;
+import static org.awaitility.Awaitility.await;
+import static org.awaitility.Awaitility.waitAtMost;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.greaterThanOrEqualTo;
 
 import java.io.ByteArrayInputStream;
 import java.io.DataInput;
@@ -35,22 +37,18 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Random;
-import java.util.Set;
+import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
+import java.util.stream.Stream;
 
 import org.apache.logging.log4j.Logger;
-import org.awaitility.Awaitility;
+import org.awaitility.core.ConditionTimeoutException;
 import org.junit.AfterClass;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -59,7 +57,6 @@ import org.apache.geode.DataSerializable;
 import org.apache.geode.DataSerializer;
 import org.apache.geode.Instantiator;
 import org.apache.geode.InvalidDeltaException;
-import org.apache.geode.LogWriter;
 import org.apache.geode.cache.AttributesFactory;
 import org.apache.geode.cache.AttributesMutator;
 import org.apache.geode.cache.Cache;
@@ -97,7 +94,6 @@ import org.apache.geode.cache.util.CacheListenerAdapter;
 import org.apache.geode.cache.util.TxEventTestUtil;
 import org.apache.geode.distributed.ConfigurationProperties;
 import org.apache.geode.distributed.internal.DMStats;
-import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.internal.AvailablePortHelper;
 import org.apache.geode.internal.HeapDataOutputStream;
@@ -115,52 +111,86 @@ import org.apache.geode.internal.cache.TXStateProxy;
 import org.apache.geode.internal.cache.Token;
 import org.apache.geode.internal.cache.TombstoneService;
 import org.apache.geode.internal.cache.versions.RegionVersionVector;
+import org.apache.geode.internal.cache.versions.VersionSource;
 import org.apache.geode.internal.cache.versions.VersionTag;
 import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.internal.offheap.MemoryAllocatorImpl;
 import org.apache.geode.internal.offheap.StoredObject;
 import org.apache.geode.test.dunit.AsyncInvocation;
 import org.apache.geode.test.dunit.DistributedTestUtils;
-import org.apache.geode.test.dunit.Host;
 import org.apache.geode.test.dunit.IgnoredException;
-import org.apache.geode.test.dunit.Invoke;
 import org.apache.geode.test.dunit.SerializableCallable;
 import org.apache.geode.test.dunit.SerializableRunnable;
+import org.apache.geode.test.dunit.SerializableRunnableIF;
 import org.apache.geode.test.dunit.ThreadUtils;
 import org.apache.geode.test.dunit.VM;
 import org.apache.geode.test.dunit.Wait;
-import org.apache.geode.test.dunit.WaitCriterion;
 
 /**
  * Abstract superclass of {@link Region} tests that involve more than one VM.
  */
 public abstract class MultiVMRegionTestCase extends RegionTestCase {
-
   private static final Logger logger = LogService.getLogger();
+  private static final long POLL_INTERVAL_MILLIS = 50;
+
+  private static final int PUT_RANGE_1_START = 1;
+  private static final int PUT_RANGE_1_END = 5;
+  private static final int PUT_RANGE_2_START = 6;
+  private static final int PUT_RANGE_2_END = 10;
+
+  private static TestCacheListener testCacheListener;
+  private static TestCacheLoader testCacheLoader;
+  private static TestCacheWriter testCacheWriter;
+
+  private static int afterCreates;
+
+  static LocalRegion CCRegion;
+  static int distributedSystemID;
+
+  @SuppressWarnings("unchecked")
+  private static <K, V> TestCacheListener<K, V> listener() {
+    return testCacheListener;
+  }
+
+  private static <K, V> void setListener(TestCacheListener<K, V> listener) {
+    testCacheListener = listener;
+  }
+
+  @SuppressWarnings("unchecked")
+  protected static <K, V> TestCacheLoader<K, V> loader() {
+    return testCacheLoader;
+  }
+
+  protected static <K, V> void setLoader(TestCacheLoader<K, V> loader) {
+    testCacheLoader = loader;
+  }
+
+  @SuppressWarnings("unchecked")
+  private static <K, V> TestCacheWriter<K, V> writer() {
+    return testCacheWriter;
+  }
 
-  private Properties props = new Properties();
-
-  private final int putRange_1Start = 1;
-  private final int putRange_1End = 5;
-  private final int putRange_2Start = 6;
-  private final int putRange_2End = 10;
-  private final int putRange_3Start = 11;
-  private final int putRange_3End = 15;
-  private final int putRange_4Start = 16;
-  private final int putRange_4End = 20;
-  private final int removeRange_1Start = 2;
-  private final int removeRange_1End = 4;
-  private final int removeRange_2Start = 7;
-  private final int removeRange_2End = 9;
+  private static <K, V> void setWriter(TestCacheWriter<K, V> writer) {
+    testCacheWriter = writer;
+  }
+
+  private static void cleanup() {
+    testCacheListener = null;
+    testCacheLoader = null;
+    testCacheWriter = null;
+    CCRegion = null;
+  }
 
   @AfterClass
-  public static void caseTearDown() throws Exception {
+  public static void caseTearDown() {
     disconnectAllFromDS();
   }
 
+  @SuppressWarnings("RedundantThrows") // Subclasses may want to throw
   @Override
   protected final void postTearDownRegionTestCase() throws Exception {
-    CCRegion = null;
+    cleanup();
+    invokeInEveryVM(MultiVMRegionTestCase::cleanup);
   }
 
   @Override
@@ -176,23 +206,22 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * are performed on one of the nodes
    */
   @Test
-  public void testConcurrentOperations() throws Exception {
+  public void testConcurrentOperations() {
     SerializableRunnable createRegion = new CacheSerializableRunnable("createRegion") {
 
       @Override
       public void run2() throws CacheException {
         Cache cache = getCache();
-        RegionAttributes regionAttribs = getRegionAttributes();
-        cache.createRegion("R1", regionAttribs);
+        RegionAttributes<?, ?> regionAttribs = getRegionAttributes();
+        cache.createRegionFactory(regionAttribs).create("R1");
       }
     };
 
-    Host host = Host.getHost(0);
     // create the VM(0 - 4)
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
-    VM vm2 = host.getVM(2);
-    VM vm3 = host.getVM(3);
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
+    VM vm2 = VM.getVM(2);
+    VM vm3 = VM.getVM(3);
     vm0.invoke(createRegion);
     vm1.invoke(createRegion);
     vm2.invoke(createRegion);
@@ -204,102 +233,125 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * Do putIfAbsent(), replace(Object, Object), replace(Object, Object, Object), remove(Object,
    * Object) operations
    */
-  public void concurrentMapTest(final String rName) {
+  private void concurrentMapTest(final String rName) {
 
     // String exceptionStr = "";
-    VM vm0 = Host.getHost(0).getVM(0);
+    VM vm0 = VM.getVM(0);
+
     vm0.invoke(new CacheSerializableRunnable("doConcurrentMapOperations") {
       @Override
       public void run2() throws CacheException {
         Cache cache = getCache();
-        final Region pr = cache.getRegion(rName);
-        assertNotNull(rName + " not created", pr);
+        final Region<String, String> pr = cache.getRegion(rName);
+        assertThat(pr).describedAs(rName + " not created").isNotNull();
 
         // test successful putIfAbsent
-        for (int i = putRange_1Start; i <= putRange_1End; i++) {
+        for (int i = PUT_RANGE_1_START; i <= PUT_RANGE_1_END; i++) {
           Object putResult = pr.putIfAbsent(Integer.toString(i), Integer.toString(i));
-          assertNull("Expected null, but got " + putResult + " for key " + i, putResult);
+          assertThat(putResult).describedAs("Expected null, but got " + putResult + " for key " + i)
+              .isNull();
         }
         int size = pr.size();
-        assertEquals("Size doesn't return expected value", putRange_1End, size);
-        assertFalse("isEmpty doesnt return proper state of the region", pr.isEmpty());
+        assertThat(size).describedAs("Size doesn't return expected value")
+            .isEqualTo(PUT_RANGE_1_END);
+        assertThat(pr.isEmpty()).describedAs("isEmpty doesn't return proper state of the region")
+            .isFalse();
 
         // test unsuccessful putIfAbsent
-        for (int i = putRange_1Start; i <= putRange_1End; i++) {
+        for (int i = PUT_RANGE_1_START; i <= PUT_RANGE_1_END; i++) {
           Object putResult = pr.putIfAbsent(Integer.toString(i), Integer.toString(i + 1));
-          assertEquals("for i=" + i, Integer.toString(i), putResult);
-          assertEquals("for i=" + i, Integer.toString(i), pr.get(Integer.toString(i)));
+          assertThat(putResult).describedAs("for i=" + i).isEqualTo(Integer.toString(i));
+          assertThat(pr.get(Integer.toString(i))).describedAs("for i=" + i).isEqualTo(
+              Integer.toString(i));
         }
         size = pr.size();
-        assertEquals("Size doesn't return expected value", putRange_1End, size);
-        assertFalse("isEmpty doesnt return proper state of the region", pr.isEmpty());
+        assertThat(size).describedAs("Size doesn't return expected value")
+            .isEqualTo(PUT_RANGE_1_END);
+        assertThat(pr.isEmpty()).describedAs("isEmpty doesn't return proper state of the region")
+            .isFalse();
 
         // test successful replace(key, oldValue, newValue)
-        for (int i = putRange_1Start; i <= putRange_1End; i++) {
+        for (int i = PUT_RANGE_1_START; i <= PUT_RANGE_1_END; i++) {
           boolean replaceSucceeded =
               pr.replace(Integer.toString(i), Integer.toString(i), "replaced" + i);
-          assertTrue("for i=" + i, replaceSucceeded);
-          assertEquals("for i=" + i, "replaced" + i, pr.get(Integer.toString(i)));
+          assertThat(replaceSucceeded).describedAs("for i=" + i).isTrue();
+          assertThat(pr.get(Integer.toString(i))).describedAs("for i=" + i).isEqualTo(
+              ("replaced" + i));
         }
         size = pr.size();
-        assertEquals("Size doesn't return expected value", putRange_1End, size);
-        assertFalse("isEmpty doesnt return proper state of the region", pr.isEmpty());
+        assertThat(size).describedAs("Size doesn't return expected value").isEqualTo(
+            PUT_RANGE_1_END);
+        assertThat(pr.isEmpty()).describedAs("isEmpty doesn't return proper state of the region")
+            .isFalse();
 
         // test unsuccessful replace(key, oldValue, newValue)
-        for (int i = putRange_1Start; i <= putRange_2End; i++) {
+        for (int i = PUT_RANGE_1_START; i <= PUT_RANGE_2_END; i++) {
           boolean replaceSucceeded = pr.replace(Integer.toString(i), Integer.toString(i), // wrong
-                                                                                          // expected
-                                                                                          // old
-                                                                                          // value
+              // expected
+              // old
+              // value
               "not" + i);
-          assertFalse("for i=" + i, replaceSucceeded);
-          assertEquals("for i=" + i, i <= putRange_1End ? "replaced" + i : null,
-              pr.get(Integer.toString(i)));
+          assertThat(replaceSucceeded).describedAs("for i=" + i).isFalse();
+          Object expected1 = i <= PUT_RANGE_1_END ? "replaced" + i : null;
+          assertThat(pr.get(Integer.toString(i))).describedAs("for i=" + i).isEqualTo(
+              expected1);
         }
         size = pr.size();
-        assertEquals("Size doesn't return expected value", putRange_1End, size);
-        assertFalse("isEmpty doesnt return proper state of the region", pr.isEmpty());
+        assertThat(size).describedAs("Size doesn't return expected value").isEqualTo(
+            PUT_RANGE_1_END);
+        assertThat(pr.isEmpty()).describedAs("isEmpty doesn't return proper state of the region")
+            .isFalse();
 
         // test successful replace(key, value)
-        for (int i = putRange_1Start; i <= putRange_1End; i++) {
+        for (int i = PUT_RANGE_1_START; i <= PUT_RANGE_1_END; i++) {
           Object replaceResult = pr.replace(Integer.toString(i), "twice replaced" + i);
-          assertEquals("for i=" + i, "replaced" + i, replaceResult);
-          assertEquals("for i=" + i, "twice replaced" + i, pr.get(Integer.toString(i)));
+          assertThat(replaceResult).describedAs("for i=" + i).isEqualTo(("replaced" + i));
+          assertThat(pr.get(Integer.toString(i))).describedAs("for i=" + i).isEqualTo(
+              ("twice replaced" + i));
         }
         size = pr.size();
-        assertEquals("Size doesn't return expected value", putRange_1End, size);
-        assertFalse("isEmpty doesnt return proper state of the region", pr.isEmpty());
+        assertThat(size).describedAs("Size doesn't return expected value").isEqualTo(
+            PUT_RANGE_1_END);
+        assertThat(pr.isEmpty()).describedAs("isEmpty doesn't return proper state of the region")
+            .isFalse();
 
         // test unsuccessful replace(key, value)
-        for (int i = putRange_2Start; i <= putRange_2End; i++) {
+        for (int i = PUT_RANGE_2_START; i <= PUT_RANGE_2_END; i++) {
           Object replaceResult = pr.replace(Integer.toString(i), "thrice replaced" + i);
-          assertNull("for i=" + i, replaceResult);
-          assertNull("for i=" + i, pr.get(Integer.toString(i)));
+          assertThat(replaceResult).describedAs("for i=" + i).isNull();
+          assertThat(pr.get(Integer.toString(i))).describedAs("for i=" + i).isNull();
         }
         size = pr.size();
-        assertEquals("Size doesn't return expected value", putRange_1End, size);
-        assertFalse("isEmpty doesnt return proper state of the region", pr.isEmpty());
+        assertThat(size).describedAs("Size doesn't return expected value").isEqualTo(
+            PUT_RANGE_1_END);
+        assertThat(pr.isEmpty()).describedAs("isEmpty doesn't return proper state of the region")
+            .isFalse();
 
         // test unsuccessful remove(key, value)
-        for (int i = putRange_1Start; i <= putRange_2End; i++) {
+        for (int i = PUT_RANGE_1_START; i <= PUT_RANGE_2_END; i++) {
           boolean removeResult = pr.remove(Integer.toString(i), Integer.toString(-i));
-          assertFalse("for i=" + i, removeResult);
-          assertEquals("for i=" + i, i <= putRange_1End ? "twice replaced" + i : null,
-              pr.get(Integer.toString(i)));
+          assertThat(removeResult).describedAs("for i=" + i).isFalse();
+          Object expected1 =
+              i <= PUT_RANGE_1_END ? "twice replaced" + i : null;
+          assertThat(pr.get(Integer.toString(i))).describedAs("for i=" + i).isEqualTo(
+              expected1);
         }
         size = pr.size();
-        assertEquals("Size doesn't return expected value", putRange_1End, size);
-        assertFalse("isEmpty doesnt return proper state of the region", pr.isEmpty());
+        assertThat(size).describedAs("Size doesn't return expected value").isEqualTo(
+            PUT_RANGE_1_END);
+        assertThat(pr.isEmpty()).describedAs("isEmpty doesn't return proper state of the region")
+            .isFalse();
 
         // test successful remove(key, value)
-        for (int i = putRange_1Start; i <= putRange_1End; i++) {
+        for (int i = PUT_RANGE_1_START; i <= PUT_RANGE_1_END; i++) {
           boolean removeResult = pr.remove(Integer.toString(i), "twice replaced" + i);
-          assertTrue("for i=" + i, removeResult);
-          assertEquals("for i=" + i, null, pr.get(Integer.toString(i)));
+          assertThat(removeResult).describedAs("for i=" + i).isTrue();
+          assertThat(pr.get(Integer.toString(i))).describedAs("for i=" + i).isNull();
         }
         size = pr.size();
-        assertEquals("Size doesn't return expected value", 0, size);
-        assertTrue("isEmpty doesnt return proper state of the region", pr.isEmpty());
+        assertThat(size).describedAs("Size doesn't return expected value").isEqualTo(0);
+        assertThat(pr.isEmpty()).describedAs("isEmpty doesn't return proper state of the region")
+            .isTrue();
       }
     });
 
@@ -312,11 +364,11 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       @Override
       public void run2() {
         Cache cache = getCache();
-        Region pr = cache.getRegion(rName);
-        assertNotNull("Region already destroyed.", pr);
+        Region<?, ?> pr = cache.getRegion(rName);
+        assertThat(pr).describedAs("Region already destroyed.").isNotNull();
         pr.destroyRegion();
-        assertTrue("Region isDestroyed false", pr.isDestroyed());
-        assertNull("Region not destroyed.", cache.getRegion(rName));
+        assertThat(pr.isDestroyed()).describedAs("Region isDestroyed false").isTrue();
+        assertThat(cache.getRegion(rName)).describedAs("Region not destroyed.").isNull();
       }
     });
   }
@@ -326,8 +378,9 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * another VM.
    */
   @Test
-  public void testDistributedUpdate() throws Exception {
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+  public void testDistributedUpdate() {
+    boolean condition = getRegionAttributes().getScope().isDistributed();
+    assertThat(condition).isTrue();
 
     final String name = this.getUniqueName();
 
@@ -338,10 +391,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
-
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
     vm0.invoke(create);
     vm1.invoke(create);
 
@@ -352,7 +403,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable put = new CacheSerializableRunnable("Put key/value") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key, oldValue);
         flushIfNecessary(region);
       }
@@ -364,7 +415,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Update") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key, newValue);
         flushIfNecessary(region);
       }
@@ -373,10 +424,10 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Validate update") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         Region.Entry entry = region.getEntry(key);
-        assertNotNull(entry);
-        assertEquals(newValue, entry.getValue());
+        assertThat(entry).isNotNull();
+        assertThat(entry.getValue()).isEqualTo(newValue);
       }
     });
   }
@@ -390,14 +441,14 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    */
   @Test
   public void testOrderedUpdates() throws Exception {
-    assumeFalse(getRegionAttributes().getScope() == Scope.DISTRIBUTED_NO_ACK);
+    assumeThat(getRegionAttributes().getScope()).isNotEqualTo(Scope.DISTRIBUTED_NO_ACK);
 
     final String regionName = getUniqueName();
     final String key = "KEY";
     final int lastValue = 10;
 
-    VM vm0 = Host.getHost(0).getVM(0);
-    VM vm1 = Host.getHost(0).getVM(1);
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
 
     vm0.invoke("Create region", () -> {
       createRegion(regionName);
@@ -410,13 +461,14 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
 
     vm1.invoke("Set listener", () -> {
       Region<String, Integer> region = getRootRegion().getSubregion(regionName);
-      region.setUserAttribute(new LinkedBlockingQueue());
+      region.setUserAttribute(new LinkedBlockingQueue<Integer>());
 
       region.getAttributesMutator().addCacheListener(new CacheListenerAdapter<String, Integer>() {
         @Override
         public void afterUpdate(EntryEvent<String, Integer> event) {
           Region<String, Integer> region = event.getRegion();
-          LinkedBlockingQueue<Integer> queue = (LinkedBlockingQueue) region.getUserAttribute();
+          @SuppressWarnings("unchecked")
+          BlockingQueue<Integer> queue = (BlockingQueue<Integer>) region.getUserAttribute();
           int value = event.getNewValue();
           try {
             queue.put(value);
@@ -430,11 +482,12 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
 
     AsyncInvocation verify = vm1.invokeAsync("Verify", () -> {
       Region<String, Integer> region = getRootRegion().getSubregion(regionName);
-      LinkedBlockingQueue<Integer> queue = (LinkedBlockingQueue) region.getUserAttribute();
+      @SuppressWarnings("unchecked")
+      BlockingQueue<Integer> queue = (BlockingQueue<Integer>) region.getUserAttribute();
       for (int i = 0; i <= lastValue; i++) {
         try {
           int value = queue.take();
-          assertEquals(i, value);
+          assertThat(value).isEqualTo(i);
         } catch (InterruptedException e) {
           throw new RuntimeException(e);
         }
@@ -456,21 +509,20 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * Tests that doing a distributed get results in a <code>netSearch</code>.
    */
   @Test
-  public void testDistributedGet() throws Exception {
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+  public void testDistributedGet() {
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
     final Object key = "KEY";
     final Object value = "VALUE";
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
 
     vm0.invoke(new CacheSerializableRunnable("Populate region") {
       @Override
       public void run2() throws CacheException {
-        Region region = createRegion(name);
+        Region<Object, Object> region = createRegion(name);
         region.put(key, value);
       }
     });
@@ -478,12 +530,11 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable get = new CacheSerializableRunnable("Distributed get") {
       @Override
       public void run2() throws CacheException {
-        Region region = createRegion(name);
-        assertEquals(value, region.get(key));
+        Region<Object, Object> region = createRegion(name);
+        assertThat(region.get(key)).isEqualTo(value);
       }
     };
 
-
     vm1.invoke(get);
   }
 
@@ -493,7 +544,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    */
   @Test
   public void testDistributedPutNoUpdate() throws Exception {
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
 
@@ -504,9 +555,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
 
     vm0.invoke(create);
     vm1.invoke(create);
@@ -519,7 +569,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Put key/value") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key, value);
       }
     });
@@ -529,13 +579,13 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Verify no update") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         Region.Entry entry = region.getEntry(key);
         if (getRegionAttributes().getDataPolicy().withReplication()
             || getRegionAttributes().getPartitionAttributes() != null) {
-          assertEquals(value, region.get(key));
+          assertThat(region.get(key)).isEqualTo(value);
         } else {
-          assertNull(entry);
+          assertThat(entry).isNull();
         }
       }
     });
@@ -546,15 +596,14 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * first VM updates the entry. The second VM should see the updated value.
    */
   @Test
-  public void testDefinedEntryUpdated() throws Exception {
+  public void testDefinedEntryUpdated() {
     final String name = this.getUniqueName();
     final Object key = "KEY";
     final Object oldValue = "OLD_VALUE";
     final Object newValue = "NEW_VALUE";
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
 
     SerializableRunnable create = new CacheSerializableRunnable("Create Region") {
       @Override
@@ -569,32 +618,33 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Create and populate") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key, oldValue);
       }
     });
     vm1.invoke(new CacheSerializableRunnable("Define entry") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
-        if (!getRegionAttributes().getDataPolicy().withReplication())
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
+        if (!getRegionAttributes().getDataPolicy().withReplication()) {
           region.create(key, null);
+        }
       }
     });
     vm0.invoke(new CacheSerializableRunnable("Update entry") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key, newValue);
       }
     });
-    Invoke.invokeRepeatingIfNecessary(vm1, new CacheSerializableRunnable("Get entry") {
+    vm1.invoke(repeatingIfNecessary(new CacheSerializableRunnable("Get entry") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
-        assertEquals(newValue, region.get(key));
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
+        assertThat(region.get(key)).isEqualTo(newValue);
       }
-    }, getRepeatTimeoutMs());
+    }));
   }
 
 
@@ -603,26 +653,24 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * that entry.
    */
   @Test
-  public void testDistributedDestroy() throws Exception {
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+  public void testDistributedDestroy() {
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
 
     SerializableRunnable create = new CacheSerializableRunnable("Create Region") {
       @Override
       public void run2() throws CacheException {
-        Region region = createRegion(name);
-        assertTrue(!region.isDestroyed());
+        Region<Object, Object> region = createRegion(name);
+        assertThat(region.isDestroyed()).isFalse();
         Region root = region.getParentRegion();
-        assertTrue(!root.isDestroyed());
+        assertThat(root.isDestroyed()).isFalse();
       }
     };
 
-
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
-    VM vm2 = host.getVM(2);
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
+    VM vm2 = VM.getVM(2);
 
     vm0.invoke(create);
     vm1.invoke(create);
@@ -634,10 +682,10 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable put = new CacheSerializableRunnable("Put key/value") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key, value);
-        assertTrue(!region.isDestroyed());
-        assertTrue(!region.getParentRegion().isDestroyed());
+        assertThat(region.isDestroyed()).isFalse();
+        assertThat(region.getParentRegion().isDestroyed()).isFalse();
         flushIfNecessary(region);
       }
     };
@@ -649,11 +697,11 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable verifyPut = new CacheSerializableRunnable("Verify Put") {
       @Override
       public void run2() throws CacheException {
-        Region root = getRootRegion();
-        assertTrue(!root.isDestroyed());
-        Region region = root.getSubregion(name);
-        assertTrue(!region.isDestroyed());
-        assertEquals(value, region.getEntry(key).getValue());
+        Region<?, ?> root = getRootRegion();
+        assertThat(root.isDestroyed()).isFalse();
+        Region<Object, Object> region = root.getSubregion(name);
+        assertThat(region.isDestroyed()).isFalse();
+        assertThat(region.getEntry(key).getValue()).isEqualTo(value);
       }
     };
 
@@ -664,7 +712,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Destroy Entry") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<?, ?> region = getRootRegion().getSubregion(name);
         region.destroy(key);
         flushIfNecessary(region);
       }
@@ -674,11 +722,11 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
         new CacheSerializableRunnable("Verify entry destruction") {
           @Override
           public void run2() throws CacheException {
-            Region root = getRootRegion();
-            assertTrue(!root.isDestroyed());
-            Region region = root.getSubregion(name);
-            assertTrue(!region.isDestroyed());
-            assertNull(region.getEntry(key));
+            Region<?, ?> root = getRootRegion();
+            assertThat(root.isDestroyed()).isFalse();
+            Region<Object, Object> region = root.getSubregion(name);
+            assertThat(region.isDestroyed()).isFalse();
+            assertThat(region.getEntry(key)).isNull();
           }
         };
     vm0.invoke(verifyDestroy);
@@ -691,8 +739,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * that region.
    */
   @Test
-  public void testDistributedRegionDestroy() throws Exception {
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+  public void testDistributedRegionDestroy() {
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
 
@@ -703,54 +751,43 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-    Invoke.invokeInEveryVM(create);
+    invokeInEveryVM(create);
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
+    VM vm0 = VM.getVM(0);
 
     vm0.invoke(new CacheSerializableRunnable("Destroy Region") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.destroyRegion();
         flushIfNecessary(region);
       }
     });
 
-    Invoke.invokeInEveryVM(new CacheSerializableRunnable("Verify region destruction") {
+    invokeInEveryVM(new CacheSerializableRunnable("Verify region destruction") {
       @Override
       public void run2() throws CacheException {
-        WaitCriterion ev = new WaitCriterion() {
-          @Override
-          public boolean done() {
-            return getRootRegion().getSubregion(name) == null;
-          }
-
-          @Override
-          public String description() {
-            return "Waiting for region " + name + " to be destroyed";
-          }
-        };
-        Wait.waitForCriterion(ev, 60 * 1000, 10, true);
-        Region region = getRootRegion().getSubregion(name);
-        assertNull(region);
+        waitAtMost(1, MINUTES).pollInterval(10, MILLISECONDS)
+            .until(() -> getRootRegion().getSubregion(name) == null);
       }
     });
   }
 
   /**
-   * Tests that a {@linkplain Region#localDestroy} does not effect other VMs that define that entry.
+   * Tests that a {@linkplain Region#localDestroy} does not effect other VMs that define that
+   * entry.
    */
   @Test
   public void testLocalDestroy() throws Exception {
-    assumeTrue(supportsLocalDestroyAndLocalInvalidate());
+    assumeThat(supportsLocalDestroyAndLocalInvalidate()).isTrue();
 
     // test not valid for persistBackup region since they have to be
     // mirrored KEYS_VALUES
-    if (getRegionAttributes().getDataPolicy().withPersistence())
+    if (getRegionAttributes().getDataPolicy().withPersistence()) {
       return;
+    }
 
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
 
@@ -761,9 +798,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
 
     vm0.invoke(create);
     vm1.invoke(create);
@@ -776,7 +812,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable put = new CacheSerializableRunnable("Put key/value") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key, value);
       }
     };
@@ -789,7 +825,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Local Destroy Entry") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.localDestroy(key);
       }
     });
@@ -799,8 +835,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable verify = new CacheSerializableRunnable("Verify entry existence") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
-        assertNotNull(region.getEntry(key));
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
+        assertThat(region.getEntry(key)).isNotNull();
       }
     };
     vm1.invoke(verify);
@@ -812,7 +848,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    */
   @Test
   public void testLocalRegionDestroy() throws Exception {
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
 
@@ -823,9 +859,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
 
     vm0.invoke(create);
     vm1.invoke(create);
@@ -835,8 +870,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Local Destroy Region") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
-        region.localDestroyRegion();
+        getRootRegion().getSubregion(name).localDestroyRegion();
       }
     });
 
@@ -845,8 +879,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable verify = new CacheSerializableRunnable("Verify region existence") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
-        assertNotNull(region);
+        assertThat(getRootRegion().getSubregion(name)).isNotNull();
       }
     };
     vm1.invoke(verify);
@@ -857,8 +890,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * define that entry.
    */
   @Test
-  public void testDistributedInvalidate() throws Exception {
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+  public void testDistributedInvalidate() {
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
 
@@ -869,10 +902,9 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
-    VM vm2 = host.getVM(2);
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
+    VM vm2 = VM.getVM(2);
 
     vm0.invoke(create);
     vm1.invoke(create);
@@ -886,7 +918,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable put = new CacheSerializableRunnable("Put key/value") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key, value);
         flushIfNecessary(region);
       }
@@ -899,7 +931,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Invalidate Entry") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.invalidate(key);
         flushIfNecessary(region);
       }
@@ -908,21 +940,19 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     CacheSerializableRunnable verify = new CacheSerializableRunnable("Verify entry invalidation") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         Region.Entry entry = region.getEntry(key);
-        assertNotNull(entry);
+        assertThat(entry).isNotNull();
         if (entry.getValue() != null) {
           // changed from severe to fine because it is possible
           // for this to return non-null on d-no-ack
           // that is was invokeRepeatingIfNecessary is called
-          org.apache.geode.test.dunit.LogWriterUtils.getLogWriter()
-              .fine("invalidated entry has value of " + entry.getValue());
+          logger.debug("invalidated entry has value of " + entry.getValue());
         }
-        assertNull(entry.getValue());
+        assertThat(entry.getValue()).isNull();
       }
     };
 
-
     vm1.invoke(verify);
     vm2.invoke(verify);
   }
@@ -932,8 +962,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * any problems.
    */
   @Test
-  public void testDistributedInvalidate4() throws Exception {
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+  public void testDistributedInvalidate4() {
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
     final Object key = "KEY";
@@ -946,54 +976,53 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-    Host host = Host.getHost(0);
-    int vmCount = host.getVMCount();
+    int vmCount = VM.getVMCount();
     for (int i = 0; i < vmCount; i++) {
-      VM vm = host.getVM(i);
-      vm.invoke(create);
+      VM vm0 = VM.getVM(i);
+      vm0.invoke(create);
     }
 
     SerializableRunnable put = new CacheSerializableRunnable("put entry") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key, value);
         flushIfNecessary(region);
       }
     };
 
     for (int i = 0; i < vmCount; i++) {
-      VM vm = host.getVM(i);
+      VM vm = VM.getVM(i);
       vm.invoke(put);
     }
 
     SerializableRunnable invalidate = new CacheSerializableRunnable("Invalidate Entry") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.invalidate(key);
         flushIfNecessary(region);
       }
     };
 
     for (int i = 0; i < vmCount; i++) {
-      VM vm = host.getVM(i);
+      VM vm = VM.getVM(i);
       vm.invoke(invalidate);
     }
 
     SerializableRunnable verify = new CacheSerializableRunnable("Verify entry invalidation") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         Region.Entry entry = region.getEntry(key);
-        assertNotNull(entry);
-        assertNull(entry.getValue());
+        assertThat(entry).isNotNull();
+        assertThat(entry.getValue()).isNull();
       }
     };
 
     for (int i = 0; i < vmCount; i++) {
-      VM vm = host.getVM(i);
-      vm.invoke(verify);
+      VM vm0 = VM.getVM(i);
+      vm0.invoke(verify);
     }
   }
 
@@ -1002,8 +1031,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * that define that entry.
    */
   @Test
-  public void testDistributedRegionInvalidate() throws Exception {
-    assumeTrue(supportsSubregions());
+  public void testDistributedRegionInvalidate() {
+    assumeThat(supportsSubregions()).isTrue();
 
     final String name = this.getUniqueName();
     final String subname = "sub";
@@ -1020,7 +1049,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-    Invoke.invokeInEveryVM(create);
+    invokeInEveryVM(create);
 
     final Object key = "KEY";
     final Object value = "VALUE";
@@ -1030,13 +1059,13 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable put = new CacheSerializableRunnable("Put key/value") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key, value);
         region.put(key2, value2);
         flushIfNecessary(region);
 
         if (useSubs) {
-          Region subregion = region.getSubregion(subname);
+          Region<Object, Object> subregion = region.getSubregion(subname);
           subregion.put(key, value);
           subregion.put(key2, value2);
           flushIfNecessary(subregion);
@@ -1044,56 +1073,53 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-    Invoke.invokeInEveryVM(put);
+    invokeInEveryVM(put);
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
+    final VM vm0 = VM.getVM(0);
 
     vm0.invoke(new CacheSerializableRunnable("Invalidate Region") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.invalidateRegion();
       }
     });
 
     CacheSerializableRunnable verify = new CacheSerializableRunnable("Verify region invalidation") {
       @Override
-      public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
-        {
-          Region.Entry entry = region.getEntry(key);
-          assertNotNull(entry);
-          Object v = entry.getValue();
-          assertNull("Expected null but was " + v, v);
+      public void run2() {
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
+        Region.Entry<Object, Object> entry = region.getEntry(key);
+        assertThat(entry).isNotNull();
+        Object v = entry.getValue();
+        assertThat(v).isNull();
 
-          entry = region.getEntry(key2);
-          assertNotNull(entry);
-          assertNull(entry.getValue());
-        }
+        entry = region.getEntry(key2);
+        assertThat(entry).isNotNull();
+        assertThat(entry.getValue()).isNull();
 
         if (useSubs) {
-          Region subregion = region.getSubregion(subname);
-          Region.Entry entry = subregion.getEntry(key);
-          assertNotNull(entry);
-          assertNull(entry.getValue());
+          Region<Object, Object> subregion = region.getSubregion(subname);
+          entry = subregion.getEntry(key);
+          assertThat(entry).isNotNull();
+          assertThat(entry.getValue()).isNull();
 
           entry = subregion.getEntry(key2);
-          assertNotNull(entry);
-          assertNull(entry.getValue());
+          assertThat(entry).isNotNull();
+          assertThat(entry.getValue()).isNull();
         }
       }
     };
 
-    Invoke.invokeInEveryVMRepeatingIfNecessary(verify, getRepeatTimeoutMs());
+    invokeInEveryVM(repeatingIfNecessary(verify));
   }
 
   /**
    * Tests that a {@link CacheListener} is invoked in a remote VM.
    */
   @Test
-  public void testRemoteCacheListener() throws Exception {
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+  public void testRemoteCacheListener() {
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
     final Object key = "KEY";
@@ -1105,14 +1131,13 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable populate = new CacheSerializableRunnable("Create Region and Put") {
       @Override
       public void run2() throws CacheException {
-        Region region = createRegion(name);
+        Region<Object, Object> region = createRegion(name);
         region.put(key, oldValue);
       }
     };
 
-    Host host = Host.getHost(0);
-    final VM vm0 = host.getVM(0);
-    final VM vm1 = host.getVM(1);
+    final VM vm0 = VM.getVM(0);
+    final VM vm1 = VM.getVM(1);
 
     vm0.invoke(populate);
     vm1.invoke(populate);
@@ -1120,40 +1145,40 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Set listener") {
       @Override
       public void run2() throws CacheException {
-        final Region region = getRootRegion().getSubregion(name);
-        listener = new TestCacheListener() {
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
+        setListener(new TestCacheListener<Object, Object>() {
           @Override
-          public void afterUpdate2(EntryEvent event) {
-            assertEquals(Operation.UPDATE, event.getOperation());
-            assertEquals(region, event.getRegion());
-            assertTrue(event.getOperation().isDistributed());
-            assertFalse(event.getOperation().isExpiration());
-            assertTrue(event.isOriginRemote());
-            assertEquals(event.getCallbackArgument(), event.getDistributedMember());
-            assertEquals(key, event.getKey());
-            assertEquals(oldValue, event.getOldValue());
-            assertEquals(newValue, event.getNewValue());
-            assertFalse(event.getOperation().isLoad());
-            assertFalse(event.getOperation().isLocalLoad());
-            assertFalse(event.getOperation().isNetLoad());
-            assertFalse(event.getOperation().isNetSearch());
+          public void afterUpdate2(EntryEvent<Object, Object> event) {
+            assertThat(event.getOperation()).isEqualTo(Operation.UPDATE);
+            assertThat(event.getRegion()).isEqualTo(region);
+            assertThat(event.getOperation().isDistributed()).isTrue();
+            assertThat(event.getOperation().isExpiration()).isFalse();
+            assertThat(event.isOriginRemote()).isTrue();
+            assertThat(event.getDistributedMember()).isEqualTo(event.getCallbackArgument());
+            assertThat(event.getKey()).isEqualTo(key);
+            assertThat(event.getOldValue()).isEqualTo(oldValue);
+            assertThat(event.getNewValue()).isEqualTo(newValue);
+            assertThat(event.getOperation().isLoad()).isFalse();
+            assertThat(event.getOperation().isLocalLoad()).isFalse();
+            assertThat(event.getOperation().isNetLoad()).isFalse();
+            assertThat(event.getOperation().isNetSearch()).isFalse();
             if (event.getRegion().getAttributes().getOffHeap()) {
               // since off heap always serializes the old value is serialized and available
-              assertEquals(oldValue, event.getSerializedOldValue().getDeserializedValue());
+              assertThat(event.getSerializedOldValue().getDeserializedValue()).isEqualTo(oldValue);
             } else {
-              assertEquals(null, event.getSerializedOldValue()); // since it was put originally in
-                                                                 // this VM
+              assertThat(event.getSerializedOldValue()).isNull(); // since it was put originally in
+              // this VM
             }
             DataInputStream dis = new DataInputStream(
                 new ByteArrayInputStream(event.getSerializedNewValue().getSerializedValue()));
             try {
-              assertEquals(newValue, DataSerializer.readObject(dis));
+              assertThat(DataSerializer.<Object>readObject(dis)).isEqualTo(newValue);
             } catch (Exception e) {
               fail("Unexpected Exception", e);
             }
           }
-        };
-        region.getAttributesMutator().addCacheListener(listener);
+        });
+        region.getAttributesMutator().addCacheListener(listener());
       }
     });
 
@@ -1170,7 +1195,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Update") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key, newValue, getSystem().getDistributedMember());
       }
     });
@@ -1178,44 +1203,44 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Verify Update") {
       @Override
       public void run2() throws CacheException {
-        listener.waitForInvocation(3000, 10);
+        listener().waitForInvocation(3000, 10);
 
         // Setup listener for next test
-        final Region region = getRootRegion().getSubregion(name);
-        listener = new TestCacheListener() {
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
+        setListener(new TestCacheListener<Object, Object>() {
           @Override
-          public void afterInvalidate2(EntryEvent event) {
-            assertEquals(Operation.INVALIDATE, event.getOperation());
-            assertEquals(region, event.getRegion());
-            assertTrue(event.getOperation().isDistributed());
-            assertFalse(event.getOperation().isExpiration());
-            assertTrue(event.isOriginRemote());
-            assertEquals(event.getCallbackArgument(), event.getDistributedMember());
-            assertEquals(key, event.getKey());
-            assertEquals(newValue, event.getOldValue());
-            assertNull(event.getNewValue());
-            assertFalse(event.getOperation().isLoad());
-            assertFalse(event.getOperation().isLocalLoad());
-            assertFalse(event.getOperation().isNetLoad());
-            assertFalse(event.getOperation().isNetSearch());
-            assertNull(event.getSerializedNewValue());
+          public void afterInvalidate2(EntryEvent<Object, Object> event) {
+            assertThat(event.getOperation()).isEqualTo(Operation.INVALIDATE);
+            assertThat(event.getRegion()).isEqualTo(region);
+            assertThat(event.getOperation().isDistributed()).isTrue();
+            assertThat(event.getOperation().isExpiration()).isFalse();
+            assertThat(event.isOriginRemote()).isTrue();
+            assertThat(event.getDistributedMember()).isEqualTo(event.getCallbackArgument());
+            assertThat(event.getKey()).isEqualTo(key);
+            assertThat(event.getOldValue()).isEqualTo(newValue);
+            assertThat(event.getNewValue()).isNull();
+            assertThat(event.getOperation().isLoad()).isFalse();
+            assertThat(event.getOperation().isLocalLoad()).isFalse();
+            assertThat(event.getOperation().isNetLoad()).isFalse();
+            assertThat(event.getOperation().isNetSearch()).isFalse();
+            assertThat(event.getSerializedNewValue()).isNull();
             DataInputStream dis = new DataInputStream(
                 new ByteArrayInputStream(event.getSerializedOldValue().getSerializedValue()));
             try {
-              assertEquals(newValue, DataSerializer.readObject(dis));
+              assertThat(DataSerializer.<Object>readObject(dis)).isEqualTo(newValue);
             } catch (Exception e) {
               fail("Unexpected Exception", e);
             }
           }
-        };
-        region.getAttributesMutator().addCacheListener(listener);
+        });
+        region.getAttributesMutator().addCacheListener(listener());
       }
     });
 
     vm0.invoke(new CacheSerializableRunnable("Invalidate") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.invalidate(key, getSystem().getDistributedMember());
       }
     });
@@ -1223,38 +1248,38 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Verify Invalidate") {
       @Override
       public void run2() throws CacheException {
-        listener.waitForInvocation(3000, 10);
+        listener().waitForInvocation(3000, 10);
 
         // Setup listener for next test
-        final Region region = getRootRegion().getSubregion(name);
-        listener = new TestCacheListener() {
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
+        setListener(new TestCacheListener<Object, Object>() {
           @Override
-          public void afterDestroy2(EntryEvent event) {
-            assertTrue(event.getOperation().isDestroy());
-            assertEquals(region, event.getRegion());
-            assertTrue(event.getOperation().isDistributed());
-            assertFalse(event.getOperation().isExpiration());
-            assertTrue(event.isOriginRemote());
-            assertEquals(event.getCallbackArgument(), event.getDistributedMember());
-            assertEquals(key, event.getKey());
-            assertNull(event.getOldValue());
-            assertNull(event.getNewValue());
-            assertFalse(event.getOperation().isLoad());
-            assertFalse(event.getOperation().isLocalLoad());
-            assertFalse(event.getOperation().isNetLoad());
-            assertFalse(event.getOperation().isNetSearch());
-            assertNull(event.getSerializedOldValue());
-            assertNull(event.getSerializedNewValue());
+          public void afterDestroy2(EntryEvent<Object, Object> event) {
+            assertThat(event.getOperation().isDestroy()).isTrue();
+            assertThat(event.getRegion()).isEqualTo(region);
+            assertThat(event.getOperation().isDistributed()).isTrue();
+            assertThat(event.getOperation().isExpiration()).isFalse();
+            assertThat(event.isOriginRemote()).isTrue();
+            assertThat(event.getDistributedMember()).isEqualTo(event.getCallbackArgument());
+            assertThat(event.getKey()).isEqualTo(key);
+            assertThat(event.getOldValue()).isNull();
+            assertThat(event.getNewValue()).isNull();
+            assertThat(event.getOperation().isLoad()).isFalse();
+            assertThat(event.getOperation().isLocalLoad()).isFalse();
+            assertThat(event.getOperation().isNetLoad()).isFalse();
+            assertThat(event.getOperation().isNetSearch()).isFalse();
+            assertThat(event.getSerializedOldValue()).isNull();
+            assertThat(event.getSerializedNewValue()).isNull();
           }
-        };
-        region.getAttributesMutator().addCacheListener(listener);
+        });
+        region.getAttributesMutator().addCacheListener(listener());
       }
     });
 
     vm0.invoke(new CacheSerializableRunnable("Destroy") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.destroy(key, getSystem().getDistributedMember());
       }
     });
@@ -1262,29 +1287,29 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Verify Destroy") {
       @Override
       public void run2() throws CacheException {
-        listener.waitForInvocation(3000, 10);
+        listener().waitForInvocation(3000, 10);
 
         // Setup listener for next test
-        final Region region = getRootRegion().getSubregion(name);
-        listener = new TestCacheListener() {
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
+        setListener(new TestCacheListener<Object, Object>() {
           @Override
-          public void afterRegionInvalidate2(RegionEvent event) {
-            assertEquals(Operation.REGION_INVALIDATE, event.getOperation());
-            assertEquals(region, event.getRegion());
-            assertTrue(event.getOperation().isDistributed());
-            assertFalse(event.getOperation().isExpiration());
-            assertTrue(event.isOriginRemote());
-            assertEquals(event.getCallbackArgument(), event.getDistributedMember());
+          public void afterRegionInvalidate2(RegionEvent<Object, Object> event) {
+            assertThat(event.getOperation()).isEqualTo(Operation.REGION_INVALIDATE);
+            assertThat(event.getRegion()).isEqualTo(region);
+            assertThat(event.getOperation().isDistributed()).isTrue();
+            assertThat(event.getOperation().isExpiration()).isFalse();
+            assertThat(event.isOriginRemote()).isTrue();
+            assertThat(event.getDistributedMember()).isEqualTo(event.getCallbackArgument());
           }
-        };
-        region.getAttributesMutator().addCacheListener(listener);
+        });
+        region.getAttributesMutator().addCacheListener(listener());
       }
     });
 
     vm0.invoke(new CacheSerializableRunnable("Invalidate Region") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.invalidateRegion(getSystem().getDistributedMember());
       }
     });
@@ -1292,29 +1317,29 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Verify Invalidate Region") {
       @Override
       public void run2() throws CacheException {
-        listener.waitForInvocation(3000, 10);
+        listener().waitForInvocation(3000, 10);
 
         // Setup listener for next test
-        final Region region = getRootRegion().getSubregion(name);
-        listener = new TestCacheListener() {
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
+        setListener(new TestCacheListener<Object, Object>() {
           @Override
-          public void afterRegionDestroy2(RegionEvent event) {
-            assertEquals(Operation.REGION_DESTROY, event.getOperation());
-            assertEquals(region, event.getRegion());
-            assertTrue(event.getOperation().isDistributed());
-            assertFalse(event.getOperation().isExpiration());
-            assertTrue(event.isOriginRemote());
-            assertEquals(event.getCallbackArgument(), event.getDistributedMember());
+          public void afterRegionDestroy2(RegionEvent<Object, Object> event) {
+            assertThat(event.getOperation()).isEqualTo(Operation.REGION_DESTROY);
+            assertThat(event.getRegion()).isEqualTo(region);
+            assertThat(event.getOperation().isDistributed()).isTrue();
+            assertThat(event.getOperation().isExpiration()).isFalse();
+            assertThat(event.isOriginRemote()).isTrue();
+            assertThat(event.getDistributedMember()).isEqualTo(event.getCallbackArgument());
           }
-        };
-        region.getAttributesMutator().addCacheListener(listener);
+        });
+        region.getAttributesMutator().addCacheListener(listener());
       }
     });
 
     vm0.invoke(new CacheSerializableRunnable("Destroy Region") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.destroyRegion(getSystem().getDistributedMember());
       }
     });
@@ -1322,7 +1347,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Verify Destroy Region") {
       @Override
       public void run2() throws CacheException {
-        listener.waitForInvocation(3000, 10);
+        listener().waitForInvocation(3000, 10);
       }
     });
   }
@@ -1331,10 +1356,10 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * Tests that a {@link CacheListener} is invoked in a remote VM.
    */
   @Test
-  public void testRemoteCacheListenerInSubregion() throws Exception {
-    assumeTrue(supportsSubregions());
+  public void testRemoteCacheListenerInSubregion() {
+    assumeThat(supportsSubregions()).isTrue();
 
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
 
@@ -1345,9 +1370,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-    Host host = Host.getHost(0);
-    final VM vm0 = host.getVM(0);
-    final VM vm1 = host.getVM(1);
+    final VM vm0 = VM.getVM(0);
+    final VM vm1 = VM.getVM(1);
 
     vm0.invoke(new CacheSerializableRunnable("Create Root") {
       @Override
@@ -1361,19 +1385,19 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Set listener") {
       @Override
       public void run2() throws CacheException {
-        final Region region = getRootRegion().getSubregion(name);
-        listener = new TestCacheListener() {
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
+        setListener(new TestCacheListener<Object, Object>() {
           @Override
-          public void afterRegionInvalidate2(RegionEvent event) {
-            assertEquals(Operation.REGION_INVALIDATE, event.getOperation());
-            assertEquals(region, event.getRegion());
-            assertTrue(event.getOperation().isDistributed());
-            assertFalse(event.getOperation().isExpiration());
-            assertTrue(event.isOriginRemote());
-            assertEquals(event.getCallbackArgument(), event.getDistributedMember());
+          public void afterRegionInvalidate2(RegionEvent<Object, Object> event) {
+            assertThat(event.getOperation()).isEqualTo(Operation.REGION_INVALIDATE);
+            assertThat(event.getRegion()).isEqualTo(region);
+            assertThat(event.getOperation().isDistributed()).isTrue();
+            assertThat(event.getOperation().isExpiration()).isFalse();
+            assertThat(event.isOriginRemote()).isTrue();
+            assertThat(event.getDistributedMember()).isEqualTo(event.getCallbackArgument());
           }
-        };
-        region.getAttributesMutator().addCacheListener(listener);
+        });
+        region.getAttributesMutator().addCacheListener(listener());
       }
     });
 
@@ -1387,22 +1411,22 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Verify Invalidate Region") {
       @Override
       public void run2() throws CacheException {
-        listener.waitForInvocation(3000, 10);
+        listener().waitForInvocation(3000, 10);
 
         // Setup listener for next test
-        final Region region = getRootRegion().getSubregion(name);
-        listener = new TestCacheListener() {
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
+        setListener(new TestCacheListener<Object, Object>() {
           @Override
-          public void afterRegionDestroy2(RegionEvent event) {
-            assertEquals(Operation.REGION_DESTROY, event.getOperation());
-            assertEquals(region, event.getRegion());
-            assertTrue(event.getOperation().isDistributed());
-            assertFalse(event.getOperation().isExpiration());
-            assertTrue(event.isOriginRemote());
-            assertEquals(event.getCallbackArgument(), event.getDistributedMember());
+          public void afterRegionDestroy2(RegionEvent<Object, Object> event) {
+            assertThat(event.getOperation()).isEqualTo(Operation.REGION_DESTROY);
+            assertThat(event.getRegion()).isEqualTo(region);
+            assertThat(event.getOperation().isDistributed()).isTrue();
+            assertThat(event.getOperation().isExpiration()).isFalse();
+            assertThat(event.isOriginRemote()).isTrue();
+            assertThat(event.getDistributedMember()).isEqualTo(event.getCallbackArgument());
           }
-        };
-        region.getAttributesMutator().addCacheListener(listener);
+        });
+        region.getAttributesMutator().addCacheListener(listener());
       }
     });
 
@@ -1416,7 +1440,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Verify Destroy Region") {
       @Override
       public void run2() throws CacheException {
-        listener.waitForInvocation(3000, 10);
+        listener().waitForInvocation(3000, 10);
       }
     });
   }
@@ -1436,10 +1460,10 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * <code>netLoad</code>.
    */
   @Test
-  public void testRemoteCacheLoader() throws Exception {
-    assumeTrue(supportsNetLoad());
+  public void testRemoteCacheLoader() {
+    assumeThat(supportsNetLoad()).isTrue();
 
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
     final Object key = "KEY";
@@ -1452,45 +1476,42 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
+    final VM vm0 = VM.getVM(0);
+    final VM vm1 = VM.getVM(1);
 
     vm0.invoke(create);
     vm1.invoke(create);
 
-
     vm1.invoke(new CacheSerializableRunnable("Set CacheLoader") {
       @Override
       public void run2() throws CacheException {
-        final Region region = getRootRegion().getSubregion(name);
-        loader = new TestCacheLoader() {
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
+        setLoader(new TestCacheLoader<Object, Object>() {
           @Override
-          public Object load2(LoaderHelper helper) throws CacheLoaderException {
-            assertEquals(region, helper.getRegion());
-            assertEquals(key, helper.getKey());
-            assertNull(helper.getArgument());
+          public Object load2(LoaderHelper<Object, Object> helper) throws CacheLoaderException {
+            assertThat(helper.getRegion()).isEqualTo(region);
+            assertThat(helper.getKey()).isEqualTo(key);
+            assertThat(helper.getArgument()).isNull();
 
             return value;
           }
-        };
-        region.getAttributesMutator().setCacheLoader(loader);
+        });
+        region.getAttributesMutator().setCacheLoader(loader());
       }
     });
 
     vm0.invoke(new CacheSerializableRunnable("Remote load") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
-        assertEquals(value, region.get(key));
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
+        assertThat(region.get(key)).isEqualTo(value);
       }
     });
 
     vm1.invoke(new SerializableRunnable("Verify loader") {
       @Override
       public void run() {
-        assertTrue(loader.wasInvoked());
+        assertThat(loader().wasInvoked()).isTrue();
       }
     });
   }
@@ -1499,10 +1520,10 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * Tests that the parameter passed to a remote {@link CacheLoader} is actually passed.
    */
   @Test
-  public void testRemoteCacheLoaderArg() throws Exception {
-    assumeTrue(supportsNetLoad());
+  public void testRemoteCacheLoaderArg() {
+    assumeThat(supportsNetLoad()).isTrue();
 
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
     final Object key = "KEY";
@@ -1520,10 +1541,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
+    final VM vm0 = VM.getVM(0);
+    final VM vm1 = VM.getVM(1);
 
     vm0.invoke(create);
     vm1.invoke(create);
@@ -1531,18 +1550,18 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Set CacheLoader") {
       @Override
       public void run2() throws CacheException {
-        final Region region = getRootRegion().getSubregion(name);
-        loader = new TestCacheLoader() {
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
+        setLoader(new TestCacheLoader<Object, Object>() {
           @Override
-          public Object load2(LoaderHelper helper) throws CacheLoaderException {
-            assertEquals(region, helper.getRegion());
-            assertEquals(key, helper.getKey());
-            assertEquals(arg, helper.getArgument());
+          public Object load2(LoaderHelper<Object, Object> helper) throws CacheLoaderException {
+            assertThat(helper.getRegion()).isEqualTo(region);
+            assertThat(helper.getKey()).isEqualTo(key);
+            assertThat(helper.getArgument()).isEqualTo(arg);
 
             return value;
           }
-        };
-        region.getAttributesMutator().setCacheLoader(loader);
+        });
+        region.getAttributesMutator().setCacheLoader(loader());
         flushIfNecessary(region);
       }
     });
@@ -1550,7 +1569,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Remote load") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
 
         try {
           // Use a non-serializable arg object
@@ -1560,10 +1579,10 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
         } catch (IllegalArgumentException ex) {
           // pass...
         }
-        assertNull(region.getEntry(key));
+        assertThat(region.getEntry(key)).isNull();
         try {
-          assertEquals(value, region.get(key, arg));
-        } catch (IllegalArgumentException e) {
+          assertThat(region.get(key, arg)).isEqualTo(value);
+        } catch (IllegalArgumentException ignored) {
         }
       }
     });
@@ -1571,7 +1590,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new SerializableRunnable("Verify loader") {
       @Override
       public void run() {
-        assertTrue(loader.wasInvoked());
+        assertThat(loader().wasInvoked()).isTrue();
       }
     });
   }
@@ -1581,10 +1600,10 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * propagated back to the caller.
    */
   @Test
-  public void testRemoteCacheLoaderException() throws Exception {
-    assumeTrue(supportsNetLoad());
+  public void testRemoteCacheLoaderException() {
+    assumeThat(supportsNetLoad()).isTrue();
 
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
     final Object key = "KEY";
@@ -1596,9 +1615,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
+    final VM vm0 = VM.getVM(0);
+    final VM vm1 = VM.getVM(1);
 
     vm0.invoke(create);
     vm1.invoke(create);
@@ -1606,19 +1624,19 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Set CacheLoader") {
       @Override
       public void run2() throws CacheException {
-        final Region region = getRootRegion().getSubregion(name);
-        loader = new TestCacheLoader() {
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
+        setLoader(new TestCacheLoader<Object, Object>() {
           @Override
-          public Object load2(LoaderHelper helper) throws CacheLoaderException {
-            assertEquals(region, helper.getRegion());
-            assertEquals(key, helper.getKey());
-            assertNull(helper.getArgument());
+          public Object load2(LoaderHelper<Object, Object> helper) throws CacheLoaderException {
+            assertThat(helper.getRegion()).isEqualTo(region);
+            assertThat(helper.getKey()).isEqualTo(key);
+            assertThat(helper.getArgument()).isNull();
 
             String s = "Test Exception";
             throw new CacheLoaderException(s);
           }
-        };
-        region.getAttributesMutator().setCacheLoader(loader);
+        });
+        region.getAttributesMutator().setCacheLoader(loader());
         flushIfNecessary(region);
       }
     });
@@ -1626,7 +1644,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Remote load") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         try {
           region.get(key);
           fail("Should have thrown a CacheLoaderException");
@@ -1640,47 +1658,46 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new SerializableRunnable("Verify loader") {
       @Override
       public void run() {
-        assertTrue(loader.wasInvoked());
+        assertThat(loader().wasInvoked()).isTrue();
       }
     });
   }
 
   @Test
-  public void testCacheLoaderWithNetSearch() throws Exception {
-    assumeTrue(supportsNetLoad());
+  public void testCacheLoaderWithNetSearch() {
+    assumeThat(supportsNetLoad()).isTrue();
 
     // some tests use mirroring by default (e.g. persistBackup regions)
     // if so, then this test won't work right
-    assumeFalse(getRegionAttributes().getDataPolicy().withReplication());
-    assumeFalse(getRegionAttributes().getDataPolicy().isPreloaded());
+    assumeThat(getRegionAttributes().getDataPolicy().withReplication()).isFalse();
+    assumeThat(getRegionAttributes().getDataPolicy().withPreloaded()).isFalse();
 
     final String name = this.getUniqueName();
     final Object key = this.getUniqueName();
-    final Object value = new Integer(42);
+    final Object value = 42;
 
-    Host host = Host.getHost(0);
     // use vm on other gemfire system
-    VM vm1 = host.getVM(1);
+    VM vm1 = VM.getVM(1);
     vm1.invoke(new CacheSerializableRunnable("set remote value") {
       @Override
       public void run2() throws CacheException {
-        Region rgn = createRegion(name);
+        Region<Object, Object> rgn = createRegion(name);
         rgn.put(key, value);
         flushIfNecessary(rgn);
       }
     });
 
-    final TestCacheLoader loader1 = new TestCacheLoader() {
+    final TestCacheLoader<Object, Object> loader1 = new TestCacheLoader<Object, Object>() {
       @Override
-      public Object load2(LoaderHelper helper) throws CacheLoaderException {
+      public Object load2(LoaderHelper<Object, Object> helper) throws CacheLoaderException {
 
-        assertEquals(key, helper.getKey());
-        assertEquals(name, helper.getRegion().getName());
+        assertThat(helper.getKey()).isEqualTo(key);
+        assertThat(helper.getRegion().getName()).isEqualTo(name);
 
         try {
           helper.getRegion().getAttributes();
           Object result = helper.netSearch(false);
-          assertEquals(value, result);
+          assertThat(result).isEqualTo(value);
           return result;
         } catch (TimeoutException ex) {
           fail("Why did I time out?", ex);
@@ -1689,85 +1706,83 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-    AttributesFactory f = new AttributesFactory(getRegionAttributes());
+    AttributesFactory<Object, Object> f = new AttributesFactory<>(getRegionAttributes());
     f.setCacheLoader(loader1);
-    Region region = createRegion(name, f.create());
+    Region<Object, Object> region = createRegion(name, f.create());
 
     loader1.wasInvoked();
 
     Region.Entry entry = region.getEntry(key);
-    assertNull(entry);
+    assertThat(entry).isNull();
     region.create(key, null);
 
     entry = region.getEntry(key);
-    assertNotNull(entry);
-    assertNull(entry.getValue());
+    assertThat(entry).isNotNull();
+    assertThat(entry.getValue()).isNull();
 
     // make sure value is still there in vm1
     vm1.invoke(new CacheSerializableRunnable("verify remote value") {
       @Override
       public void run2() throws CacheException {
         Region rgn = getRootRegion().getSubregion(name);
-        assertEquals(value, rgn.getEntry(key).getValue());
+        assertThat(rgn.getEntry(key).getValue()).isEqualTo(value);
       }
     });
 
-    assertEquals(value, region.get(key));
+    assertThat(region.get(key)).isEqualTo(value);
     // if global scope, then a netSearch is done BEFORE the loader is invoked,
     // so we get the value but the loader is never invoked.
     if (region.getAttributes().getScope().isGlobal()) {
-      assertTrue(!loader1.wasInvoked());
+      assertThat(loader1.wasInvoked()).isFalse();
     } else {
-      assertTrue(loader1.wasInvoked());
+      assertThat(loader1.wasInvoked()).isTrue();
     }
-    assertEquals(value, region.getEntry(key).getValue());
+    assertThat(region.getEntry(key).getValue()).isEqualTo(value);
   }
 
   @Test
-  public void testCacheLoaderWithNetLoad() throws Exception {
+  public void testCacheLoaderWithNetLoad() {
     // replicated regions and partitioned regions make no sense for this
     // test
-    assumeFalse(getRegionAttributes().getDataPolicy().withReplication());
-    assumeFalse(getRegionAttributes().getDataPolicy().isPreloaded());
-    assumeTrue(getRegionAttributes().getPartitionAttributes() == null);
+    assumeThat(getRegionAttributes().getDataPolicy().withReplication()).isFalse();
+    assumeThat(getRegionAttributes().getDataPolicy().withPreloaded()).isFalse();
+    assumeThat(getRegionAttributes().getPartitionAttributes())
+        .withFailMessage("the region has partition attributes").isNull();
 
     final String name = this.getUniqueName();
     final Object key = this.getUniqueName();
-    final Object value = new Integer(42);
+    final Object value = 42;
 
-    Host host = Host.getHost(0);
-    // use vm on other gemfire system
-    VM vm1 = host.getVM(1);
+    final VM vm1 = VM.getVM(1);
     vm1.invoke(new CacheSerializableRunnable("set up remote loader") {
       @Override
       public void run2() throws CacheException {
-        final TestCacheLoader remoteloader = new TestCacheLoader() {
+        final TestCacheLoader<Object, Object> remoteloader = new TestCacheLoader<Object, Object>() {
           @Override
-          public Object load2(LoaderHelper helper) throws CacheLoaderException {
-
-            assertEquals(key, helper.getKey());
-            assertEquals(name, helper.getRegion().getName());
+          public Object load2(LoaderHelper<Object, Object> helper) throws CacheLoaderException {
+            assertThat(helper.getKey()).isEqualTo(key);
+            assertThat(helper.getRegion().getName()).isEqualTo(name);
             return value;
           }
         };
 
-        AttributesFactory factory = new AttributesFactory(getRegionAttributes());
+        AttributesFactory<Object, Object> factory = new AttributesFactory<>(getRegionAttributes());
         factory.setCacheLoader(remoteloader);
         createRegion(name, factory.create());
       }
     });
 
-    final TestCacheLoader loader1 = new TestCacheLoader() {
+    final TestCacheLoader<Object, Object> loader1 = new TestCacheLoader<Object, Object>() {
       @Override
-      public Object load2(LoaderHelper helper) throws CacheLoaderException {
+      public Object load2(LoaderHelper<Object, Object> helper) throws CacheLoaderException {
 
-        assertEquals(key, helper.getKey());
-        assertEquals(name, helper.getRegion().getName());
+        assertThat(helper.getKey()).isEqualTo(key);
+        assertThat(helper.getRegion().getName()).isEqualTo(name);
 
         try {
           helper.getRegion().getAttributes();
           Object result = helper.netSearch(true);
-          assertEquals(value, result);
+          assertThat(result).isEqualTo(value);
           return result;
         } catch (TimeoutException ex) {
           fail("Why did I time out?", ex);
@@ -1776,25 +1791,25 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-    AttributesFactory f = new AttributesFactory(getRegionAttributes());
+    AttributesFactory<Object, Object> f = new AttributesFactory<>(getRegionAttributes());
     f.setCacheLoader(loader1);
-    Region region = createRegion(name, f.create());
+    Region<Object, Object> region = createRegion(name, f.create());
 
     loader1.wasInvoked();
 
     Region.Entry entry = region.getEntry(key);
-    assertNull(entry);
+    assertThat(entry).isNull();
 
     region.create(key, null);
 
     entry = region.getEntry(key);
-    assertNotNull(entry);
-    assertNull(entry.getValue());
+    assertThat(entry).isNotNull();
+    assertThat(entry.getValue()).isNull();
 
-    assertEquals(value, region.get(key));
+    assertThat(region.get(key)).isEqualTo(value);
 
-    assertTrue(loader1.wasInvoked());
-    assertEquals(value, region.getEntry(key).getValue());
+    assertThat(loader1.wasInvoked()).isTrue();
+    assertThat(region.getEntry(key).getValue()).isEqualTo(value);
   }
 
 
@@ -1802,8 +1817,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * Tests that {@link Region#get} returns <code>null</code> when there is no remote loader.
    */
   @Test
-  public void testNoRemoteCacheLoader() throws Exception {
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+  public void testNoRemoteCacheLoader() {
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
     final Object key = "KEY";
@@ -1814,9 +1829,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
         createRegion(name);
       }
     };
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
+    final VM vm0 = VM.getVM(0);
+    final VM vm1 = VM.getVM(1);
 
     vm0.invoke(create);
     vm1.invoke(create);
@@ -1824,8 +1838,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Remote load") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
-        assertNull(region.get(key));
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
+        assertThat(region.get(key)).isNull();
       }
     });
   }
@@ -1835,8 +1849,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * entry (that is, a key, but no value).
    */
   @Test
-  public void testNoLoaderWithInvalidEntry() throws Exception {
-    assumeTrue(supportsNetLoad());
+  public void testNoLoaderWithInvalidEntry() {
+    assumeThat(supportsNetLoad()).isTrue();
 
     final String name = this.getUniqueName();
     final Object key = "KEY";
@@ -1845,22 +1859,20 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable create = new CacheSerializableRunnable("Create Region") {
       @Override
       public void run2() throws CacheException {
-        Region region = createRegion(name);
-        loader = new TestCacheLoader() {
+        Region<Object, Object> region = createRegion(name);
+        setLoader(new TestCacheLoader<Object, Object>() {
           @Override
-          public Object load2(LoaderHelper helper) throws CacheLoaderException {
+          public Object load2(LoaderHelper<Object, Object> helper) throws CacheLoaderException {
 
             return value;
           }
-        };
-        region.getAttributesMutator().setCacheLoader(loader);
+        });
+        region.getAttributesMutator().setCacheLoader(loader());
       }
     };
 
-
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
+    final VM vm0 = VM.getVM(0);
+    final VM vm1 = VM.getVM(1);
 
     vm0.invoke(create);
     vm1.invoke(create);
@@ -1868,7 +1880,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Create invalid entry") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.create(key, null);
       }
     });
@@ -1876,16 +1888,16 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Remote get") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
-        assertEquals(value, region.get(key));
-        assertTrue(loader.wasInvoked());
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
+        assertThat(region.get(key)).isEqualTo(value);
+        assertThat(loader().wasInvoked()).isTrue();
       }
     });
 
     vm1.invoke(new SerializableRunnable("Verify loader") {
       @Override
       public void run() {
-        assertFalse(loader.wasInvoked());
+        assertThat(loader().wasInvoked()).isFalse();
       }
     });
   }
@@ -1895,8 +1907,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * and {@link CacheWriterException}s are propagated appropriately.
    */
   @Test
-  public void testRemoteCacheWriter() throws Exception {
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+  public void testRemoteCacheWriter() {
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
     final Object key = "KEY";
@@ -1911,12 +1923,12 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable create = new CacheSerializableRunnable("Create Region") {
       @Override
       public void run2() throws CacheException {
-        Region region = createRegion(name);
+        Region<Object, Object> region = createRegion(name);
 
         // Put key2 in the region before any callbacks are
         // registered, so it can be destroyed later
         region.put(key2, value2);
-        assertEquals(1, region.size());
+        assertThat(region.size()).isEqualTo(1);
         if (region.getAttributes().getOffHeap() && !(region instanceof PartitionedRegion)) {
           GemFireCacheImpl gfc = (GemFireCacheImpl) getCache();
           MemoryAllocatorImpl ma = (MemoryAllocatorImpl) gfc.getOffHeapStore();
@@ -1924,15 +1936,14 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
           reRegion = (LocalRegion) region;
           RegionEntry re = reRegion.getRegionEntry(key2);
           StoredObject so = (StoredObject) re.getValue();
-          assertEquals(1, so.getRefCount());
-          assertEquals(1, ma.getStats().getObjects());
+          assertThat(so.getRefCount()).isEqualTo(1);
+          assertThat(ma.getStats().getObjects()).isEqualTo(1);
         }
       }
     };
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
+    final VM vm0 = VM.getVM(0);
+    final VM vm1 = VM.getVM(1);
 
     vm0.invoke(create);
     vm1.invoke(create);
@@ -1942,32 +1953,32 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Set Writer") {
       @Override
       public void run2() throws CacheException {
-        final Region region = getRootRegion().getSubregion(name);
-        writer = new TestCacheWriter() {
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
+        setWriter(new TestCacheWriter<Object, Object>() {
           @Override
-          public void beforeCreate2(EntryEvent event) throws CacheWriterException {
+          public void beforeCreate2(EntryEvent<Object, Object> event) throws CacheWriterException {
 
             if (exception.equals(event.getCallbackArgument())) {
               String s = "Test Exception";
               throw new CacheWriterException(s);
             }
 
-            assertEquals(region, event.getRegion());
-            assertTrue(event.getOperation().isCreate());
-            assertTrue(event.getOperation().isDistributed());
-            assertFalse(event.getOperation().isExpiration());
-            assertTrue(event.isOriginRemote());
-            assertEquals(key, event.getKey());
-            assertEquals(null, event.getOldValue());
-            assertEquals(oldValue, event.getNewValue());
-            assertFalse(event.getOperation().isLoad());
-            assertFalse(event.getOperation().isLocalLoad());
-            assertFalse(event.getOperation().isNetLoad());
-            assertFalse(event.getOperation().isNetSearch());
+            assertThat(event.getRegion()).isEqualTo(region);
+            assertThat(event.getOperation().isCreate()).isTrue();
+            assertThat(event.getOperation().isDistributed()).isTrue();
+            assertThat(event.getOperation().isExpiration()).isFalse();
+            assertThat(event.isOriginRemote()).isTrue();
+            assertThat(event.getKey()).isEqualTo(key);
+            assertThat(event.getOldValue()).isNull();
+            assertThat(event.getNewValue()).isEqualTo(oldValue);
+            assertThat(event.getOperation().isLoad()).isFalse();
+            assertThat(event.getOperation().isLocalLoad()).isFalse();
+            assertThat(event.getOperation().isNetLoad()).isFalse();
+            assertThat(event.getOperation().isNetSearch()).isFalse();
 
           }
-        };
-        region.getAttributesMutator().setCacheWriter(writer);
+        });
+        region.getAttributesMutator().setCacheWriter(writer());
         flushIfNecessary(region);
       }
     });
@@ -1975,18 +1986,18 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Create with Exception") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         try {
           region.put(key, oldValue, exception);
           fail("Should have thrown a CacheWriterException");
 
         } catch (CacheWriterException ex) {
-          assertNull(region.getEntry(key));
-          assertEquals(1, region.size());
+          assertThat(region.getEntry(key)).isNull();
+          assertThat(region.size()).isEqualTo(1);
           if (region.getAttributes().getOffHeap() && !(region instanceof PartitionedRegion)) {
             GemFireCacheImpl gfc = (GemFireCacheImpl) getCache();
             MemoryAllocatorImpl ma = (MemoryAllocatorImpl) gfc.getOffHeapStore();
-            assertEquals(1, ma.getStats().getObjects());
+            assertThat(ma.getStats().getObjects()).isEqualTo(1);
           }
         }
       }
@@ -1995,31 +2006,31 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new SerializableRunnable("Verify callback") {
       @Override
       public void run() {
-        assertTrue(writer.wasInvoked());
+        assertThat(writer().wasInvoked()).isTrue();
       }
     });
 
     vm0.invoke(new CacheSerializableRunnable("Create with Argument") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key, oldValue, arg);
-        assertEquals(2, region.size());
+        assertThat(region.size()).isEqualTo(2);
         if (region.getAttributes().getOffHeap() && !(region instanceof PartitionedRegion)) {
           GemFireCacheImpl gfc = (GemFireCacheImpl) getCache();
           MemoryAllocatorImpl ma = (MemoryAllocatorImpl) gfc.getOffHeapStore();
-          assertEquals(2, ma.getStats().getObjects());
+          assertThat(ma.getStats().getObjects()).isEqualTo(2);
           LocalRegion reRegion;
           reRegion = (LocalRegion) region;
           StoredObject so = (StoredObject) reRegion.getRegionEntry(key).getValue();
-          assertEquals(1, so.getRefCount());
+          assertThat(so.getRefCount()).isEqualTo(1);
         }
       }
     });
     vm1.invoke(new SerializableRunnable("Verify callback") {
       @Override
       public void run() {
-        assertTrue(writer.wasInvoked());
+        assertThat(writer().wasInvoked()).isTrue();
       }
     });
 
@@ -2028,10 +2039,10 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Set Writer") {
       @Override
       public void run2() throws CacheException {
-        final Region region = getRootRegion().getSubregion(name);
-        writer = new TestCacheWriter() {
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
+        setWriter(new TestCacheWriter<Object, Object>() {
           @Override
-          public void beforeUpdate2(EntryEvent event) throws CacheWriterException {
+          public void beforeUpdate2(EntryEvent<Object, Object> event) throws CacheWriterException {
 
             Object argument = event.getCallbackArgument();
             if (exception.equals(argument)) {
@@ -2039,47 +2050,47 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
               throw new CacheWriterException(s);
             }
 
-            assertEquals(arg, argument);
-
-            assertEquals(region, event.getRegion());
-            assertTrue(event.getOperation().isUpdate());
-            assertTrue(event.getOperation().isDistributed());
-            assertFalse(event.getOperation().isExpiration());
-            assertTrue(event.isOriginRemote());
-            assertEquals(key, event.getKey());
-            assertEquals(oldValue, event.getOldValue());
-            assertEquals(newValue, event.getNewValue());
-            assertFalse(event.getOperation().isLoad());
-            assertFalse(event.getOperation().isLocalLoad());
-            assertFalse(event.getOperation().isNetLoad());
-            assertFalse(event.getOperation().isNetSearch());
+            assertThat(argument).isEqualTo(arg);
+
+            assertThat(event.getRegion()).isEqualTo(region);
+            assertThat(event.getOperation().isUpdate()).isTrue();
+            assertThat(event.getOperation().isDistributed()).isTrue();
+            assertThat(event.getOperation().isExpiration()).isFalse();
+            assertThat(event.isOriginRemote()).isTrue();
+            assertThat(event.getKey()).isEqualTo(key);
+            assertThat(event.getOldValue()).isEqualTo(oldValue);
+            assertThat(event.getNewValue()).isEqualTo(newValue);
+            assertThat(event.getOperation().isLoad()).isFalse();
+            assertThat(event.getOperation().isLocalLoad()).isFalse();
+            assertThat(event.getOperation().isNetLoad()).isFalse();
+            assertThat(event.getOperation().isNetSearch()).isFalse();
 
           }
-        };
-        region.getAttributesMutator().setCacheWriter(writer);
+        });
+        region.getAttributesMutator().setCacheWriter(writer());
       }
     });
 
     vm0.invoke(new CacheSerializableRunnable("Update with Exception") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         try {
           region.put(key, newValue, exception);
           fail("Should have thrown a CacheWriterException");
 
         } catch (CacheWriterException ex) {
           Region.Entry entry = region.getEntry(key);
-          assertEquals(oldValue, entry.getValue());
-          assertEquals(2, region.size());
+          assertThat(entry.getValue()).isEqualTo(oldValue);
+          assertThat(region.size()).isEqualTo(2);
           if (region.getAttributes().getOffHeap() && !(region instanceof PartitionedRegion)) {
             GemFireCacheImpl gfc = (GemFireCacheImpl) getCache();
             MemoryAllocatorImpl ma = (MemoryAllocatorImpl) gfc.getOffHeapStore();
-            assertEquals(2, ma.getStats().getObjects());
+            assertThat(ma.getStats().getObjects()).isEqualTo(2);
             LocalRegion reRegion;
             reRegion = (LocalRegion) region;
             StoredObject so = (StoredObject) reRegion.getRegionEntry(key).getValue();
-            assertEquals(1, so.getRefCount());
+            assertThat(so.getRefCount()).isEqualTo(1);
           }
         }
       }
@@ -2087,27 +2098,27 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new SerializableRunnable("Verify callback") {
       @Override
       public void run() {
-        assertTrue(writer.wasInvoked());
+        assertThat(writer().wasInvoked()).isTrue();
       }
     });
 
     vm0.invoke(new CacheSerializableRunnable("Update with Argument") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key, newValue, arg);
-        assertEquals(2, region.size());
+        assertThat(region.size()).isEqualTo(2);
         if (region.getAttributes().getOffHeap() && !(region instanceof PartitionedRegion)) {
           GemFireCacheImpl gfc = (GemFireCacheImpl) getCache();
           MemoryAllocatorImpl ma = (MemoryAllocatorImpl) gfc.getOffHeapStore();
-          assertEquals(2, ma.getStats().getObjects());
+          assertThat(ma.getStats().getObjects()).isEqualTo(2);
         }
       }
     });
     vm1.invoke(new SerializableRunnable("Verify callback") {
       @Override
       public void run() {
-        assertTrue(writer.wasInvoked());
+        assertThat(writer().wasInvoked()).isTrue();
       }
     });
 
@@ -2116,10 +2127,10 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Set Writer") {
       @Override
       public void run2() throws CacheException {
-        final Region region = getRootRegion().getSubregion(name);
-        writer = new TestCacheWriter() {
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
+        setWriter(new TestCacheWriter<Object, Object>() {
           @Override
-          public void beforeDestroy2(EntryEvent event) throws CacheWriterException {
+          public void beforeDestroy2(EntryEvent<Object, Object> event) throws CacheWriterException {
 
             Object argument = event.getCallbackArgument();
             if (exception.equals(argument)) {
@@ -2127,41 +2138,41 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
               throw new CacheWriterException(s);
             }
 
-            assertEquals(arg, argument);
-
-            assertEquals(region, event.getRegion());
-            assertTrue(event.getOperation().isDestroy());
-            assertTrue(event.getOperation().isDistributed());
-            assertFalse(event.getOperation().isExpiration());
-            assertTrue(event.isOriginRemote());
-            assertEquals(key, event.getKey());
-            assertEquals(newValue, event.getOldValue());
-            assertNull(event.getNewValue());
-            assertFalse(event.getOperation().isLoad());
-            assertFalse(event.getOperation().isLocalLoad());
-            assertFalse(event.getOperation().isNetLoad());
-            assertFalse(event.getOperation().isNetSearch());
+            assertThat(argument).isEqualTo(arg);
+
+            assertThat(event.getRegion()).isEqualTo(region);
+            assertThat(event.getOperation().isDestroy()).isTrue();
+            assertThat(event.getOperation().isDistributed()).isTrue();
+            assertThat(event.getOperation().isExpiration()).isFalse();
+            assertThat(event.isOriginRemote()).isTrue();
+            assertThat(event.getKey()).isEqualTo(key);
+            assertThat(event.getOldValue()).isEqualTo(newValue);
+            assertThat(event.getNewValue()).isNull();
+            assertThat(event.getOperation().isLoad()).isFalse();
+            assertThat(event.getOperation().isLocalLoad()).isFalse();
+            assertThat(event.getOperation().isNetLoad()).isFalse();
+            assertThat(event.getOperation().isNetSearch()).isFalse();
           }
-        };
-        region.getAttributesMutator().setCacheWriter(writer);
+        });
+        region.getAttributesMutator().setCacheWriter(writer());
       }
     });
 
     vm0.invoke(new CacheSerializableRunnable("Destroy with Exception") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         try {
           region.destroy(key, exception);
           fail("Should have thrown a CacheWriterException");
 
         } catch (CacheWriterException ex) {
-          assertNotNull(region.getEntry(key));
-          assertEquals(2, region.size());
+          assertThat(region.getEntry(key)).isNotNull();
+          assertThat(region.size()).isEqualTo(2);
           if (region.getAttributes().getOffHeap() && !(region instanceof PartitionedRegion)) {
             GemFireCacheImpl gfc = (GemFireCacheImpl) getCache();
             MemoryAllocatorImpl ma = (MemoryAllocatorImpl) gfc.getOffHeapStore();
-            assertEquals(2, ma.getStats().getObjects());
+            assertThat(ma.getStats().getObjects()).isEqualTo(2);
           }
         }
       }
@@ -2169,27 +2180,27 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new SerializableRunnable("Verify callback") {
       @Override
       public void run() {
-        assertTrue(writer.wasInvoked());
+        assertThat(writer().wasInvoked()).isTrue();
       }
     });
 
     vm0.invoke(new CacheSerializableRunnable("Destroy with Argument") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.destroy(key, arg);
-        assertEquals(1, region.size());
+        assertThat(region.size()).isEqualTo(1);
         if (region.getAttributes().getOffHeap() && !(region instanceof PartitionedRegion)) {
           GemFireCacheImpl gfc = (GemFireCacheImpl) getCache();
           MemoryAllocatorImpl ma = (MemoryAllocatorImpl) gfc.getOffHeapStore();
-          assertEquals(1, ma.getStats().getObjects());
+          assertThat(ma.getStats().getObjects()).isEqualTo(1);
         }
       }
     });
     vm1.invoke(new SerializableRunnable("Verify callback") {
       @Override
       public void run() {
-        assertTrue(writer.wasInvoked());
+        assertThat(writer().wasInvoked()).isTrue();
       }
     });
 
@@ -2198,10 +2209,11 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Set Writer") {
       @Override
       public void run2() throws CacheException {
-        final Region region = getRootRegion().getSubregion(name);
-        writer = new TestCacheWriter() {
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
+        setWriter(new TestCacheWriter<Object, Object>() {
           @Override
-          public void beforeRegionDestroy2(RegionEvent event) throws CacheWriterException {
+          public void beforeRegionDestroy2(RegionEvent<Object, Object> event)
+              throws CacheWriterException {
 
             Object argument = event.getCallbackArgument();
             if (exception.equals(argument)) {
@@ -2209,23 +2221,23 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
               throw new CacheWriterException(s);
             }
 
-            assertEquals(arg, argument);
+            assertThat(argument).isEqualTo(arg);
 
-            assertEquals(region, event.getRegion());
-            assertTrue(event.getOperation().isRegionDestroy());
-            assertTrue(event.getOperation().isDistributed());
-            assertFalse(event.getOperation().isExpiration());
-            assertTrue(event.isOriginRemote());
+            assertThat(event.getRegion()).isEqualTo(region);
+            assertThat(event.getOperation().isRegionDestroy()).isTrue();
+            assertThat(event.getOperation().isDistributed()).isTrue();
+            assertThat(event.getOperation().isExpiration()).isFalse();
+            assertThat(event.isOriginRemote()).isTrue();
           }
-        };
-        region.getAttributesMutator().setCacheWriter(writer);
+        });
+        region.getAttributesMutator().setCacheWriter(writer());
       }
     });
 
     vm0.invoke(new CacheSerializableRunnable("Destroy with Exception") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         try {
           region.destroyRegion(exception);
           fail("Should have thrown a CacheWriterException");
@@ -2234,11 +2246,11 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
           if (region.isDestroyed()) {
             fail("should not have an exception if region is destroyed", ex);
           }
-          assertEquals(1, region.size());
+          assertThat(region.size()).isEqualTo(1);
           if (region.getAttributes().getOffHeap() && !(region instanceof PartitionedRegion)) {
             GemFireCacheImpl gfc = (GemFireCacheImpl) getCache();
             MemoryAllocatorImpl ma = (MemoryAllocatorImpl) gfc.getOffHeapStore();
-            assertEquals(1, ma.getStats().getObjects());
+            assertThat(ma.getStats().getObjects()).isEqualTo(1);
           }
         }
       }
@@ -2246,44 +2258,35 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new SerializableRunnable("Verify callback") {
       @Override
       public void run() {
-        assertTrue(writer.wasInvoked());
+        assertThat(writer().wasInvoked()).isTrue();
       }
     });
 
     vm0.invoke(new CacheSerializableRunnable("Destroy with Argument") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
-        assertEquals(1, region.size());
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
+        assertThat(region.size()).isEqualTo(1);
         if (region.getAttributes().getOffHeap() && !(region instanceof PartitionedRegion)) {
           GemFireCacheImpl gfc = (GemFireCacheImpl) getCache();
           MemoryAllocatorImpl ma = (MemoryAllocatorImpl) gfc.getOffHeapStore();
-          assertEquals(1, ma.getStats().getObjects());
+          assertThat(ma.getStats().getObjects()).isEqualTo(1);
         }
         region.destroyRegion(arg);
         if (region.getAttributes().getOffHeap() && !(region instanceof PartitionedRegion)) {
           GemFireCacheImpl gfc = (GemFireCacheImpl) getCache();
           final MemoryAllocatorImpl ma = (MemoryAllocatorImpl) gfc.getOffHeapStore();
-          WaitCriterion waitForStatChange = new WaitCriterion() {
-            @Override
-            public boolean done() {
-              return ma.getStats().getObjects() == 0;
-            }
+          await("waiting for off-heap object count go to zero")
+              .atMost(3, SECONDS).pollInterval(10, MILLISECONDS)
+              .until(() -> ma.getStats().getObjects(), equalTo(0));
 
-            @Override
-            public String description() {
-              return "never saw off-heap object count go to zero. Last value was "
-                  + ma.getStats().getObjects();
-            }
-          };
-          Wait.waitForCriterion(waitForStatChange, 3000, 10, true);
         }
       }
     });
     vm1.invoke(new SerializableRunnable("Verify callback") {
       @Override
       public void run() {
-        assertTrue(writer.wasInvoked());
+        assertThat(writer().wasInvoked()).isTrue();
       }
     });
   }
@@ -2293,45 +2296,46 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * remote one.
    */
   @Test
-  public void testLocalAndRemoteCacheWriters() throws Exception {
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+  public void testLocalAndRemoteCacheWriters() {
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
     final Object key = "KEY";
     final Object oldValue = "OLD_VALUE";
     final Object newValue = "NEW_VALUE";
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
 
     vm0.invoke(new CacheSerializableRunnable("Create \"Local\" Region") {
       @Override
       public void run2() throws CacheException {
-        Region region = createRegion(name);
-        writer = new TestCacheWriter() {
+        Region<Object, Object> region = createRegion(name);
+        setWriter(new TestCacheWriter<Object, Object>() {
           @Override
-          public void beforeUpdate2(EntryEvent event) throws CacheWriterException {}
+          public void beforeUpdate2(EntryEvent<Object, Object> event) throws CacheWriterException {}
 
           @Override
-          public void beforeCreate2(EntryEvent event) throws CacheWriterException {}
+          public void beforeCreate2(EntryEvent<Object, Object> event) throws CacheWriterException {}
 
           @Override
-          public void beforeDestroy2(EntryEvent event) throws CacheWriterException {}
+          public void beforeDestroy2(EntryEvent<Object, Object> event)
+              throws CacheWriterException {}
 
           @Override
-          public void beforeRegionDestroy2(RegionEvent event) throws CacheWriterException {}
-        };
-        region.getAttributesMutator().setCacheWriter(writer);
+          public void beforeRegionDestroy2(RegionEvent<Object, Object> event)
+              throws CacheWriterException {}
+        });
+        region.getAttributesMutator().setCacheWriter(writer());
       }
     });
 
     SerializableRunnable create = new CacheSerializableRunnable("Create \"Local\" Region") {
       @Override
       public void run2() throws CacheException {
-        Region region = createRegion(name);
-        writer = new TestCacheWriter() {};
-        region.getAttributesMutator().setCacheWriter(writer);
+        Region<Object, Object> region = createRegion(name);
+        setWriter(new TestCacheWriter<Object, Object>() {});
+        region.getAttributesMutator().setCacheWriter(writer());
       }
     };
 
@@ -2340,16 +2344,16 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable verify = new SerializableRunnable("Verify no callback") {
       @Override
       public void run() {
-        assertFalse(writer.wasInvoked());
+        assertThat(writer().wasInvoked()).isFalse();
       }
     };
 
     vm0.invoke(new CacheSerializableRunnable("Create entry") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key, oldValue);
-        assertTrue(writer.wasInvoked());
+        assertThat(writer().wasInvoked()).isTrue();
       }
     });
     vm1.invoke(verify);
@@ -2357,9 +2361,9 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Update entry") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key, newValue);
-        assertTrue(writer.wasInvoked());
+        assertThat(writer().wasInvoked()).isTrue();
       }
     });
     vm1.invoke(verify);
@@ -2367,9 +2371,9 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Destroy entry") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.destroy(key);
-        assertTrue(writer.wasInvoked());
+        assertThat(writer().wasInvoked()).isTrue();
       }
     });
     vm1.invoke(verify);
@@ -2377,9 +2381,9 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Destroy region") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.destroyRegion();
-        assertTrue(writer.wasInvoked());
+        assertThat(writer().wasInvoked()).isTrue();
       }
     });
     vm1.invoke(verify);
@@ -2390,8 +2394,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * is visible to the <code>CacheWriter</code> even if it is in another VM.
    */
   @Test
-  public void testCacheLoaderModifyingArgument() throws Exception {
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+  public void testCacheLoaderModifyingArgument() {
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
     final Object key = "KEY";
@@ -2406,10 +2410,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
+    final VM vm0 = VM.getVM(0);
+    final VM vm1 = VM.getVM(1);
 
     vm0.invoke(create);
     vm1.invoke(create);
@@ -2417,18 +2419,18 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     CacheSerializableRunnable setLoader = new CacheSerializableRunnable("Set CacheLoader") {
       @Override
       public void run2() throws CacheException {
-        final Region region = getRootRegion().getSubregion(name);
-        loader = new TestCacheLoader() {
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
+        setLoader(new TestCacheLoader<Object, Object>() {
           @Override
-          public Object load2(LoaderHelper helper) throws CacheLoaderException {
+          public Object load2(LoaderHelper<Object, Object> helper) throws CacheLoaderException {
 
             Object[] array = (Object[]) helper.getArgument();
-            assertEquals(one, array[0]);
+            assertThat(array[0]).isEqualTo(one);
             array[0] = two;
             return value;
           }
-        };
-        region.getAttributesMutator().setCacheLoader(loader);
+        });
+        region.getAttributesMutator().setCacheLoader(loader());
         flushIfNecessary(region);
       }
     };
@@ -2439,19 +2441,19 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Conditionally create second loader") {
       @Override
       public void run2() throws CacheException {
-        final Region region = getRootRegion().getSubregion(name);
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
         if (region.getAttributes().getPartitionAttributes() != null) {
-          loader = new TestCacheLoader() {
+          setLoader(new TestCacheLoader<Object, Object>() {
             @Override
-            public Object load2(LoaderHelper helper) throws CacheLoaderException {
+            public Object load2(LoaderHelper<Object, Object> helper) throws CacheLoaderException {
 
               Object[] array = (Object[]) helper.getArgument();
-              assertEquals(one, array[0]);
+              assertThat(array[0]).isEqualTo(one);
               array[0] = two;
               return value;
             }
-          };
-          region.getAttributesMutator().setCacheLoader(loader);
+          });
+          region.getAttributesMutator().setCacheLoader(loader());
         }
       }
     });
@@ -2459,16 +2461,16 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Set CacheWriter") {
       @Override
       public void run2() throws CacheException {
-        final Region region = getRootRegion().getSubregion(name);
-        writer = new TestCacheWriter() {
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
+        setWriter(new TestCacheWriter<Object, Object>() {
           @Override
-          public void beforeCreate2(EntryEvent event) throws CacheWriterException {
+          public void beforeCreate2(EntryEvent<Object, Object> event) throws CacheWriterException {
 
             Object[] array = (Object[]) event.getCallbackArgument();
-            assertEquals(two, array[0]);
+            assertThat(array[0]).isEqualTo(two);
           }
-        };
-        region.getAttributesMutator().setCacheWriter(writer);
+        });
+        region.getAttributesMutator().setCacheWriter(writer());
         flushIfNecessary(region);
       }
     });
@@ -2476,18 +2478,18 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Create entry") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         Object[] array = {one};
         Object result = region.get(key, array);
-        assertTrue(loader.wasInvoked());
-        assertEquals(value, result);
+        assertThat(loader().wasInvoked()).isTrue();
+        assertThat(result).isEqualTo(value);
       }
     });
 
     vm1.invoke(new CacheSerializableRunnable("Validate callback") {
       @Override
       public void run2() throws CacheException {
-        assertTrue(writer.wasInvoked());
+        assertThat(writer().wasInvoked()).isTrue();
       }
     });
   }
@@ -2497,38 +2499,36 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * of causing infinite recursion.
    */
   @Test
-  public void testRemoteLoaderNetSearch() throws Exception {
-    assumeTrue(supportsNetLoad());
+  public void testRemoteLoaderNetSearch() {
+    assumeThat(supportsNetLoad()).isTrue();
 
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
     final Object key = "KEY";
     final Object value = "VALUE";
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
+    final VM vm0 = VM.getVM(0);
+    final VM vm1 = VM.getVM(1);
 
     SerializableRunnable create = new CacheSerializableRunnable("Get value") {
       @Override
       public void run2() throws CacheException {
-        Region region = createRegion(name);
-        assertEquals(value, region.get(key));
+        Region<Object, Object> region = createRegion(name);
+        assertThat(region.get(key)).isEqualTo(value);
       }
     };
 
-
     vm0.invoke(new CacheSerializableRunnable("Create Region") {
       @Override
       public void run2() throws CacheException {
-        Region region = createRegion(name);
-        region.getAttributesMutator().setCacheLoader(new TestCacheLoader() {
+        Region<Object, Object> region = createRegion(name);
+        region.getAttributesMutator().setCacheLoader(new TestCacheLoader<Object, Object>() {
           @Override
-          public Object load2(LoaderHelper helper) throws CacheLoaderException {
+          public Object load2(LoaderHelper<Object, Object> helper) throws CacheLoaderException {
 
             try {
-              assertNull(helper.netSearch(true));
+              assertThat(helper.netSearch(true)).isNull();
 
             } catch (TimeoutException ex) {
               fail("Why did I time out?", ex);
@@ -2546,22 +2546,21 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * Tests that a local loader is preferred to a remote one
    */
   @Test
-  public void testLocalCacheLoader() throws Exception {
+  public void testLocalCacheLoader() {
     final String name = this.getUniqueName();
     final Object key = "KEY";
     final Object value = "VALUE";
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
+    final VM vm0 = VM.getVM(0);
+    final VM vm1 = VM.getVM(1);
 
     SerializableRunnable create = new CacheSerializableRunnable("Create \"remote\" region") {
       @Override
       public void run2() throws CacheException {
-        Region region = createRegion(name);
-        loader = new TestCacheLoader() {
+        Region<Object, Object> region = createRegion(name);
+        setLoader(new TestCacheLoader<Object, Object>() {
           @Override
-          public Object load2(LoaderHelper helper) throws CacheLoaderException {
+          public Object load2(LoaderHelper<Object, Object> helper) throws CacheLoaderException {
             if (helper.getRegion().getAttributes().getPartitionAttributes() == null) {
               fail("Should not be invoked");
               return null;
@@ -2569,19 +2568,18 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
               return value;
             }
           }
-        };
-        region.getAttributesMutator().setCacheLoader(loader);
+        });
+        region.getAttributesMutator().setCacheLoader(loader());
       }
     };
 
-
     vm0.invoke(new CacheSerializableRunnable("Create \"local\" region") {
       @Override
       public void run2() throws CacheException {
-        Region region = createRegion(name);
-        region.getAttributesMutator().setCacheLoader(new TestCacheLoader() {
+        Region<Object, Object> region = createRegion(name);
+        region.getAttributesMutator().setCacheLoader(new TestCacheLoader<Object, Object>() {
           @Override
-          public Object load2(LoaderHelper helper) throws CacheLoaderException {
+          public Object load2(LoaderHelper<Object, Object> helper) throws CacheLoaderException {
             return value;
           }
         });
@@ -2590,18 +2588,17 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
 
     vm1.invoke(create);
 
-
     vm0.invoke(new CacheSerializableRunnable("Get") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
-        assertEquals(value, region.get(key));
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
+        assertThat(region.get(key)).isEqualTo(value);
       }
     });
     vm1.invoke(new SerializableRunnable("Verify loader not invoked") {
       @Override
       public void run() {
-        assertFalse(loader.wasInvoked());
+        assertThat(loader().wasInvoked()).isFalse();
       }
     });
   }
@@ -2610,7 +2607,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * Tests that an entry update is propagated to other caches that have that same entry defined.
    */
   @Test
-  public void testDistributedPut() throws Exception {
+  public void testDistributedPut() {
     final String rgnName = getUniqueName();
 
     SerializableRunnable create = new SerializableRunnable("testDistributedPut: Create Region") {
@@ -2631,8 +2628,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
         try {
           if (!getRegionAttributes().getDataPolicy().withReplication()
               && getRegionAttributes().getPartitionAttributes() == null) {
-            Region root = getRootRegion("root");
-            Region rgn = root.getSubregion(rgnName);
+            Region<?, ?> root = getRootRegion("root");
+            Region<Object, Object> rgn = root.getSubregion(rgnName);
             rgn.create("key", null);
             getSystem().getLogWriter().info("testDistributedPut: Created Key");
           }
@@ -2642,40 +2639,37 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
+    final VM vm0 = VM.getVM(0);
 
     vm0.invoke(create);
     vm0.invoke(newKey);
-    int vmCount = host.getVMCount();
-    Set systems = new HashSet();
+    int vmCount = VM.getVMCount();
+
     for (int i = 1; i < vmCount; i++) {
-      VM vm = host.getVM(i);
+      VM vm = VM.getVM(i);
       vm.invoke(create);
-      if (!getRegionAttributes().getDataPolicy().isPreloaded()) {
+      if (!getRegionAttributes().getDataPolicy().withPreloaded()) {
         vm.invoke(newKey);
       }
     }
-    // GemFireVersion.waitForJavaDebugger(getLogWriter(), "CTRLR WAITING AFTER CREATE");
-
 
     try {
-      Region rgn = null;
-      rgn = createRegion(rgnName);
+      Region<String, String> rgn = createRegion(rgnName);
 
       rgn.put("key", "value");
       getSystem().getLogWriter().info("testDistributedPut: Put Value");
 
-      Invoke.invokeInEveryVMRepeatingIfNecessary(
+      invokeInEveryVM(repeatingIfNecessary(
           new CacheSerializableRunnable("testDistributedPut: Verify Received Value") {
             @Override
             public void run2() {
-              Region rgn1 = getRootRegion().getSubregion(rgnName);
-              assertNotNull("Could not find entry for 'key'", rgn1.getEntry("key"));
-              assertEquals("value", rgn1.getEntry("key").getValue());
+              Region<String, String> rgn1 = getRootRegion().getSubregion(rgnName);
+              String description = "Could not find entry for 'key'";
+              Object actual = rgn1.getEntry("key");
+              assertThat(actual).describedAs(description).isNotNull();
+              assertThat(rgn1.getEntry("key").getValue()).isEqualTo("value");
             }
-          }, getRepeatTimeoutMs());
+          }));
 
     } catch (Exception e) {
       getCache().close();
@@ -2686,106 +2680,6 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
   }
 
 
-  //////// Mirroring Tests
-
-  /**
-   * Tests that keys, but not values, are pushed with {@link MirrorType#KEYS}.
-   */
-  // public void testMirroredKeys() throws InterruptedException {
-  // // Note that updates will now always include the value.
-
-  // final String name = this.getUniqueName();
-  // final Object key1 = "KEY1";
-  // final Object value1 = "VALUE1";
-  // final Object key2 = "KEY2";
-
-  // Object[] v = new Object[3000];
-  // Arrays.fill(v, new Integer(0xCAFE));
-
-  // final Object value2 = Arrays.asList(v);
-  // final Object key3 = "KEY3";
-  // final Object value3 = "VALUE3";
-
-  // Host host = Host.getHost(0);
-  // VM vm0 = host.getVM(0);
-  // VM vm2 = host.getVM(2); // use VM on separate shared memory in case they are shared regions
-
-  // final boolean persistBackup = getRegionAttributes().getDataPolicy().isPersistentReplicate();
-
-  // SerializableRunnable create = new
-  // CacheSerializableRunnable("Create Mirrored Region") {
-  // public void run2() throws CacheException {
-  // AttributesFactory factory =
-  // new AttributesFactory(getRegionAttributes());
-  // factory.setMirrorType(MirrorType.KEYS);
-  // try {
-  // createRegion(name, factory.create());
-  // if (persistBackup) fail("Should have thrown an IllegalStateException");
-  // }
-  // catch (IllegalStateException e) {
-  // if (!persistBackup) throw e;
-  // }
-  // }
-  // };
-
-  // vm0.invoke(create);
-  // if (persistBackup) return;
-
-  // vm2.invoke(create);
-
-  // vm0.invoke(new CacheSerializableRunnable("Put data") {
-  // public void run2() throws CacheException {
-  // Region region =
-  // getRootRegion().getSubregion(name);
-  // region.put(key1, value1);
-  // region.put(key2, value2);
-  // region.put(key3, value3);
-  // }
-  // });
-
-  // invokeRepeatingIfNecessary(vm2, new CacheSerializableRunnable("Wait for update") {
-  // public void run2() throws CacheException {
-  // Region region = getRootRegion().getSubregion(name);
-  // assertNotNull(region.getEntry(key1));
-  // assertNotNull(region.getEntry(key2));
-  // assertNotNull(region.getEntry(key3));
-  // }
-  // });
-
-  // // Destroy the local entries so we know that they are not found by
-  // // a netSearch
-  // vm0.invoke(new CacheSerializableRunnable("Remove local entries") {
-  // public void run2() throws CacheException {
-  // Region region =
-  // getRootRegion().getSubregion(name);
-  // region.localDestroyRegion();
-  // }
-  // });
-
-  // invokeRepeatingIfNecessary(vm2, new CacheSerializableRunnable("Verify keys") {
-  // public void run2() throws CacheException {
-  // Region region =
-  // getRootRegion().getSubregion(name);
-
-  // // values1 and values3 should have been propagated since
-  // // they were small
-  // // value2, which is large, is also propagated since we no
-  // // longer optimize updates based on size.
-  // Region.Entry entry1 = region.getEntry(key1);
-  // assertNotNull(entry1);
-  // assertIndexDetailsEquals(value1, entry1.getValue());
-
-  // Region.Entry entry2 = region.getEntry(key2);
-  // assertNotNull(entry2);
-  // assertIndexDetailsEquals(value2, entry2.getValue());
-
-  // Region.Entry entry3 = region.getEntry(key3);
-  // assertNotNull(entry3);
-  // assertIndexDetailsEquals(value3, entry3.getValue());
-  // }
-  // });
-  // }
-
   /**
    * Indicate whether replication/GII supported
    *
@@ -2799,8 +2693,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * Tests that keys and values are pushed with {@link DataPolicy#REPLICATE}.
    */
   @Test
-  public void testReplicate() throws Exception {
-    assumeTrue(supportsReplication());
+  public void testReplicate() {
+    assumeThat(supportsReplication()).isTrue();
 
     final String name = this.getUniqueName();
     final Object key1 = "KEY1";
@@ -2808,21 +2702,20 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     final Object key2 = "KEY2";
 
     Object[] v = new Object[3000];
-    Arrays.fill(v, new Integer(0xCAFE));
+    Arrays.fill(v, 0xCAFE);
 
     final Object value2 = Arrays.asList(v);
     final Object key3 = "KEY3";
     final Object value3 = "VALUE3";
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm2 = host.getVM(2); // use VM on separate shared memory in case shared regions
+    VM vm0 = VM.getVM(0);
+    VM vm2 = VM.getVM(2); // use VM on separate shared memory in case shared regions
 
     SerializableRunnable create = new CacheSerializableRunnable("Create Mirrored Region") {
       @Override
       public void run2() throws CacheException {
-        RegionAttributes ra = getRegionAttributes();
-        AttributesFactory factory = new AttributesFactory(ra);
+        RegionAttributes<?, ?> ra = getRegionAttributes();
+        AttributesFactory<?, ?> factory = new AttributesFactory<>(ra);
         if (ra.getEvictionAttributes() == null
             || !ra.getEvictionAttributes().getAction().isOverflowToDisk()) {
           factory.setDiskStoreName(null);
@@ -2838,7 +2731,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Put data") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key1, value1);
         region.put(key2, value2);
         region.put(key3, value3);
@@ -2846,56 +2739,56 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     });
 
-    Invoke.invokeRepeatingIfNecessary(vm2, new CacheSerializableRunnable("Wait for update") {
+    vm2.invoke(repeatingIfNecessary(new CacheSerializableRunnable("Wait for update") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
-        assertNotNull(region.getEntry(key1));
-        assertNotNull(region.getEntry(key2));
-        assertNotNull(region.getEntry(key3));
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
+        assertThat(region.getEntry(key1)).isNotNull();
+        assertThat(region.getEntry(key2)).isNotNull();
+        assertThat(region.getEntry(key3)).isNotNull();
       }
-    }, getRepeatTimeoutMs());
+    }));
 
     // Destroy the local entries so we know that they are not found by
     // a netSearch
     vm0.invoke(new CacheSerializableRunnable("Remove local entries") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.localDestroyRegion();
         flushIfNecessary(region);
       }
     });
 
-    Invoke.invokeRepeatingIfNecessary(vm2, new CacheSerializableRunnable("Verify keys") {
+    vm2.invoke(repeatingIfNecessary(new CacheSerializableRunnable("Verify keys") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
 
         // small
-        Region.Entry entry1 = region.getEntry(key1);
-        assertNotNull(entry1);
-        assertEquals(value1, entry1.getValue());
+        Region.Entry<Object, Object> entry1 = region.getEntry(key1);
+        assertThat(entry1).isNotNull();
+        assertThat(entry1.getValue()).isEqualTo(value1);
 
         // large
-        Region.Entry entry2 = region.getEntry(key2);
-        assertNotNull(entry2);
-        assertEquals(value2, entry2.getValue());
+        Region.Entry<Object, Object> entry2 = region.getEntry(key2);
+        assertThat(entry2).isNotNull();
+        assertThat(entry2.getValue()).isEqualTo(value2);
 
         // small
-        Region.Entry entry3 = region.getEntry(key3);
-        assertNotNull(entry3);
-        assertEquals(value3, entry3.getValue());
+        Region.Entry<Object, Object> entry3 = region.getEntry(key3);
+        assertThat(entry3).isNotNull();
+        assertThat(entry3.getValue()).isEqualTo(value3);
       }
-    }, getRepeatTimeoutMs());
+    }));
   }
 
   /**
    * Tests that a newly-created mirrored region contains all of the entries of another region.
    */
   @Test
-  public void testGetInitialImage() throws Exception {
-    assumeTrue(supportsReplication());
+  public void testGetInitialImage() {
+    assumeThat(supportsReplication()).isTrue();
 
     final String name = this.getUniqueName();
     final Object key1 = "KEY1";
@@ -2905,15 +2798,14 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     final Object key3 = "KEY3";
     final Object value3 = "VALUE3";
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm2 = host.getVM(2); // use VM on different shared memory area
+    VM vm0 = VM.getVM(0);
+    VM vm2 = VM.getVM(2); // use VM on different shared memory area
 
     SerializableRunnable create = new CacheSerializableRunnable("Create Mirrored Region") {
       @Override
       public void run2() throws CacheException {
-        RegionAttributes ra = getRegionAttributes();
-        AttributesFactory factory = new AttributesFactory(ra);
+        RegionAttributes<?, ?> ra = getRegionAttributes();
+        AttributesFactory<?, ?> factory = new AttributesFactory<>(ra);
         if (ra.getEvictionAttributes() == null
             || !ra.getEvictionAttributes().getAction().isOverflowToDisk()) {
           factory.setDiskStoreName(null);
@@ -2928,7 +2820,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Put data") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key1, value1);
         region.put(key2, value2);
         region.put(key3, value3);
@@ -2942,7 +2834,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Remove local entries") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.localDestroyRegion();
       }
     });
@@ -2950,19 +2842,19 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm2.invoke(new CacheSerializableRunnable("Verify keys/values") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
 
         Region.Entry entry1 = region.getEntry(key1);
-        assertNotNull(entry1);
-        assertEquals(value1, entry1.getValue());
+        assertThat(entry1).isNotNull();
+        assertThat(entry1.getValue()).isEqualTo(value1);
 
         Region.Entry entry2 = region.getEntry(key2);
-        assertNotNull(entry2);
-        assertEquals(value2, entry2.getValue());
+        assertThat(entry2).isNotNull();
+        assertThat(entry2.getValue()).isEqualTo(value2);
 
         Region.Entry entry3 = region.getEntry(key3);
-        assertNotNull(entry3);
-        assertEquals(value3, entry3.getValue());
+        assertThat(entry3).isNotNull();
+        assertThat(entry3.getValue()).isEqualTo(value3);
       }
     });
   }
@@ -2976,28 +2868,27 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * a large quantity of data.
    */
   @Test
-  public void testLargeGetInitialImage() throws Exception {
-    assumeTrue(supportsReplication());
+  public void testLargeGetInitialImage() {
+    assumeThat(supportsReplication()).isTrue();
 
     final String name = this.getUniqueName();
     final Integer[] keys = new Integer[NUM_ENTRIES];
     final byte[][] values = new byte[NUM_ENTRIES][];
 
     for (int i = 0; i < NUM_ENTRIES; i++) {
-      keys[i] = new Integer(i);
+      keys[i] = i;
       values[i] = new byte[VALUE_SIZE];
       Arrays.fill(values[i], (byte) 0x42);
     }
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm2 = host.getVM(2); // use VM on different shared memory area
+    VM vm0 = VM.getVM(0);
+    VM vm2 = VM.getVM(2); // use VM on different shared memory area
 
     SerializableRunnable create = new CacheSerializableRunnable("Create Mirrored Region") {
       @Override
       public void run2() throws CacheException {
-        RegionAttributes ra = getRegionAttributes();
-        AttributesFactory factory = new AttributesFactory(ra);
+        RegionAttributes<?, ?> ra = getRegionAttributes();
+        AttributesFactory<?, ?> factory = new AttributesFactory<>(ra);
         if (ra.getEvictionAttributes() == null
             || !ra.getEvictionAttributes().getAction().isOverflowToDisk()) {
           factory.setDiskStoreName(null);
@@ -3007,13 +2898,12 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-
     vm0.invoke(create);
 
     vm0.invoke(new CacheSerializableRunnable("Put data") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Integer, byte[]> region = getRootRegion().getSubregion(name);
         for (int i = 0; i < NUM_ENTRIES; i++) {
           region.put(keys[i], values[i]);
         }
@@ -3027,7 +2917,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Remove local entries") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.localDestroyRegion();
       }
     });
@@ -3035,16 +2925,16 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm2.invoke(new CacheSerializableRunnable("Verify keys/values") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
-        assertEquals(NUM_ENTRIES, region.entrySet(false).size());
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
+        assertThat(region.entrySet(false).size()).isEqualTo(NUM_ENTRIES);
         for (int i = 0; i < NUM_ENTRIES; i++) {
           Region.Entry entry = region.getEntry(keys[i]);
-          assertNotNull(entry);
+          assertThat(entry).isNotNull();
           if (!(entry.getValue() instanceof byte[])) {
             fail("getValue returned a " + entry.getValue().getClass()
                 + " instead of the expected byte[]");
           }
-          assertTrue(Arrays.equals(values[i], (byte[]) entry.getValue()));
+          assertThat(Arrays.equals(values[i], (byte[]) entry.getValue())).isTrue();
         }
       }
     });
@@ -3055,8 +2945,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * afterCreate event is invoked on a listener.
    */
   @Test
-  public void testMirroredDataFromNonMirrored() throws Exception {
-    assumeTrue(supportsReplication());
+  public void testMirroredDataFromNonMirrored() {
+    assumeThat(supportsReplication()).isTrue();
 
     final String name = this.getUniqueName();
     final Object key1 = "KEY1";
@@ -3066,22 +2956,21 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     final Object key3 = "KEY3";
     final Object value3 = "VALUE3";
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm2 = host.getVM(2); // use a VM on a different gemfire system
+    VM vm0 = VM.getVM(0);
+    VM vm2 = VM.getVM(2); // use a VM on a different gemfire system
 
     SerializableRunnable create = new CacheSerializableRunnable("Populate non-mirrored region") {
       @Override
       public void run2() throws CacheException {
-        RegionAttributes ra = getRegionAttributes();
-        AttributesFactory fac = new AttributesFactory(ra);
+        RegionAttributes<Object, Object> ra = getRegionAttributes();
+        AttributesFactory<Object, Object> fac = new AttributesFactory<>(ra);
         if (ra.getEvictionAttributes() == null
             || !ra.getEvictionAttributes().getAction().isOverflowToDisk()) {
           fac.setDiskStoreName(null);
         }
         fac.setDataPolicy(DataPolicy.NORMAL);
         // fac.setPersistBackup(false);
-        Region region = createRegion(name, fac.create());
+        Region<Object, Object> region = createRegion(name, fac.create());
         region.put(key1, value1);
         region.put(key2, value2);
         region.put(key3, value3);
@@ -3089,19 +2978,19 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-    class MirroredDataFromNonMirroredListener extends TestCacheListener {
+    class MirroredDataFromNonMirroredListener extends TestCacheListener<Object, Object> {
       // use modifiable ArrayLists
-      List expectedKeys = new ArrayList(Arrays.asList(new Object[] {key1, key2, key3}));
-      List expectedValues = new ArrayList(Arrays.asList(new Object[] {value1, value2, value3}));
+      final List<Object> expectedKeys = new ArrayList<>(Arrays.asList(key1, key2, key3));
+      final List<Object> expectedValues = new ArrayList<>(Arrays.asList(value1, value2, value3));
 
       @Override
-      public synchronized void afterCreate2(EntryEvent event) {
+      public synchronized void afterCreate2(EntryEvent<Object, Object> event) {
         // getLogWriter().info("Invoking afterCreate2 with key=" + event.getKey());
         int index = expectedKeys.indexOf(event.getKey());
-        assertTrue(index >= 0);
-        assertEquals(expectedValues.remove(index), event.getNewValue());
+        assertThat(index >= 0).isTrue();
+        assertThat(event.getNewValue()).isEqualTo(expectedValues.remove(index));
         expectedKeys.remove(index);
-        org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info("afterCreate called in "
+        logger.info("afterCreate called in "
             + "MirroredDataFromNonMirroredListener for key:" + event.getKey());
       }
     }
@@ -3109,8 +2998,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Create Mirrored Region") {
       @Override
       public void run2() throws CacheException {
-        RegionAttributes ra = getRegionAttributes();
-        AttributesFactory factory = new AttributesFactory(ra);
+        RegionAttributes<Object, Object> ra = getRegionAttributes();
+        AttributesFactory<Object, Object> factory = new AttributesFactory<>(ra);
         if (ra.getEvictionAttributes() == null
             || !ra.getEvictionAttributes().getAction().isOverflowToDisk()) {
           factory.setDiskStoreName(null);
@@ -3128,7 +3017,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm2.invoke(new CacheSerializableRunnable("Remove local entries") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.localDestroy(key1);
         region.localDestroy(key2);
         region.localDestroy(key3);
@@ -3139,26 +3028,26 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Verify keys/values and listener") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
 
         Region.Entry entry1 = region.getEntry(key1);
-        assertNotNull(entry1);
-        assertEquals(value1, entry1.getValue());
+        assertThat(entry1).isNotNull();
+        assertThat(entry1.getValue()).isEqualTo(value1);
 
         Region.Entry entry2 = region.getEntry(key2);
-        assertNotNull(entry2);
-        assertEquals(value2, entry2.getValue());
+        assertThat(entry2).isNotNull();
+        assertThat(entry2.getValue()).isEqualTo(value2);
 
         Region.Entry entry3 = region.getEntry(key3);
-        assertNotNull(entry3);
-        assertEquals(value3, entry3.getValue());
+        assertThat(entry3).isNotNull();
+        assertThat(entry3.getValue()).isEqualTo(value3);
 
         MirroredDataFromNonMirroredListener lsnr =
             (MirroredDataFromNonMirroredListener) region.getAttributes().getCacheListeners()[0];
 
-        assertTrue(lsnr.wasInvoked());
-        assertTrue("expectedKeys should be empty, but was: " + lsnr.expectedKeys,
-            lsnr.expectedKeys.isEmpty());
+        assertThat(lsnr.wasInvoked()).isTrue();
+        assertThat(lsnr.expectedKeys.isEmpty()).describedAs(
+            "expectedKeys should be empty, but was: " + lsnr.expectedKeys).isTrue();
       }
     });
   }
@@ -3168,8 +3057,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * Tests that a mirrored region does not push data to a non-mirrored region.
    */
   @Test
-  public void testNoMirroredDataToNonMirrored() throws Exception {
-    assumeTrue(supportsReplication());
+  public void testNoMirroredDataToNonMirrored() {
+    assumeThat(supportsReplication()).isTrue();
 
     final String name = this.getUniqueName();
     final Object key1 = "KEY1";
@@ -3179,9 +3068,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     final Object key3 = "KEY3";
     final Object value3 = "VALUE3";
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm2 = host.getVM(2); // use VM on different gemfire system
+    VM vm0 = VM.getVM(0);
+    VM vm2 = VM.getVM(2); // use VM on different gemfire system
 
     vm0.invoke(new CacheSerializableRunnable("Create Non-mirrored Region") {
       @Override
@@ -3193,14 +3081,14 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable create = new CacheSerializableRunnable("Populate mirrored region") {
       @Override
       public void run2() throws CacheException {
-        RegionAttributes ra = getRegionAttributes();
-        AttributesFactory factory = new AttributesFactory(ra);
+        RegionAttributes<Object, Object> ra = getRegionAttributes();
+        AttributesFactory<Object, Object> factory = new AttributesFactory<>(ra);
         if (ra.getEvictionAttributes() == null
             || !ra.getEvictionAttributes().getAction().isOverflowToDisk()) {
           factory.setDiskStoreName(null);
         }
         factory.setDataPolicy(DataPolicy.REPLICATE);
-        Region region = createRegion(name, factory.create());
+        Region<Object, Object> region = createRegion(name, factory.create());
         region.put(key1, value1);
         region.put(key2, value2);
         region.put(key3, value3);
@@ -3214,29 +3102,29 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Verify keys/values") {
       @Override
       public void run2() throws CacheException {
-        final Region region = getRootRegion().getSubregion(name);
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
         Region.Entry entry1 = region.getEntry(key1);
         if (!getRegionAttributes().getDataPolicy().withReplication()) {
           if (entry1 != null) {
-            org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info("found entry " + entry1);
+            logger.info("found entry " + entry1);
           }
-          assertNull(entry1);
+          assertThat(entry1).isNull();
         } else {
-          assertNotNull(entry1);
+          assertThat(entry1).isNotNull();
         }
 
         Region.Entry entry2 = region.getEntry(key2);
         if (!getRegionAttributes().getDataPolicy().withReplication()) {
-          assertNull(entry2);
+          assertThat(entry2).isNull();
         } else {
-          assertNotNull(entry2);
+          assertThat(entry2).isNotNull();
         }
 
         Region.Entry entry3 = region.getEntry(key3);
         if (!getRegionAttributes().getDataPolicy().withReplication()) {
-          assertNull(entry3);
+          assertThat(entry3).isNull();
         } else {
-          assertNotNull(entry3);
+          assertThat(entry3).isNotNull();
         }
       }
     });
@@ -3246,30 +3134,29 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * Tests that a local load occurs, even with mirroring
    */
   @Test
-  public void testMirroredLocalLoad() throws Exception {
-    assumeTrue(supportsReplication());
+  public void testMirroredLocalLoad() {
+    assumeThat(supportsReplication()).isTrue();
 
     final String name = this.getUniqueName();
     final Object key = "KEY";
     final Object value = "VALUE";
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm2 = host.getVM(2); // use VMs on different gemfire systems
+    VM vm0 = VM.getVM(0);
+    VM vm2 = VM.getVM(2); // use VMs on different gemfire systems
 
     vm0.invoke(new CacheSerializableRunnable("Create region with loader") {
       @Override
       public void run2() throws CacheException {
-        RegionAttributes ra = getRegionAttributes();
-        AttributesFactory factory = new AttributesFactory(ra);
+        RegionAttributes<Object, Object> ra = getRegionAttributes();
+        AttributesFactory<Object, Object> factory = new AttributesFactory<>(ra);
         if (ra.getEvictionAttributes() == null
             || !ra.getEvictionAttributes().getAction().isOverflowToDisk()) {
           factory.setDiskStoreName(null);
         }
         factory.setDataPolicy(DataPolicy.REPLICATE);
-        factory.setCacheLoader(new TestCacheLoader() {
+        factory.setCacheLoader(new TestCacheLoader<Object, Object>() {
           @Override
-          public Object load2(LoaderHelper helper) throws CacheLoaderException {
+          public Object load2(LoaderHelper<Object, Object> helper) throws CacheLoaderException {
             return value;
           }
         });
@@ -3280,41 +3167,40 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable create = new CacheSerializableRunnable("Create region with bad loader") {
       @Override
       public void run2() throws CacheException {
-        RegionAttributes ra = getRegionAttributes();
-        AttributesFactory factory = new AttributesFactory(ra);
+        RegionAttributes<Object, Object> ra = getRegionAttributes();
+        AttributesFactory<Object, Object> factory = new AttributesFactory<>(ra);
         if (ra.getEvictionAttributes() == null
             || !ra.getEvictionAttributes().getAction().isOverflowToDisk()) {
           factory.setDiskStoreName(null);
         }
         factory.setDataPolicy(DataPolicy.REPLICATE);
-        loader = new TestCacheLoader() {
+        setLoader(new TestCacheLoader<Object, Object>() {
           @Override
-          public Object load2(LoaderHelper helper) throws CacheLoaderException {
+          public Object load2(LoaderHelper<Object, Object> helper) throws CacheLoaderException {
 
             fail("Should not be invoked");
             return null;
           }
-        };
-        factory.setCacheLoader(loader);
+        });
+        factory.setCacheLoader(loader());
         createRegion(name, factory.create());
       }
     };
 
-
     vm2.invoke(create);
 
     vm0.invoke(new CacheSerializableRunnable("Get") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
-        assertEquals(value, region.get(key));
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
+        assertThat(region.get(key)).isEqualTo(value);
       }
     });
 
     vm2.invoke(new CacheSerializableRunnable("Verify no load") {
       @Override
       public void run2() throws CacheException {
-        assertFalse(loader.wasInvoked());
+        assertThat(loader().wasInvoked()).isFalse();
       }
     });
   }
@@ -3323,30 +3209,29 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * Tests sure that a <code>netLoad</code> occurs, even with mirroring
    */
   @Test
-  public void testMirroredNetLoad() throws Exception {
-    assumeTrue(supportsReplication());
+  public void testMirroredNetLoad() {
+    assumeThat(supportsReplication()).isTrue();
 
     final String name = this.getUniqueName();
     final Object key = "KEY";
     final Object value = "VALUE";
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm2 = host.getVM(2); // use VMs on different gemfire systems
+    VM vm0 = VM.getVM(0);
+    VM vm2 = VM.getVM(2); // use VMs on different gemfire systems
 
     SerializableRunnable create = new CacheSerializableRunnable("Create region with loader") {
       @Override
       public void run2() throws CacheException {
-        RegionAttributes ra = getRegionAttributes();
-        AttributesFactory factory = new AttributesFactory(ra);
+        RegionAttributes<Object, Object> ra = getRegionAttributes();
+        AttributesFactory<Object, Object> factory = new AttributesFactory<>(ra);
         if (ra.getEvictionAttributes() == null
             || !ra.getEvictionAttributes().getAction().isOverflowToDisk()) {
           factory.setDiskStoreName(null);
         }
         factory.setDataPolicy(DataPolicy.REPLICATE);
-        factory.setCacheLoader(new TestCacheLoader() {
+        factory.setCacheLoader(new TestCacheLoader<Object, Object>() {
           @Override
-          public Object load2(LoaderHelper helper) throws CacheLoaderException {
+          public Object load2(LoaderHelper<Object, Object> helper) throws CacheLoaderException {
             return value;
           }
         });
@@ -3354,12 +3239,11 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-
     vm0.invoke(new CacheSerializableRunnable("Create region with bad loader") {
       @Override
       public void run2() throws CacheException {
-        RegionAttributes ra = getRegionAttributes();
-        AttributesFactory factory = new AttributesFactory(ra);
+        RegionAttributes<Object, Object> ra = getRegionAttributes();
+        AttributesFactory<Object, Object> factory = new AttributesFactory<>(ra);
         if (ra.getEvictionAttributes() == null
             || !ra.getEvictionAttributes().getAction().isOverflowToDisk()) {
           factory.setDiskStoreName(null);
@@ -3374,8 +3258,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Get") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
-        assertEquals(value, region.get(key));
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
+        assertThat(region.get(key)).isEqualTo(value);
       }
     });
   }
@@ -3384,13 +3268,12 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * Tests that a region is not kept alive
    */
   @Test
-  public void testNoRegionKeepAlive() throws Exception {
+  public void testNoRegionKeepAlive() {
     final String name = this.getUniqueName();
     final Object key = "KEEP_ALIVE_KEY";
     final Object value = "VALUE";
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
+    VM vm0 = VM.getVM(0);
 
     vm0.invoke(new CacheSerializableRunnable("Create region") {
       @Override
@@ -3402,9 +3285,9 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Populate region") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key, value);
-        assertEquals(value, region.get(key));
+        assertThat(region.get(key)).isEqualTo(value);
       }
     });
     vm0.invoke(new CacheSerializableRunnable("Close cache") {
@@ -3417,21 +3300,22 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Re-create cache") {
       @Override
       public void run2() throws CacheException {
-        Region region = createRegion(name);
+        Region<Object, Object> region = createRegion(name);
         // if this is a backup region, then it will find the data
         // otherwise it should not
         if (region.getAttributes().getDataPolicy().withPersistence()) {
-          assertEquals(value, region.get(key));
+          assertThat(region.get(key)).isEqualTo(value);
         } else {
-          assertNull(region.get(key));
+          assertThat(region.get(key)).isNull();
         }
       }
     });
   }
 
   @Test
-  public void testNetSearchObservesTtl() throws Exception {
-    assumeTrue(getRegionAttributes().getPartitionAttributes() == null);
+  public void testNetSearchObservesTtl() {
+    assumeThat(getRegionAttributes().getPartitionAttributes())
+        .withFailMessage("the region has partition attributes").isNull();
 
     final String name = this.getUniqueName();
     final int shortTimeout = 10; // ms
@@ -3439,22 +3323,20 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     final Object key = "KEY";
     final Object value = "VALUE";
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(2); // Other VM is from a different gemfire system
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(2); // Other VM is from a different gemfire system
 
     SerializableRunnable create = new CacheSerializableRunnable("Create with TTL") {
       @Override
       public void run2() throws CacheException {
-        AttributesFactory factory = new AttributesFactory(getRegionAttributes());
+        AttributesFactory<Object, Object> factory = new AttributesFactory<>(getRegionAttributes());
         factory.setStatisticsEnabled(true);
         ExpirationAttributes expire =
             new ExpirationAttributes(longTimeout, ExpirationAction.DESTROY);
         factory.setEntryTimeToLive(expire);
-        Region region = null;
         System.setProperty(LocalRegion.EXPIRY_MS_PROPERTY, "true");
         try {
-          region = createRegion(name, factory.create());
+          Region<Object, Object> region = createRegion(name, factory.create());
           region.create(key, value);
         } finally {
           System.getProperties().remove(LocalRegion.EXPIRY_MS_PROPERTY);
@@ -3468,8 +3350,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Create with TTL") {
       @Override
       public void run2() throws CacheException {
-        RegionAttributes ra = getRegionAttributes();
-        AttributesFactory factory = new AttributesFactory(ra);
+        RegionAttributes<?, ?> ra = getRegionAttributes();
+        AttributesFactory<?, ?> factory = new AttributesFactory<>(ra);
         final boolean partitioned =
             ra.getPartitionAttributes() != null || ra.getDataPolicy().withPartitioning();
         // MUST be nonmirrored, so turn off persistBackup if this is a disk region test
@@ -3500,9 +3382,9 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("get(key), expect null") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         Object got = region.get(key);
-        assertNull(got);
+        assertThat(got).isNull();
       }
     });
 
@@ -3510,16 +3392,17 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("get(key), expect value") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         Object got = region.get(key);
-        assertEquals(value, got);
+        assertThat(got).isEqualTo(value);
       }
     });
   }
 
   @Test
-  public void testNetSearchObservesIdleTime() throws Exception {
-    assumeTrue(getRegionAttributes().getPartitionAttributes() == null);
+  public void testNetSearchObservesIdleTime() {
+    assumeThat(getRegionAttributes().getPartitionAttributes())
+        .withFailMessage("the region has partition attributes").isNull();
 
     final String name = this.getUniqueName();
     final int shortTimeout = 10; // ms
@@ -3529,22 +3412,21 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
 
     // if using shared memory, make sure we use two VMs on different
     // gemfire systems
-    Host host = Host.getHost(0);
-    final VM vm0 = host.getVM(0);
-    final VM vm1 = host.getVM(2);
+
+    final VM vm0 = VM.getVM(0);
+    final VM vm1 = VM.getVM(2);
 
     SerializableRunnable create = new CacheSerializableRunnable("Create with IdleTimeout") {
       @Override
       public void run2() throws CacheException {
-        AttributesFactory factory = new AttributesFactory(getRegionAttributes());
+        AttributesFactory<Object, Object> factory = new AttributesFactory<>(getRegionAttributes());
         factory.setStatisticsEnabled(true);
         ExpirationAttributes expire =
             new ExpirationAttributes(longTimeout, ExpirationAction.DESTROY);
         factory.setEntryIdleTimeout(expire);
-        Region region = null;
         System.setProperty(LocalRegion.EXPIRY_MS_PROPERTY, "true");
         try {
-          region = createRegion(name, factory.create());
+          Region<Object, Object> region = createRegion(name, factory.create());
           region.create(key, value);
         } finally {
           System.getProperties().remove(LocalRegion.EXPIRY_MS_PROPERTY);
@@ -3558,8 +3440,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Create with IdleTimeout") {
       @Override
       public void run2() throws CacheException {
-        RegionAttributes ra = getRegionAttributes();
-        AttributesFactory factory = new AttributesFactory(ra);
+        RegionAttributes<?, ?> ra = getRegionAttributes();
+        AttributesFactory<?, ?> factory = new AttributesFactory<>(ra);
         final boolean partitioned =
             ra.getPartitionAttributes() != null || ra.getDataPolicy().withPartitioning();
         // MUST be nonmirrored, so turn off persistBackup if this is a disk region test
@@ -3590,9 +3472,9 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("get(key), expect null") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         Object got = region.get(key);
-        assertNull(got);
+        assertThat(got).isNull();
       }
     });
 
@@ -3600,68 +3482,65 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("get(key), expect value") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         Object got = region.get(key);
-        assertEquals(value, got);
+        assertThat(got).isEqualTo(value);
       }
     });
   }
 
-  private static TestCacheListener destroyListener = null;
+  private static TestCacheListener<Object, Object> destroyListener = null;
 
   /**
    * Tests that an entry in a distributed region that expires with a distributed destroy causes an
    * event in other VM with isExpiration flag set.
    */
   @Test
-  public void testEntryTtlDestroyEvent() throws Exception {
-    assumeTrue(getRegionAttributes().getPartitionAttributes() == null);
+  public void testEntryTtlDestroyEvent() {
+    assumeThat(getRegionAttributes().getPartitionAttributes())
+        .withFailMessage("the region has partition attributes").isNull();
 
     final String name = this.getUniqueName();
     final int timeout = 22; // ms
     final Object key = "KEY";
     final Object value = "VALUE";
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
 
-    class DestroyListener extends TestCacheListener {
+    class DestroyListener extends TestCacheListener<Object, Object> {
       boolean eventIsExpiration = false;
 
       @Override
-      public void afterDestroyBeforeAddEvent(EntryEvent event) {
+      public void afterDestroyBeforeAddEvent(EntryEvent<Object, Object> event) {
         eventIsExpiration = event.getOperation().isExpiration();
       }
 
       @Override
-      public void afterDestroy2(EntryEvent event) {
+      public void afterDestroy2(EntryEvent<Object, Object> event) {
         if (event.isOriginRemote()) {
-          assertTrue(!event.getDistributedMember().equals(getSystem().getDistributedMember()));
+          assertThat(event.getDistributedMember().equals(getSystem().getDistributedMember()))
+              .isFalse();
         } else {
-          assertEquals(getSystem().getDistributedMember(), event.getDistributedMember());
+          assertThat(event.getDistributedMember()).isEqualTo(
+              getSystem().getDistributedMember());
         }
-        assertEquals(Operation.EXPIRE_DESTROY, event.getOperation());
-        assertEquals(value, event.getOldValue());
+        assertThat(event.getOperation()).isEqualTo(Operation.EXPIRE_DESTROY);
+        assertThat(event.getOldValue()).isEqualTo(value);
         eventIsExpiration = event.getOperation().isExpiration();
       }
 
       @Override
-      public void afterCreate2(EntryEvent event) {
-        // ignore
-      }
+      public void afterCreate2(EntryEvent<Object, Object> ignored) {}
 
       @Override
-      public void afterUpdate2(EntryEvent event) {
-        // ignore
-      }
+      public void afterUpdate2(EntryEvent<Object, Object> ignored) {}
     }
 
-
     SerializableRunnable createRegion = new CacheSerializableRunnable("Create with Listener") {
       @Override
       public void run2() throws CacheException {
-        AttributesFactory fac = new AttributesFactory(getRegionAttributes());
+        AttributesFactory<Object, Object> fac = new AttributesFactory<>(getRegionAttributes());
         fac.addCacheListener(destroyListener = new DestroyListener());
         createRegion(name, fac.create());
       }
@@ -3672,7 +3551,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Create with TTL") {
       @Override
       public void run2() throws CacheException {
-        AttributesFactory factory = new AttributesFactory(getRegionAttributes());
+        AttributesFactory<?, ?> factory = new AttributesFactory<>(getRegionAttributes());
         factory.setStatisticsEnabled(true);
         ExpirationAttributes expire = new ExpirationAttributes(timeout, ExpirationAction.DESTROY);
         factory.setEntryTimeToLive(expire);
@@ -3696,38 +3575,29 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       // let region create finish before doing put
       // pause(10);
 
-      vm1.invoke(new SerializableCallable() {
+      vm1.invoke(new SerializableCallable<Object>() {
         @Override
-        public Object call() throws Exception {
-          Region region = getRootRegion().getSubregion(name);
+        public Object call() {
+          Region<Object, Object> region = getRootRegion().getSubregion(name);
           DestroyListener dl = (DestroyListener) region.getAttributes().getCacheListeners()[0];
           dl.enableEventHistory();
           region.put(key, value);
           // reset listener after create event
-          assertTrue(dl.wasInvoked());
-          List<CacheEvent> history = dl.getEventHistory();
-          CacheEvent ce = history.get(0);
+          assertThat(dl.wasInvoked()).isTrue();
+          List<CacheEvent<Object, Object>> history = dl.getEventHistory();
+          CacheEvent<Object, Object> ce = history.get(0);
           dl.disableEventHistory();
-          assertEquals(Operation.CREATE, ce.getOperation());
+          assertThat(ce.getOperation()).isEqualTo(Operation.CREATE);
           return null;
         }
       });
       vm0.invoke(new CacheSerializableRunnable("Check create received from vm1") {
         @Override
         public void run2() throws CacheException {
-          final Region region = getRootRegion().getSubregion(name);
-          WaitCriterion waitForCreate = new WaitCriterion() {
-            @Override
-            public boolean done() {
-              return region.getEntry(key) != null;
-            }
-
-            @Override
-            public String description() {
-              return "never saw create of " + key;
-            }
-          };
-          Wait.waitForCriterion(waitForCreate, 3000, 10, true);
+          final Region<Object, Object> region = getRootRegion().getSubregion(name);
+          await("never saw create of " + key)
+              .atMost(3, SECONDS).pollInterval(10, MILLISECONDS)
+              .until(() -> region.getEntry(key) != null);
         }
       });
 
@@ -3744,40 +3614,23 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Check local destroy") {
       @Override
       public void run2() throws CacheException {
-        final Region region = getRootRegion().getSubregion(name);
-        WaitCriterion waitForExpire = new WaitCriterion() {
-          @Override
-          public boolean done() {
-            return region.getEntry(key) == null;
-          }
-
-          @Override
-          public String description() {
-            return "never saw expire of " + key + " entry=" + region.getEntry(key);
-          }
-        };
-        Wait.waitForCriterion(waitForExpire, 4000, 10, true);
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
+        await("never saw expire of " + key)
+            .atMost(4, SECONDS).pollInterval(10, MILLISECONDS)
+            .until(() -> region.getEntry(key) == null);
       }
     });
 
     vm1.invoke(new CacheSerializableRunnable("Verify destroyed and event") {
       @Override
       public void run2() throws CacheException {
-        final Region region = getRootRegion().getSubregion(name);
-        WaitCriterion waitForExpire = new WaitCriterion() {
-          @Override
-          public boolean done() {
-            return region.getEntry(key) == null;
-          }
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
+        await("never saw expire of " + key)
+            .atMost(4, SECONDS).pollInterval(10, MILLISECONDS)
+            .until(() -> region.getEntry(key) == null);
 
-          @Override
-          public String description() {
-            return "never saw expire of " + key + " entry=" + region.getEntry(key);
-          }
-        };
-        Wait.waitForCriterion(waitForExpire, 4000, 10, true);
-        assertTrue(destroyListener.waitForInvocation(555));
-        assertTrue(((DestroyListener) destroyListener).eventIsExpiration);
+        assertThat(destroyListener.waitForInvocation(555)).isTrue();
+        assertThat(((DestroyListener) destroyListener).eventIsExpiration).isTrue();
       }
     });
   }
@@ -3788,7 +3641,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    */
   @Test
   public void testEntryTtlLocalDestroy() throws Exception {
-    assumeTrue(getRegionAttributes().getPartitionAttributes() == null);
+    assumeThat(getRegionAttributes().getPartitionAttributes())
+        .withFailMessage("the region has partition attributes").isNull();
 
     final boolean mirrored = getRegionAttributes().getDataPolicy().withReplication();
     final boolean partitioned = getRegionAttributes().getPartitionAttributes() != null
@@ -3803,19 +3657,18 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
 
     final String name = this.getUniqueName();
     final int timeout = 10; // ms
-    final Object key = "KEY";
-    final Object value = "VALUE";
+    final String key = "KEY";
+    final String value = "VALUE";
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
 
     SerializableRunnable create = new CacheSerializableRunnable("Populate") {
       @Override
       public void run2() throws CacheException {
         System.setProperty(LocalRegion.EXPIRY_MS_PROPERTY, "true");
         try {
-          Region region = createRegion(name);
+          createRegion(name);
         } finally {
           System.getProperties().remove(LocalRegion.EXPIRY_MS_PROPERTY);
         }
@@ -3827,7 +3680,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Create with TTL") {
       @Override
       public void run2() throws CacheException {
-        AttributesFactory factory = new AttributesFactory(getRegionAttributes());
+        AttributesFactory<Object, Object> factory = new AttributesFactory<>(getRegionAttributes());
         factory.setStatisticsEnabled(true);
         ExpirationAttributes expire =
             new ExpirationAttributes(timeout, ExpirationAction.LOCAL_DESTROY);
@@ -3839,32 +3692,33 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
             factory.setDataPolicy(DataPolicy.NORMAL);
           }
           factory.setSubscriptionAttributes(new SubscriptionAttributes(InterestPolicy.ALL));
-          factory.addCacheListener(new CountingDistCacheListener());
+          factory.addCacheListener(new CountingDistCacheListener<>());
         }
-        /**
-         * Crank up the expiration so test runs faster. This property only needs to be set while the
-         * region is created
-         */
+        // Crank up the expiration so test runs faster. This property only needs to be set while the
+        // region is created
         System.setProperty(LocalRegion.EXPIRY_MS_PROPERTY, "true");
         try {
           createRegion(name, factory.create());
-          if (mirrored)
+          if (mirrored) {
             fail("Should have thrown an IllegalStateException");
+          }
         } catch (IllegalStateException e) {
-          if (!mirrored)
+          if (!mirrored) {
             throw e;
+          }
         } finally {
           System.getProperties().remove(LocalRegion.EXPIRY_MS_PROPERTY);
         }
       }
     });
-    if (mirrored)
+    if (mirrored) {
       return;
+    }
 
-    vm1.invoke(new SerializableCallable() {
+    vm1.invoke(new SerializableCallable<Object>() {
       @Override
-      public Object call() throws Exception {
-        Region region = getRootRegion().getSubregion(name);
+      public Object call() {
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key, value);
         return null;
       }
@@ -3873,85 +3727,73 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Check local destroy") {
       @Override
       public void run2() throws CacheException {
-        final Region region = getRootRegion().getSubregion(name);
+        final Region<Object, Object> region = getRootRegion().getSubregion(name);
         // make sure we created the entry
-        {
-          CountingDistCacheListener l =
-              (CountingDistCacheListener) region.getAttributes().getCacheListeners()[0];
-          int retry = 1000;
-          while (retry-- > 0) {
-            try {
-              l.assertCount(1, 0, 0, 0);
-              // TODO: a race exists in which assertCount may also see a destroyCount of 1
-              logger.info("DEBUG: saw create");
-              break;
-            } catch (AssertionError e) {
-              if (retry > 0) {
-                Wait.pause(1);
-              } else {
-                throw e;
-              }
-            }
-          }
-        }
-
-        { // now make sure it expires
-          // this should happen really fast since timeout is 10 ms.
-          // But it may take longer in some cases because of thread
-          // scheduling delays and machine load (see GEODE-410).
-          // The previous code would fail after 100ms; now we wait 3000ms.
-          WaitCriterion waitForUpdate = new WaitCriterion() {
-            @Override
-            public boolean done() {
-              Region.Entry re = region.getEntry(key);
-              if (re != null) {
-                EntryExpiryTask eet = getEntryExpiryTask(region, key);
-                if (eet != null) {
-                  long stopTime =
-                      ((InternalDistributedSystem) (region.getCache().getDistributedSystem()))
-                          .getClock().getStopTime();
-                  logger.info("DEBUG: waiting for expire destroy expirationTime= "
-                      + eet.getExpirationTime() + " now=" + eet.calculateNow() + " stopTime="
-                      + stopTime + " currentTimeMillis=" + System.currentTimeMillis());
-                } else {
-                  logger.info("DEBUG: waiting for expire destroy but expiry task is null");
-                }
-              }
-              return re == null;
-            }
+        CountingDistCacheListener<Object, Object> l =
+            (CountingDistCacheListener<Object, Object>) region.getAttributes()
+                .getCacheListeners()[0];
+        waitAtMost(1, SECONDS).pollInterval(1, MILLISECONDS)
+            .untilAsserted(() -> l.assertCount(1, 0, 0, 0));
+
+        // now make sure it expires
+        // this should happen really fast since timeout is 10 ms.
+        // But it may take longer in some cases because of thread
+        // scheduling delays and machine load (see GEODE-410).
+        // The previous code would fail after 100ms; now we wait 3000ms.
 
-            @Override
-            public String description() {
-              String expiryInfo = "";
-              try {
-                EntryExpiryTask eet = getEntryExpiryTask(region, key);
-                if (eet != null) {
-                  expiryInfo = "expirationTime= " + eet.getExpirationTime() + " now="
-                      + eet.calculateNow() + " currentTimeMillis=" + System.currentTimeMillis();
+        try {
+          waitAtMost(30, SECONDS).pollInterval(1, MILLISECONDS)
+              .until(() -> {
+                Region.Entry re = region.getEntry(key);
+                if (re != null) {
+                  EntryExpiryTask eet = getEntryExpiryTask(region, key);
+                  if (eet != null) {
+                    long stopTime =
+                        getCache().getInternalDistributedSystem().getClock().getStopTime();
+                    logger.info("DEBUG: waiting for expire destroy expirationTime= "
+                        + eet.getExpirationTime() + " now=" + eet.calculateNow() + " stopTime="
+                        + stopTime + " currentTimeMillis=" + System.currentTimeMillis());
+                  } else {
+                    logger.info("DEBUG: waiting for expire destroy but expiry task is null");
+                  }
                 }
-              } catch (EntryNotFoundException ex) {
-                expiryInfo = "EntryNotFoundException when getting expiry task";
-              }
-              return "Entry for key " + key + " never expired (since it still exists) "
-                  + expiryInfo;
-            }
-          };
-          Wait.waitForCriterion(waitForUpdate, 30000, 1, true);
+                return re == null;
+              });
+        } catch (ConditionTimeoutException timeout) {
+          // Catching in order to inform about the final state
+          fail(determineExpiryFailureMessage(region, key), timeout);
         }
-        assertNull(region.getEntry(key));
+
+        assertThat(region.getEntry(key)).isNull();
       }
     });
 
     vm1.invoke(new CacheSerializableRunnable("Verify local") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         Region.Entry entry = region.getEntry(key);
-        assertEquals(value, entry.getValue());
+        assertThat(entry.getValue()).isEqualTo(value);
       }
     });
   }
 
+  private String determineExpiryFailureMessage(Region region, String key) {
+    String expiryInfo = "";
+    try {
+      EntryExpiryTask eet = getEntryExpiryTask(region, key);
+      if (eet != null) {
+        expiryInfo = "expirationTime= " + eet.getExpirationTime()
+            + " now=" + eet.calculateNow()
+            + " currentTimeMillis=" + System.currentTimeMillis();
+      }
+    } catch (EntryNotFoundException ex) {
+      expiryInfo = "EntryNotFoundException when getting expiry task";
+    }
+    return "Entry for key " + key + " never expired (since it still exists) "
+        + expiryInfo;
+  }
+
   private static EntryExpiryTask getEntryExpiryTask(Region r, Object key) {
     EntryExpiryTask result = null;
     try {
@@ -3966,21 +3808,20 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * Tests to makes sure that a distributed update resets the expiration timer.
    */
   @Test
-  public void testUpdateResetsIdleTime() throws Exception {
+  public void testUpdateResetsIdleTime() {
     final String name = this.getUniqueName();
     // test no longer waits for this timeout to expire
     final int timeout = 90; // seconds
     final Object key = "KEY";
     final Object value = "VALUE";
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
 
     vm0.invoke(new CacheSerializableRunnable("Create with Idle") {
       @Override
       public void run2() throws CacheException {
-        AttributesFactory factory = new AttributesFactory(getRegionAttributes());
+        AttributesFactory<Object, Object> factory = new AttributesFactory<>(getRegionAttributes());
         factory.setStatisticsEnabled(true);
         ExpirationAttributes expire = new ExpirationAttributes(timeout, ExpirationAction.DESTROY);
         factory.setEntryIdleTimeout(expire);
@@ -4001,7 +3842,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Create Region " + name) {
       @Override
       public void run2() throws CacheException {
-        AttributesFactory factory = new AttributesFactory(getRegionAttributes());
+        AttributesFactory<?, ?> factory = new AttributesFactory<>(getRegionAttributes());
         factory.setStatisticsEnabled(true);
         ExpirationAttributes expire = new ExpirationAttributes(timeout, ExpirationAction.DESTROY);
         factory.setEntryIdleTimeout(expire);
@@ -4016,8 +3857,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm1.invoke(new CacheSerializableRunnable("Update entry") {
       @Override
       public void run2() throws CacheException {
-        final Region r = getRootRegion().getSubregion(name);
-        assertNotNull(r);
+        final Region<Object, Object> r = getRootRegion().getSubregion(name);
+        assertThat(r).isNotNull();
         r.put(key, value);
       }
     });
@@ -4028,18 +3869,9 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
         final LocalRegion region = (LocalRegion) getRootRegion().getSubregion(name);
 
         // wait for update to reach us from vm1 (needed if no-ack)
-        WaitCriterion waitForUpdate = new WaitCriterion() {
-          @Override
-          public boolean done() {
-            return value.equals(region.get(key));
-          }
-
-          @Override
-          public String description() {
-            return "never saw update of " + key;
-          }
-        };
-        Wait.waitForCriterion(waitForUpdate, 3000, 10, true);
+        await("never saw key " + key + "equal to value " + value)
+            .atMost(3, SECONDS).pollInterval(10, MILLISECONDS)
+            .until(() -> value.equals(region.get(key)));
 
         EntryExpiryTask eet = region.getEntryExpiryTask(key);
         long createExpiryTime = (Long) region.get("createExpiryTime");
@@ -4053,7 +3885,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
   }
 
   private static final int NB1_CHUNK_SIZE = 500 * 1024; // ==
-                                                        // InitialImageOperation.CHUNK_SIZE_IN_BYTES
+  // InitialImageOperation.CHUNK_SIZE_IN_BYTES
   private static final int NB1_NUM_ENTRIES = 1000;
   private static final int NB1_VALUE_SIZE = NB1_CHUNK_SIZE * 10 / NB1_NUM_ENTRIES;
 
@@ -4062,11 +3894,11 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * getInitialImage.
    */
   @Test
-  public void testNonblockingGetInitialImage() throws Exception {
-    assumeTrue(supportsReplication());
+  public void testNonblockingGetInitialImage() {
+    assumeThat(supportsReplication()).isTrue();
     // don't run this test if global scope since its too difficult to predict
     // how many concurrent operations will occur
-    assumeFalse(getRegionAttributes().getScope().isGlobal());
+    assumeThat(getRegionAttributes().getScope().isGlobal()).isFalse();
 
     final String name = this.getUniqueName();
     final byte[][] values = new byte[NB1_NUM_ENTRIES][];
@@ -4076,32 +3908,29 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       Arrays.fill(values[i], (byte) 0x42);
     }
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm2 = host.getVM(2);
+    VM vm0 = VM.getVM(0);
+    VM vm2 = VM.getVM(2);
 
     SerializableRunnable create = new CacheSerializableRunnable("Create Mirrored Region") {
       @Override
       public void run2() throws CacheException {
         beginCacheXml();
         { // root region must be DACK because its used to sync up async subregions
-          AttributesFactory factory = new AttributesFactory();
+          AttributesFactory<?, ?> factory = new AttributesFactory<>();
           factory.setScope(Scope.DISTRIBUTED_ACK);
           factory.setDataPolicy(DataPolicy.NORMAL);
           factory.setSubscriptionAttributes(new SubscriptionAttributes(InterestPolicy.ALL));
-          org.apache.geode.test.dunit.LogWriterUtils.getLogWriter()
-              .info("MJT DEBUG: attrs0 are " + factory.create());
+          logger.info("MJT DEBUG: attrs0 are " + factory.create());
           createRootRegion(factory.create());
         }
         {
-          AttributesFactory factory = new AttributesFactory(getRegionAttributes());
+          AttributesFactory<?, ?> factory = new AttributesFactory<>(getRegionAttributes());
           factory.setSubscriptionAttributes(new SubscriptionAttributes(InterestPolicy.ALL));
           if (getRegionAttributes().getDataPolicy() == DataPolicy.NORMAL) {
             factory.setDataPolicy(DataPolicy.PRELOADED);
           }
-          org.apache.geode.test.dunit.LogWriterUtils.getLogWriter()
-              .info("MJT DEBUG: attrs1 are " + factory.create());
-          Region region = createRegion(name, factory.create());
+          logger.info("MJT DEBUG: attrs1 are " + factory.create());
+          createRegion(name, factory.create());
         }
         finishCacheXml(name);
         // reset slow
@@ -4109,18 +3938,17 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-
     vm0.invoke(new CacheSerializableRunnable("Create Nonmirrored Region") {
       @Override
       public void run2() throws CacheException {
         { // root region must be DACK because its used to sync up async subregions
-          AttributesFactory factory = new AttributesFactory();
+          AttributesFactory<?, ?> factory = new AttributesFactory<>();
           factory.setScope(Scope.DISTRIBUTED_ACK);
           factory.setDataPolicy(DataPolicy.EMPTY);
           createRootRegion(factory.create());
         }
         {
-          AttributesFactory factory = new AttributesFactory(getRegionAttributes());
+          AttributesFactory<?, ?> factory = new AttributesFactory<>(getRegionAttributes());
           createRegion(name, factory.create());
         }
         // reset slow
@@ -4131,11 +3959,11 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Put initial data") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Integer, byte[]> region = getRootRegion().getSubregion(name);
         for (int i = 0; i < NB1_NUM_ENTRIES; i++) {
-          region.put(new Integer(i), values[i]);
+          region.put(i, values[i]);
         }
-        assertEquals(NB1_NUM_ENTRIES, region.keySet().size());
+        assertThat(region.keySet().size()).isEqualTo(NB1_NUM_ENTRIES);
       }
     });
 
@@ -4144,55 +3972,48 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
         vm0.invokeAsync(new CacheSerializableRunnable("Do Nonblocking Operations") {
           @Override
           public void run2() throws CacheException {
-            Region region = getRootRegion().getSubregion(name);
+            Region<Object, Object> region = getRootRegion().getSubregion(name);
 
             // wait for profile of getInitialImage cache to show up
             final org.apache.geode.internal.cache.CacheDistributionAdvisor adv =
                 ((org.apache.geode.internal.cache.DistributedRegion) region)
                     .getCacheDistributionAdvisor();
             final int expectedProfiles = 1;
-            WaitCriterion ev = new WaitCriterion() {
-              @Override
-              public boolean done() {
-                DataPolicy currentPolicy = getRegionAttributes().getDataPolicy();
-                if (currentPolicy == DataPolicy.PRELOADED) {
-                  return (adv.advisePreloadeds().size()
-                      + adv.adviseReplicates().size()) >= expectedProfiles;
-                } else {
-                  return adv.adviseReplicates().size() >= expectedProfiles;
-                }
-              }
 
-              @Override
-              public String description() {
-                return "replicate count never reached " + expectedProfiles;
-              }
-            };
-            Wait.waitForCriterion(ev, 60 * 1000, 200, true);
+            await("replicate count never reached " + expectedProfiles)
+                .atMost(60, SECONDS).pollInterval(200, MILLISECONDS)
+                .until(() -> {
+                  DataPolicy currentPolicy = getRegionAttributes().getDataPolicy();
+                  if (currentPolicy == DataPolicy.PRELOADED) {
+                    return (adv.advisePreloadeds().size()
+                        + adv.adviseReplicates().size()) >= expectedProfiles;
+                  } else {
+                    return adv.adviseReplicates().size() >= expectedProfiles;
+                  }
+                });
 
             DataPolicy currentPolicy = getRegionAttributes().getDataPolicy();
-            int numProfiles = 0;
+            int numProfiles;
             if (currentPolicy == DataPolicy.PRELOADED) {
               numProfiles = adv.advisePreloadeds().size() + adv.adviseReplicates().size();
             } else {
               numProfiles = adv.adviseReplicates().size();
             }
-            assertTrue(numProfiles >= expectedProfiles);
+            assertThat(numProfiles >= expectedProfiles).isTrue();
 
             // operate on every odd entry with different value, alternating between
             // updates, invalidates, and destroys. These operations are likely
             // to be nonblocking if a sufficient number of updates get through
             // before the get initial image is complete.
             for (int i = 1; i < NB1_NUM_ENTRIES; i += 2) {
-              Object key = new Integer(i);
-              org.apache.geode.test.dunit.LogWriterUtils.getLogWriter()
-                  .info("Operation #" + i + " on key " + key);
+              Object key = i;
+              logger.info("Operation #" + i + " on key " + key);
               switch (i % 6) {
                 case 1: // UPDATE
                   // use the current timestamp so we know when it happened
                   // we could have used last modification timestamps, but
                   // this works without enabling statistics
-                  Object value = new Long(System.currentTimeMillis());
+                  Object value = System.currentTimeMillis();
                   region.put(key, value);
                   // no longer safe since get is not allowed to member doing GII
                   // if (getRegionAttributes().getScope().isDistributedAck()) {
@@ -4205,14 +4026,14 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
                   region.invalidate(key);
                   if (getRegionAttributes().getScope().isDistributedAck()) {
                     // do a nonblocking netSearch
-                    assertNull(region.get(key));
+                    assertThat(region.get(key)).isNull();
                   }
                   break;
                 case 5: // DESTROY
                   region.destroy(key);
                   if (getRegionAttributes().getScope().isDistributedAck()) {
                     // do a nonblocking netSearch
-                    assertNull(region.get(key));
+                    assertThat(region.get(key)).isNull();
                   }
                   break;
                 default:
@@ -4223,7 +4044,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
 
             // add some new keys
             for (int i = NB1_NUM_ENTRIES; i < NB1_NUM_ENTRIES + 200; i++) {
-              region.create(new Integer(i), new Long(System.currentTimeMillis()));
+              region.create(i, System.currentTimeMillis());
             }
             // now do a put and our DACK root region which will not complete
             // until processed on otherside which means everything done before this
@@ -4240,15 +4061,13 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
         public void run() {
           // if this is a no_ack test, then we need to slow down more because of the
           // pauses in the nonblocking operations
-          int pause = 200;
-          org.apache.geode.internal.cache.InitialImageOperation.slowImageProcessing = pause;
+          org.apache.geode.internal.cache.InitialImageOperation.slowImageProcessing = 200;
         }
       });
     }
 
-    org.apache.geode.test.dunit.LogWriterUtils.getLogWriter()
-        .info("Before GetInitialImage, data policy is " + getRegionAttributes().getDataPolicy()
-            + ", scope is " + getRegionAttributes().getScope());
+    logger.info("Before GetInitialImage, data policy is " + getRegionAttributes().getDataPolicy()
+        + ", scope is " + getRegionAttributes().getScope());
     AsyncInvocation asyncGII = vm2.invokeAsync(create);
 
     if (!getRegionAttributes().getScope().isGlobal()) {
@@ -4260,15 +4079,13 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
           org.apache.geode.internal.cache.InitialImageOperation.slowImageProcessing = 0;
         }
       });
-      org.apache.geode.test.dunit.LogWriterUtils.getLogWriter()
-          .info("after async nonblocking ops complete");
+      logger.info("after async nonblocking ops complete");
     }
 
     // wait for GII to complete
     ThreadUtils.join(asyncGII, 30 * 1000);
     final long iiComplete = System.currentTimeMillis();
-    org.apache.geode.test.dunit.LogWriterUtils.getLogWriter()
-        .info("Complete GetInitialImage at: " + System.currentTimeMillis());
+    logger.info("Complete GetInitialImage at: " + System.currentTimeMillis());
 
     if (getRegionAttributes().getScope().isGlobal()) {
       // wait for nonblocking operations to complete
@@ -4286,117 +4103,79 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Locally destroy region") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.localDestroyRegion();
       }
     });
-    org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info("after localDestroyRegion");
+    logger.info("after localDestroyRegion");
 
     // invoke repeating so noack regions wait for all updates to get processed
-    vm2.invokeRepeatingIfNecessary(new CacheSerializableRunnable("Verify entryCount") {
-      boolean entriesDumped = false;
+    vm2.invoke(repeatingIfNecessary(5000,
+        new CacheSerializableRunnable("Verify entryCount") {
+          boolean entriesDumped = false;
 
-      @Override
-      public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
-        // expected entry count (subtract entries destroyed)
-        int entryCount = NB1_NUM_ENTRIES + 200 - NB1_NUM_ENTRIES / 6;
-        int actualCount = region.entrySet(false).size();
-        if (actualCount == NB1_NUM_ENTRIES + 200) {
-          // entries not destroyed, dump entries that were supposed to have been destroyed
-          dumpDestroyedEntries(region);
-        }
-        assertEquals(entryCount, actualCount);
-      }
+          @Override
+          public void run2() throws CacheException {
+            Region<Object, Object> region = getRootRegion().getSubregion(name);
+            // expected entry count (subtract entries destroyed)
+            int entryCount = NB1_NUM_ENTRIES + 200 - NB1_NUM_ENTRIES / 6;
+            int actualCount = region.entrySet(false).size();
+            if (actualCount == NB1_NUM_ENTRIES + 200) {
+              // entries not destroyed, dump entries that were supposed to have been destroyed
+              dumpDestroyedEntries(region);
+            }
+            assertThat(actualCount).isEqualTo(entryCount);
+          }
 
-      private void dumpDestroyedEntries(Region region) throws EntryNotFoundException {
-        if (entriesDumped)
-          return;
-        entriesDumped = true;
+          private void dumpDestroyedEntries(Region region) throws EntryNotFoundException {
+            if (entriesDumped) {
+              return;
+            }
+            entriesDumped = true;
 
-        LogWriter logger = org.apache.geode.test.dunit.LogWriterUtils.getLogWriter();
-        logger.info("DUMPING Entries with values in VM that should have been destroyed:");
-        for (int i = 5; i < NB1_NUM_ENTRIES; i += 6) {
-          try {
-            logger.info(i + "-->" + ((org.apache.geode.internal.cache.LocalRegion) region)
-                .getValueInVM(new Integer(i)));
-          } catch (EntryNotFoundException expected) {
-            logger.info(i + "-->" + "CORRECTLY DESTROYED");
+            logger.info("DUMPING Entries with values in VM that should have been destroyed:");
+            for (int i = 5; i < NB1_NUM_ENTRIES; i += 6) {
+              try {
+                logger.info(i + "-->" + ((org.apache.geode.internal.cache.LocalRegion) region)
+                    .getValueInVM(i));
+              } catch (EntryNotFoundException expected) {
+                logger.info(i + "-->" + "CORRECTLY DESTROYED");
+              }
+            }
           }
-        }
-      }
-    }, 5000);
-    org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info("after verify entryCount");
-
+        }));
+    logger.info("after verify entryCount");
 
     vm2.invoke(new CacheSerializableRunnable("Verify keys/values & Nonblocking") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         // expected entry count (subtract entries destroyed)
         int entryCount = NB1_NUM_ENTRIES + 200 - NB1_NUM_ENTRIES / 6;
-        assertEquals(entryCount, region.entrySet(false).size());
+        assertThat(region.entrySet(false).size()).isEqualTo(entryCount);
         // determine how many entries were updated before getInitialImage
         // was complete
         int numConcurrent = 0;
-        for (int i = 0; i < NB1_NUM_ENTRIES + 200; i++) {
-          Region.Entry entry = region.getEntry(new Integer(i));
-          Object v = entry == null ? null : entry.getValue();
-          if (i < NB1_NUM_ENTRIES) { // old keys
-            switch (i % 6) {
-              // even keys are originals
-              case 0:
-              case 2:
-              case 4:
-                assertNotNull(entry);
-                assertTrue(Arrays.equals(values[i], (byte[]) v));
-                break;
-              case 1: // updated
-                assertNotNull(v);
-                assertTrue("Value for key " + i + " is not a Long, is a " + v.getClass().getName(),
-                    v instanceof Long);
-                Long timestamp = (Long) entry.getValue();
-                if (timestamp.longValue() < iiComplete) {
-                  numConcurrent++;
-                }
-                break;
-              case 3: // invalidated
-                assertNotNull(entry);
-                assertNull("Expected value for " + i + " to be null, but was " + v, v);
-                break;
-              case 5: // destroyed
-                assertNull(entry);
-                break;
-              default:
-                fail("unexpected modulus result: " + (i % 6));
-                break;
-            }
-          } else { // new keys
-            assertNotNull(v);
-            assertTrue("Value for key " + i + " is not a Long, is a " + v.getClass().getName(),
-                v instanceof Long);
-            Long timestamp = (Long) entry.getValue();
-            if (timestamp.longValue() < iiComplete) {
-              numConcurrent++;
-            }
-          }
-        }
-        org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info(name + ": " + numConcurrent
+        numConcurrent = verifyEntryUpdateCounts(region, numConcurrent, values, iiComplete);
+        logger.info(name + ": " + numConcurrent
             + " entries out of " + entryCount + " were updated concurrently with getInitialImage");
         // make sure at least some of them were concurrent
         if (region.getAttributes().getScope().isGlobal()) {
-          assertTrue("Too many concurrent updates when expected to block: " + numConcurrent,
-              numConcurrent < 10);
+          assertThat(numConcurrent < 10).describedAs(
+              "Too many concurrent updates when expected to block: " + numConcurrent).isTrue();
         } else {
           int min = 30;
-          assertTrue("Not enough updates concurrent with getInitialImage occurred to my liking. "
-              + numConcurrent + " entries out of " + entryCount
-              + " were updated concurrently with getInitialImage, and I'd expect at least " + min
-              + " or so", numConcurrent >= min);
+          assertThat(numConcurrent >= min).describedAs(
+              "Not enough updates concurrent with getInitialImage occurred to my liking. "
+                  + numConcurrent + " entries out of " + entryCount
+                  + " were updated concurrently with getInitialImage, and I'd expect at least "
+                  + min
+                  + " or so")
+              .isTrue();
         }
       }
     });
-    org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info("after verify key/values");
+    logger.info("after verify key/values");
   }
 
   /**
@@ -4404,13 +4183,13 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * getInitialImage.
    */
   @Test
-  public void testTXNonblockingGetInitialImage() throws Exception {
-    assumeTrue(supportsReplication());
-    assumeTrue(supportsTransactions());
+  public void testTXNonblockingGetInitialImage() {
+    assumeThat(supportsReplication()).isTrue();
+    assumeThat(supportsTransactions()).isTrue();
     // don't run this test if global scope since its too difficult to predict
     // how many concurrent operations will occur
-    assumeFalse(getRegionAttributes().getScope().isGlobal());
-    assumeFalse(getRegionAttributes().getDataPolicy().withPersistence());
+    assumeThat(getRegionAttributes().getScope().isGlobal()).isFalse();
+    assumeThat(getRegionAttributes().getDataPolicy().withPersistence()).isFalse();
 
     final String name = this.getUniqueName();
     final byte[][] values = new byte[NB1_NUM_ENTRIES][];
@@ -4420,23 +4199,22 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       Arrays.fill(values[i], (byte) 0x42);
     }
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm2 = host.getVM(2);
+    VM vm0 = VM.getVM(0);
+    VM vm2 = VM.getVM(2);
 
     SerializableRunnable create = new CacheSerializableRunnable("Create Mirrored Region") {
       @Override
       public void run2() throws CacheException {
         beginCacheXml();
         { // root region must be DACK because its used to sync up async subregions
-          AttributesFactory factory = new AttributesFactory();
+          AttributesFactory<?, ?> factory = new AttributesFactory<>();
           factory.setScope(Scope.DISTRIBUTED_ACK);
           factory.setDataPolicy(DataPolicy.NORMAL);
           factory.setSubscriptionAttributes(new SubscriptionAttributes(InterestPolicy.ALL));
           createRootRegion(factory.create());
         }
         {
-          AttributesFactory factory = new AttributesFactory(getRegionAttributes());
+          AttributesFactory<?, ?> factory = new AttributesFactory<>(getRegionAttributes());
           if (getRegionAttributes().getDataPolicy() == DataPolicy.NORMAL) {
             factory.setDataPolicy(DataPolicy.PRELOADED);
           }
@@ -4449,18 +4227,17 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-
     vm0.invoke(new CacheSerializableRunnable("Create Nonmirrored Region") {
       @Override
       public void run2() throws CacheException {
         { // root region must be DACK because its used to sync up async subregions
-          AttributesFactory factory = new AttributesFactory();
+          AttributesFactory<?, ?> factory = new AttributesFactory<>();
           factory.setScope(Scope.DISTRIBUTED_ACK);
           factory.setDataPolicy(DataPolicy.EMPTY);
           createRootRegion(factory.create());
         }
         {
-          AttributesFactory factory = new AttributesFactory(getRegionAttributes());
+          AttributesFactory<?, ?> factory = new AttributesFactory<>(getRegionAttributes());
           createRegion(name, factory.create());
         }
         // reset slow
@@ -4471,11 +4248,11 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Put initial data") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         for (int i = 0; i < NB1_NUM_ENTRIES; i++) {
-          region.put(new Integer(i), values[i]);
+          region.put(i, values[i]);
         }
-        assertEquals(NB1_NUM_ENTRIES, region.keySet().size());
+        assertThat(region.keySet().size()).isEqualTo(NB1_NUM_ENTRIES);
       }
     });
 
@@ -4484,45 +4261,38 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
         vm0.invokeAsync(new CacheSerializableRunnable("Do Nonblocking Operations") {
           @Override
           public void run2() throws CacheException {
-            Region region = getRootRegion().getSubregion(name);
+            Region<Object, Object> region = getRootRegion().getSubregion(name);
 
             // wait for profile of getInitialImage cache to show up
             final org.apache.geode.internal.cache.CacheDistributionAdvisor adv =
                 ((org.apache.geode.internal.cache.DistributedRegion) region)
                     .getCacheDistributionAdvisor();
             final int expectedProfiles = 1;
-            WaitCriterion ev = new WaitCriterion() {
-              @Override
-              public boolean done() {
-                DataPolicy currentPolicy = getRegionAttributes().getDataPolicy();
-                if (currentPolicy == DataPolicy.PRELOADED) {
-                  return (adv.advisePreloadeds().size()
-                      + adv.adviseReplicates().size()) >= expectedProfiles;
-                } else {
-                  return adv.adviseReplicates().size() >= expectedProfiles;
-                }
-              }
-
-              @Override
-              public String description() {
-                return "replicate count never reached " + expectedProfiles;
-              }
-            };
-            Wait.waitForCriterion(ev, 100 * 1000, 200, true);
 
+            await("replicate count never reached " + expectedProfiles)
+                .atMost(100, SECONDS).pollInterval(200, MILLISECONDS)
+                .until(() -> {
+                  DataPolicy currentPolicy = getRegionAttributes().getDataPolicy();
+                  if (currentPolicy == DataPolicy.PRELOADED) {
+                    return (adv.advisePreloadeds().size()
+                        + adv.adviseReplicates().size()) >= expectedProfiles;
+                  } else {
+                    return adv.adviseReplicates().size() >= expectedProfiles;
+                  }
+                });
             // operate on every odd entry with different value, alternating between
             // updates, invalidates, and destroys. These operations are likely
             // to be nonblocking if a sufficient number of updates get through
             // before the get initial image is complete.
             CacheTransactionManager txMgr = getCache().getCacheTransactionManager();
             for (int i = 1; i < NB1_NUM_ENTRIES; i += 2) {
-              Object key = new Integer(i);
+              Object key = i;
               switch (i % 6) {
                 case 1: // UPDATE
                   // use the current timestamp so we know when it happened
                   // we could have used last modification timestamps, but
                   // this works without enabling statistics
-                  Object value = new Long(System.currentTimeMillis());
+                  Object value = System.currentTimeMillis();
                   txMgr.begin();
                   region.put(key, value);
                   txMgr.commit();
@@ -4539,7 +4309,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
                   txMgr.commit();
                   if (getRegionAttributes().getScope().isDistributedAck()) {
                     // do a nonblocking netSearch
-                    assertNull(region.get(key));
+                    assertThat(region.get(key)).isNull();
                   }
                   break;
                 case 5: // DESTROY
@@ -4548,7 +4318,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
                   txMgr.commit();
                   if (getRegionAttributes().getScope().isDistributedAck()) {
                     // do a nonblocking netSearch
-                    assertNull(region.get(key));
+                    assertThat(region.get(key)).isNull();
                   }
                   break;
                 default:
@@ -4559,7 +4329,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
             // add some new keys
             for (int i = NB1_NUM_ENTRIES; i < NB1_NUM_ENTRIES + 200; i++) {
               txMgr.begin();
-              region.create(new Integer(i), new Long(System.currentTimeMillis()));
+              region.create(i, System.currentTimeMillis());
               txMgr.commit();
             }
             // now do a put and our DACK root region which will not complete
@@ -4577,15 +4347,13 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
         public void run() {
           // if this is a no_ack test, then we need to slow down more because of the
           // pauses in the nonblocking operations
-          int pause = 200;
-          org.apache.geode.internal.cache.InitialImageOperation.slowImageProcessing = pause;
+          org.apache.geode.internal.cache.InitialImageOperation.slowImageProcessing = 200;
         }
       });
     }
 
     AsyncInvocation asyncGII = vm2.invokeAsync(create);
 
-
     if (!getRegionAttributes().getScope().isGlobal()) {
       // wait for nonblocking operations to complete
       ThreadUtils.join(async, 30 * 1000);
@@ -4596,15 +4364,13 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
           org.apache.geode.internal.cache.InitialImageOperation.slowImageProcessing = 0;
         }
       });
-      org.apache.geode.test.dunit.LogWriterUtils.getLogWriter()
-          .info("after async nonblocking ops complete");
+      logger.info("after async nonblocking ops complete");
     }
 
     // wait for GII to complete
     ThreadUtils.join(asyncGII, 30 * 1000);
     final long iiComplete = System.currentTimeMillis();
-    org.apache.geode.test.dunit.LogWriterUtils.getLogWriter()
-        .info("Complete GetInitialImage at: " + System.currentTimeMillis());
+    logger.info("Complete GetInitialImage at: " + System.currentTimeMillis());
     if (getRegionAttributes().getScope().isGlobal()) {
       // wait for nonblocking operations to complete
       ThreadUtils.join(async, 30 * 1000);
@@ -4622,119 +4388,132 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Locally destroy region") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.localDestroyRegion();
       }
     });
 
     // invoke repeating so noack regions wait for all updates to get processed
-    vm2.invokeRepeatingIfNecessary(new CacheSerializableRunnable("Verify entryCount") {
-      boolean entriesDumped = false;
+    vm2.invoke(repeatingIfNecessary(5000,
+        new CacheSerializableRunnable("Verify entryCount") {
+          boolean entriesDumped = false;
 
-      @Override
-      public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
-        // expected entry count (subtract entries destroyed)
-        int entryCount = NB1_NUM_ENTRIES + 200 - NB1_NUM_ENTRIES / 6;
-        int actualCount = region.entrySet(false).size();
-        if (actualCount == NB1_NUM_ENTRIES + 200) {
-          // entries not destroyed, dump entries that were supposed to have been destroyed
-          dumpDestroyedEntries(region);
-        }
-        assertEquals(entryCount, actualCount);
-      }
-
-      private void dumpDestroyedEntries(Region region) throws EntryNotFoundException {
-        if (entriesDumped)
-          return;
-        entriesDumped = true;
+          @Override
+          public void run2() throws CacheException {
+            Region<Object, Object> region = getRootRegion().getSubregion(name);
+            // expected entry count (subtract entries destroyed)
+            int entryCount = NB1_NUM_ENTRIES + 200 - NB1_NUM_ENTRIES / 6;
+            int actualCount = region.entrySet(false).size();
+            if (actualCount == NB1_NUM_ENTRIES + 200) {
+              // entries not destroyed, dump entries that were supposed to have been destroyed
+              dumpDestroyedEntries(region);
+            }
+            assertThat(actualCount).isEqualTo(entryCount);
+          }
 
-        LogWriter logger = org.apache.geode.test.dunit.LogWriterUtils.getLogWriter();
-        logger.info("DUMPING Entries with values in VM that should have been destroyed:");
-        for (int i = 5; i < NB1_NUM_ENTRIES; i += 6) {
-          logger.info(i + "-->" + ((org.apache.geode.internal.cache.LocalRegion) region)
-              .getValueInVM(new Integer(i)));
-        }
-      }
-    }, 5000);
+          private void dumpDestroyedEntries(Region region) throws EntryNotFoundException {
+            if (entriesDumped) {
+              return;
+            }
+            entriesDumped = true;
 
+            logger.info("DUMPING Entries with values in VM that should have been destroyed:");
+            for (int i = 5; i < NB1_NUM_ENTRIES; i += 6) {
+              logger.info(i + "-->" + ((org.apache.geode.internal.cache.LocalRegion) region)
+                  .getValueInVM(i));
+            }
+          }
+        }));
 
     vm2.invoke(new CacheSerializableRunnable("Verify keys/values & Nonblocking") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         // expected entry count (subtract entries destroyed)
         int entryCount = NB1_NUM_ENTRIES + 200 - NB1_NUM_ENTRIES / 6;
-        assertEquals(entryCount, region.entrySet(false).size());
+        assertThat(region.entrySet(false).size()).isEqualTo(entryCount);
         // determine how many entries were updated before getInitialImage
         // was complete
         int numConcurrent = 0;
-        for (int i = 0; i < NB1_NUM_ENTRIES + 200; i++) {
-          Region.Entry entry = region.getEntry(new Integer(i));
-          Object v = entry == null ? null : entry.getValue();
-          if (i < NB1_NUM_ENTRIES) { // old keys
-            switch (i % 6) {
-              // even keys are originals
-              case 0:
-              case 2:
-              case 4:
-                assertNotNull(entry);
-                assertTrue(Arrays.equals(values[i], (byte[]) v));
-                break;
-              case 1: // updated
-                assertNotNull(v);
-                assertTrue("Value for key " + i + " is not a Long, is a " + v.getClass().getName(),
-                    v instanceof Long);
-                Long timestamp = (Long) entry.getValue();
-                if (timestamp.longValue() < iiComplete) {
-                  numConcurrent++;
-                }
-                break;
-              case 3: // invalidated
-                assertNotNull(entry);
-                assertNull("Expected value for " + i + " to be null, but was " + v, v);
-                break;
-              case 5: // destroyed
-                assertNull(entry);
-                break;
-              default:
-                fail("unexpected modulus result: " + (i % 6));
-                break;
-            }
-          } else { // new keys
-            assertNotNull(v);
-            assertTrue("Value for key " + i + " is not a Long, is a " + v.getClass().getName(),
-                v instanceof Long);
-            Long timestamp = (Long) entry.getValue();
-            if (timestamp.longValue() < iiComplete) {
-              numConcurrent++;
-            }
-          }
-        }
-        org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info(name + ": " + numConcurrent
+        numConcurrent = verifyEntryUpdateCounts(region, numConcurrent, values, iiComplete);
+        logger.info(name + ": " + numConcurrent
             + " entries out of " + entryCount + " were updated concurrently with getInitialImage");
         // make sure at least some of them were concurrent
         {
           int min = 30;
-          assertTrue("Not enough updates concurrent with getInitialImage occurred to my liking. "
-              + numConcurrent + " entries out of " + entryCount
-              + " were updated concurrently with getInitialImage, and I'd expect at least " + min
-              + " or so", numConcurrent >= min);
+          String description =
+              "Not enough updates concurrent with getInitialImage occurred to my liking. "
+                  + numConcurrent + " entries out of " + entryCount
+                  + " were updated concurrently with getInitialImage, and I'd expect at least "
+                  + min
+                  + " or so";
+          assertThat(numConcurrent >= min).describedAs(description).isTrue();
         }
       }
     });
   }
 
+  private int verifyEntryUpdateCounts(Region<Object, Object> region, int numConcurrent,
+      byte[][] values, long iiComplete) {
+    for (int i = 0; i < NB1_NUM_ENTRIES + 200; i++) {
+      Region.Entry entry = region.getEntry(i);
+      Object v = entry == null ? null : entry.getValue();
+      if (i < NB1_NUM_ENTRIES) { // old keys
+        switch (i % 6) {
+          // even keys are originals
+          case 0:
+          case 2:
+          case 4:
+            assertThat(entry).isNotNull();
+            assertThat(Arrays.equals(values[i], (byte[]) v)).isTrue();
+            break;
+          case 1: // updated
+            assertThat(v).isNotNull();
+            boolean condition = v instanceof Long;
+            assertThat(condition).describedAs(
+                "Value for key " + i + " is not a Long, is a " + v.getClass().getName()).isTrue();
+            Long timestamp = (Long) entry.getValue();
+            if (timestamp < iiComplete) {
+              numConcurrent++;
+            }
+            break;
+          case 3: // invalidated
+            assertThat(entry).isNotNull();
+            assertThat(v).describedAs("Expected value for " + i + " to be null, but was " + v)
+                .isNull();
+            break;
+          case 5: // destroyed
+            assertThat(entry).isNull();
+            break;
+          default:
+            fail("unexpected modulus result: " + (i % 6));
+            break;
+        }
+      } else { // new keys
+        assertThat(v).isNotNull();
+        boolean condition = v instanceof Long;
+        assertThat(condition).describedAs(
+            "Value for key " + i + " is not a Long, is a " + v.getClass().getName()).isTrue();
+        Long timestamp = (Long) entry.getValue();
+        if (timestamp < iiComplete) {
+          numConcurrent++;
+        }
+      }
+    }
+    return numConcurrent;
+  }
+
   @Ignore("TODO: test is disabled for 51542")
   @Test
   public void testNBRegionInvalidationDuringGetInitialImage() throws Exception {
-    assumeTrue(supportsReplication());
+    assumeThat(supportsReplication()).isTrue();
 
     disconnectAllFromDS();
 
     // don't run this for noAck, too many race conditions
-    if (getRegionAttributes().getScope().isDistributedNoAck())
+    if (getRegionAttributes().getScope().isDistributedNoAck()) {
       return;
+    }
 
     final String name = this.getUniqueName();
     final byte[][] values = new byte[NB1_NUM_ENTRIES][];
@@ -4744,23 +4523,22 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       Arrays.fill(values[i], (byte) 0x42);
     }
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm2 = host.getVM(2);
+    VM vm0 = VM.getVM(0);
+    VM vm2 = VM.getVM(2);
 
     SerializableRunnable create = new CacheSerializableRunnable("Create Mirrored Region") {
       @Override
       public void run2() throws CacheException {
         beginCacheXml();
         { // root region must be DACK because its used to sync up async subregions
-          AttributesFactory factory = new AttributesFactory();
+          AttributesFactory<?, ?> factory = new AttributesFactory<>();
           factory.setScope(Scope.DISTRIBUTED_ACK);
           factory.setDataPolicy(DataPolicy.NORMAL);
           factory.setSubscriptionAttributes(new SubscriptionAttributes(InterestPolicy.ALL));
           createRootRegion(factory.create());
         }
         {
-          AttributesFactory factory = new AttributesFactory(getRegionAttributes());
+          AttributesFactory<?, ?> factory = new AttributesFactory<>(getRegionAttributes());
           factory.setDataPolicy(DataPolicy.REPLICATE);
           createRegion(name, factory.create());
         }
@@ -4770,18 +4548,17 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-
     vm0.invoke(new CacheSerializableRunnable("Create Nonmirrored Region") {
       @Override
       public void run2() throws CacheException {
         { // root region must be DACK because its used to sync up async subregions
-          AttributesFactory factory = new AttributesFactory();
+          AttributesFactory<?, ?> factory = new AttributesFactory<>();
           factory.setScope(Scope.DISTRIBUTED_ACK);
           factory.setDataPolicy(DataPolicy.EMPTY);
           createRootRegion(factory.create());
         }
         {
-          AttributesFactory factory = new AttributesFactory(getRegionAttributes());
+          AttributesFactory<?, ?> factory = new AttributesFactory<>(getRegionAttributes());
           factory.setDataPolicy(DataPolicy.REPLICATE);
           createRegion(name, factory.create());
         }
@@ -4793,42 +4570,30 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Put initial data") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Integer, byte[]> region = getRootRegion().getSubregion(name);
         for (int i = 0; i < NB1_NUM_ENTRIES; i++) {
-          region.put(new Integer(i), values[i]);
+          region.put(i, values[i]);
         }
-        assertEquals(NB1_NUM_ENTRIES, region.keySet().size());
+        assertThat(region.keySet().size()).isEqualTo(NB1_NUM_ENTRIES);
       }
     });
 
-
-    // attachDebugger(vm0, "vm0");
-    // attachDebugger(vm2, "vm2");
-
     // start asynchronous process that does updates to the data
     AsyncInvocation async =
         vm0.invokeAsync(new CacheSerializableRunnable("Do Nonblocking Operations") {
           @Override
           public void run2() throws CacheException {
-            Region region = getRootRegion().getSubregion(name);
+            Region<Object, Object> region = getRootRegion().getSubregion(name);
 
             // wait for profile of getInitialImage cache to show up
             final org.apache.geode.internal.cache.CacheDistributionAdvisor adv =
                 ((org.apache.geode.internal.cache.DistributedRegion) region)
                     .getCacheDistributionAdvisor();
             final int expectedProfiles = 1;
-            WaitCriterion ev = new WaitCriterion() {
-              @Override
-              public boolean done() {
-                return adv.adviseReplicates().size() >= expectedProfiles;
-              }
 
-              @Override
-              public String description() {
-                return "profile count never reached " + expectedProfiles;
-              }
-            };
-            Wait.waitForCriterion(ev, 30 * 1000, 200, true);
+            await("profile count never reached " + expectedProfiles)
+                .atMost(30, SECONDS).pollInterval(200, MILLISECONDS)
+                .until(() -> adv.adviseReplicates().size(), greaterThanOrEqualTo(expectedProfiles));
 
             // operate on every odd entry with different value, alternating between
             // updates, invalidates, and destroys. These operations are likely
@@ -4845,13 +4610,13 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
                 flushIfNecessary(region);
               }
 
-              Object key = new Integer(i);
+              Object key = i;
               switch (i % 6) {
                 case 1: // UPDATE
                   // use the current timestamp so we know when it happened
                   // we could have used last modification timestamps, but
                   // this works without enabling statistics
-                  Object value = new Long(System.currentTimeMillis());
+                  Object value = System.currentTimeMillis();
                   region.put(key, value);
                   break;
                 case 3: // INVALIDATE
@@ -4859,14 +4624,15 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
                   if (getRegionAttributes().getScope().isDistributedAck()) {
                     // do a nonblocking netSearch
                     value = region.get(key);
-                    assertNull("Expected null value for key: " + i + " but got " + value, value);
+                    assertThat(value).describedAs(
+                        "Expected null value for key: " + i + " but got " + value).isNull();
                   }
                   break;
                 case 5: // DESTROY
                   region.destroy(key);
                   if (getRegionAttributes().getScope().isDistributedAck()) {
                     // do a nonblocking netSearch
-                    assertNull(region.get(key));
+                    assertThat(region.get(key)).isNull();
                   }
                   break;
                 default:
@@ -4892,15 +4658,13 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
           getRootRegion();
           // if this is a no_ack test, then we need to slow down more because of the
           // pauses in the nonblocking operations
-          int pause = /* getRegionAttributes().getScope().isAck() ? */100/* : 300 */;
-          org.apache.geode.internal.cache.InitialImageOperation.slowImageProcessing = pause;
+          org.apache.geode.internal.cache.InitialImageOperation.slowImageProcessing = 100;
         }
       });
     }
 
     AsyncInvocation asyncGII = vm2.invokeAsync(create);
 
-
     if (!getRegionAttributes().getScope().isGlobal()) {
       // wait for nonblocking operations to complete
       try {
@@ -4913,15 +4677,13 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
           }
         });
       }
-      org.apache.geode.test.dunit.LogWriterUtils.getLogWriter()
-          .info("after async nonblocking ops complete");
+      logger.info("after async nonblocking ops complete");
     }
 
     // wait for GII to complete
     ThreadUtils.join(asyncGII, 30 * 1000);
     final long iiComplete = System.currentTimeMillis();
-    org.apache.geode.test.dunit.LogWriterUtils.getLogWriter()
-        .info("Complete GetInitialImage at: " + System.currentTimeMillis());
+    logger.info("Complete GetInitialImage at: " + System.currentTimeMillis());
     if (getRegionAttributes().getScope().isGlobal()) {
       // wait for nonblocking operations to complete
       ThreadUtils.join(async, 30 * 1000);
@@ -4938,63 +4700,66 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Locally destroy region") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.localDestroyRegion();
       }
     });
 
-
     // invoke repeating so noack regions wait for all updates to get processed
-    vm2.invokeRepeatingIfNecessary(new CacheSerializableRunnable("Verify entryCount") {
-      private boolean entriesDumped = false;
+    vm2.invoke(repeatingIfNecessary(3000,
+        new CacheSerializableRunnable("Verify entryCount") {
+          private boolean entriesDumped = false;
 
-      @Override
-      public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
-        // expected entry count (subtract entries destroyed)
-        int entryCount = NB1_NUM_ENTRIES - NB1_NUM_ENTRIES / 6;
-        int actualCount = region.entrySet(false).size();
-        if (actualCount == NB1_NUM_ENTRIES) {
-          // entries not destroyed, dump entries that were supposed to have been destroyed
-          dumpDestroyedEntries(region);
-        }
-        assertEquals(entryCount, actualCount);
-      }
+          @Override
+          public void run2() throws CacheException {
+            Region<Object, Object> region = getRootRegion().getSubregion(name);
+            // expected entry count (subtract entries destroyed)
+            int entryCount = NB1_NUM_ENTRIES - NB1_NUM_ENTRIES / 6;
+            int actualCount = region.entrySet(false).size();
+            if (actualCount == NB1_NUM_ENTRIES) {
+              // entries not destroyed, dump entries that were supposed to have been destroyed
+              dumpDestroyedEntries(region);
+            }
+            assertThat(actualCount).isEqualTo(entryCount);
+          }
 
-      private void dumpDestroyedEntries(Region region) throws EntryNotFoundException {
-        if (entriesDumped)
-          return;
-        entriesDumped = true;
+          private void dumpDestroyedEntries(Region region) throws EntryNotFoundException {
+            if (entriesDumped) {
+              return;
+            }
+            entriesDumped = true;
 
-        LogWriter logger = org.apache.geode.test.dunit.LogWriterUtils.getLogWriter();
-        logger.info("DUMPING Entries with values in VM that should have been destroyed:");
-        for (int i = 5; i < NB1_NUM_ENTRIES; i += 6) {
-          logger.info(i + "-->" + ((org.apache.geode.internal.cache.LocalRegion) region)
-              .getValueInVM(new Integer(i)));
-        }
-      }
-    }, 3000);
+            logger.info("DUMPING Entries with values in VM that should have been destroyed:");
+            for (int i = 5; i < NB1_NUM_ENTRIES; i += 6) {
+              logger.info(i + "-->" + ((org.apache.geode.internal.cache.LocalRegion) region)
+                  .getValueInVM(i));
+            }
+          }
+        }));
 
     vm2.invoke(new CacheSerializableRunnable("Verify keys/values & Nonblocking") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Integer, Object> region = getRootRegion().getSubregion(name);
         // expected entry count (subtract entries destroyed)
         int entryCount = NB1_NUM_ENTRIES - NB1_NUM_ENTRIES / 6;
-        assertEquals(entryCount, region.entrySet(false).size());
+        assertThat(region.entrySet(false).size()).isEqualTo(entryCount);
         // determine how many entries were updated before getInitialImage
         // was complete
         int numConcurrent = 0;
 
         for (int i = 0; i < NB1_NUM_ENTRIES; i++) {
-          Region.Entry entry = region.getEntry(new Integer(i));
+          Region.Entry entry = region.getEntry(i);
           if (i < 301) {
             if (i % 6 == 5) {
-              assertNull("Expected entry for " + i + " to be destroyed but it is " + entry, entry); // destroyed
+              // destroyed
+              assertThat(entry).describedAs(
+                  "Expected entry for " + i + " to be destroyed but it is " + entry).isNull();
             } else {
-              assertNotNull(entry);
+              assertThat(entry).isNotNull();
               Object v = entry.getValue();
-              assertNull("Expected value for " + i + " to be null, but was " + v, v);
+              assertThat(v).describedAs("Expected value for " + i + " to be null, but was " + v)
+                  .isNull();
             }
           } else {
             Object v = entry == null ? null : entry.getValue();
@@ -5003,25 +4768,29 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
               case 0:
               case 2:
               case 4:
-                assertNotNull(entry);
-                assertNull("Expected value for " + i + " to be null, but was " + v, v);
+                assertThat(entry).isNotNull();
+                assertThat(v).describedAs("Expected value for " + i + " to be null, but was " + v)
+                    .isNull();
                 break;
               case 1: // updated
-                assertNotNull("Expected to find an entry for #" + i, entry);
-                assertNotNull("Expected to find a value for #" + i, v);
-                assertTrue("Value for key " + i + " is not a Long, is a " + v.getClass().getName(),
-                    v instanceof Long);
+                assertThat(entry).describedAs("Expected to find an entry for #" + i).isNotNull();
+                assertThat(v).describedAs("Expected to find a value for #" + i).isNotNull();
+                boolean condition = v instanceof Long;
+                assertThat(condition).describedAs(
+                    "Value for key " + i + " is not a Long, is a " + v.getClass().getName())
+                    .isTrue();
                 Long timestamp = (Long) entry.getValue();
-                if (timestamp.longValue() < iiComplete) {
+                if (timestamp < iiComplete) {
                   numConcurrent++;
                 }
                 break;
               case 3: // invalidated
-                assertNotNull("Expected to find an entry for #" + i, entry);
-                assertNull("Expected value for " + i + " to be null, but was " + v, v);
+                assertThat(entry).describedAs("Expected to find an entry for #" + i).isNotNull();
+                assertThat(v).describedAs("Expected value for " + i + " to be null, but was " + v)
+                    .isNull();
                 break;
               case 5: // destroyed
-                assertNull("Expected to not find an entry for #" + i, entry);
+                assertThat(entry).describedAs("Expected to not find an entry for #" + i).isNull();
                 break;
               default:
                 fail("unexpected modulus result: " + (i % 6));
@@ -5029,7 +4798,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
             }
           }
         }
-        org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info(name + ": " + numConcurrent
+        logger.info(name + ": " + numConcurrent
             + " entries out of " + entryCount + " were updated concurrently with getInitialImage");
 
         // [sumedh] Occasionally fails. Do these assertions really make sense?
@@ -5037,22 +4806,22 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
 
         // make sure at least some of them were concurrent
         if (getRegionAttributes().getScope().isGlobal()) {
-          assertTrue("Too many concurrent updates when expected to block: " + numConcurrent,
-              numConcurrent < 300);
+          assertThat(numConcurrent < 300).describedAs(
+              "Too many concurrent updates when expected to block: " + numConcurrent).isTrue();
         } else {
-          assertTrue(
+          assertThat(numConcurrent >= 30).describedAs(
               "Not enough updates concurrent with getInitialImage occurred to my liking. "
                   + numConcurrent + " entries out of " + entryCount
-                  + " were updated concurrently with getInitialImage, and I'd expect at least 50 or so",
-              numConcurrent >= 30);
+                  + " were updated concurrently with getInitialImage, and I'd expect at least 50 or so")
+              .isTrue();
         }
       }
     });
   }
 
   @Test
-  public void testNBRegionDestructionDuringGetInitialImage() throws Exception {
-    assumeTrue(supportsReplication());
+  public void testNBRegionDestructionDuringGetInitialImage() {
+    assumeThat(supportsReplication()).isTrue();
 
     final String name = this.getUniqueName();
     final byte[][] values = new byte[NB1_NUM_ENTRIES][];
@@ -5062,21 +4831,20 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       Arrays.fill(values[i], (byte) 0x42);
     }
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm2 = host.getVM(2);
+    VM vm0 = VM.getVM(0);
+    VM vm2 = VM.getVM(2);
 
     vm0.invoke(new CacheSerializableRunnable("Create Nonmirrored Region") {
       @Override
       public void run2() throws CacheException {
         { // root region must be DACK because its used to sync up async subregions
-          AttributesFactory factory = new AttributesFactory();
+          AttributesFactory<?, ?> factory = new AttributesFactory<>();
           factory.setScope(Scope.DISTRIBUTED_ACK);
           factory.setDataPolicy(DataPolicy.EMPTY);
           createRootRegion(factory.create());
         }
         {
-          AttributesFactory factory = new AttributesFactory(getRegionAttributes());
+          AttributesFactory<?, ?> factory = new AttributesFactory<>(getRegionAttributes());
           createRegion(name, factory.create());
         }
         // reset slow
@@ -5087,15 +4855,14 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(new CacheSerializableRunnable("Put initial data") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Integer, byte[]> region = getRootRegion().getSubregion(name);
         for (int i = 0; i < NB1_NUM_ENTRIES; i++) {
-          region.put(new Integer(i), values[i]);
+          region.put(i, values[i]);
         }
-        assertEquals(NB1_NUM_ENTRIES, region.keySet().size());
+        assertThat(region.keySet().size()).isEqualTo(NB1_NUM_ENTRIES);
       }
     });
 
-
     // attachDebugger(vm0, "vm0");
     // attachDebugger(vm2, "vm2");
 
@@ -5105,7 +4872,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
           @Override
           public void run2() throws CacheException {
             Wait.pause(200); // give the gii guy a chance to start
-            Region region = getRootRegion().getSubregion(name);
+            Region<Object, Object> region = getRootRegion().getSubregion(name);
 
             // wait for profile of getInitialImage cache to show up
             final org.apache.geode.internal.cache.CacheDistributionAdvisor adv =
@@ -5113,18 +4880,9 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
                     .getCacheDistributionAdvisor();
             // int numProfiles;
             final int expectedProfiles = 1;
-            WaitCriterion ev = new WaitCriterion() {
-              @Override
-              public boolean done() {
-                return expectedProfiles == adv.adviseReplicates().size();
-              }
-
-              @Override
-              public String description() {
-                return "profile count never became exactly " + expectedProfiles;
-              }
-            };
-            Wait.waitForCriterion(ev, 60 * 1000, 200, true);
+            await("profile count never became exactly " + expectedProfiles)
+                .atMost(1, MINUTES).pollInterval(200, MILLISECONDS)
+                .until(() -> adv.adviseReplicates().size(), equalTo(expectedProfiles));
 
             // since we want to force a GII while updates are flying, make sure
             // the other VM gets its CreateRegionResponse and starts its GII
@@ -5140,13 +4898,13 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
             // before the get initial image is complete.
             for (int i = 1; i < 301; i += 2) {
               // getLogWriter().info("doing nonblocking op #"+i);
-              Object key = new Integer(i);
+              Object key = i;
               switch (i % 6) {
                 case 1: // UPDATE
                   // use the current timestamp so we know when it happened
                   // we could have used last modification timestamps, but
                   // this works without enabling statistics
-                  Object value = new Long(System.currentTimeMillis());
+                  Object value = System.currentTimeMillis();
                   region.put(key, value);
                   // no longer safe since get is not allowed to member doing GII
                   // if (getRegionAttributes().getScope().isDistributedAck()) {
@@ -5160,14 +4918,15 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
                   if (region.getAttributes().getScope().isDistributedAck()) {
                     // do a nonblocking netSearch
                     value = region.get(key);
-                    assertNull("Expected null value for key: " + i + " but got " + value, value);
+                    assertThat(value).describedAs(
+                        "Expected null value for key: " + i + " but got " + value).isNull();
                   }
                   break;
                 case 5: // DESTROY
                   region.destroy(key);
                   if (region.getAttributes().getScope().isDistributedAck()) {
                     // do a nonblocking netSearch
-                    assertNull(region.get(key));
+                    assertThat(region.get(key)).isNull();
                   }
                   break;
                 default:
@@ -5184,7 +4943,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
             // until processed on otherside which means everything done before this
             // point has been processed
             {
-              Region rr = getRootRegion();
+              Region<String, String> rr = getRootRegion();
               if (rr != null) {
                 rr.put("DONE", "FLUSH_OPS");
               }
@@ -5200,21 +4959,20 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
             @Override
             public void run2() throws CacheException {
               if (!getRegionAttributes().getScope().isGlobal()) {
-                int pause = 200;
-                org.apache.geode.internal.cache.InitialImageOperation.slowImageProcessing = pause;
+                org.apache.geode.internal.cache.InitialImageOperation.slowImageProcessing = 200;
               }
 
               beginCacheXml();
               { // root region must be DACK because its used to sync up async subregions
-                AttributesFactory factory = new AttributesFactory();
+                AttributesFactory<?, ?> factory = new AttributesFactory<>();
                 factory.setScope(Scope.DISTRIBUTED_ACK);
                 factory.setDataPolicy(DataPolicy.NORMAL);
                 factory.setSubscriptionAttributes(new SubscriptionAttributes(InterestPolicy.ALL));
                 createRootRegion(factory.create());
               }
               {
-                RegionAttributes ra = getRegionAttributes();
-                AttributesFactory factory = new AttributesFactory(ra);
+                RegionAttributes<?, ?> ra = getRegionAttributes();
+                AttributesFactory<?, ?> factory = new AttributesFactory<>(ra);
                 if (ra.getDataPolicy().withPersistence()) {
                   factory.setDataPolicy(DataPolicy.PERSISTENT_REPLICATE);
                 } else {
@@ -5231,8 +4989,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
               } catch (InterruptedException ie) {
                 fail("interrupted");
               }
-              assertTrue(getRootRegion().getSubregion(name) == null
-                  || getRegionAttributes().getScope().isGlobal());
+              assertThat(getRootRegion().getSubregion(name) == null
+                  || getRegionAttributes().getScope().isGlobal()).isTrue();
             }
           });
       if (getRegionAttributes().getScope().isGlobal()) {
@@ -5248,15 +5006,13 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
             org.apache.geode.internal.cache.InitialImageOperation.slowImageProcessing = 0;
           }
         });
-        org.apache.geode.test.dunit.LogWriterUtils.getLogWriter()
-            .info("after async nonblocking ops complete");
+        logger.info("after async nonblocking ops complete");
       }
 
       // wait for GII to complete
       // getLogWriter().info("starting wait for GetInitialImage Completion");
       ThreadUtils.join(asyncGII, 30 * 1000);
-      org.apache.geode.test.dunit.LogWriterUtils.getLogWriter()
-          .info("Complete GetInitialImage at: " + System.currentTimeMillis());
+      logger.info("Complete GetInitialImage at: " + System.currentTimeMillis());
       if (getRegionAttributes().getScope().isGlobal()) {
         // wait for nonblocking operations to complete
         ThreadUtils.join(async, 30 * 1000);
@@ -5279,8 +5035,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * @since GemFire 3.5
    */
   @Test
-  public void testNoDataSerializer() throws Exception {
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+  public void testNoDataSerializer() {
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
 
@@ -5291,15 +5047,14 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
-    VM vm2 = host.getVM(2);
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
+    VM vm2 = VM.getVM(2);
 
-    org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info(name + ": before creates");
+    logger.info(name + ": before creates");
     vm0.invoke(create);
     vm1.invoke(create);
-    org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info(name + ": after creates");
+    logger.info(name + ": after creates");
 
     final Object key = "KEY";
     final Object key2 = "KEY2";
@@ -5313,7 +5068,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
         disconnectFromDS();
       }
     });
-    org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info(name + ": after vm2 disconnect");
+    logger.info(name + ": after vm2 disconnect");
 
     try {
       vm0.invoke(new CacheSerializableRunnable("Put int") {
@@ -5322,22 +5077,21 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
           Class c = IntWrapper.IntWrapperSerializer.class;
           IntWrapper.IntWrapperSerializer serializer =
               (IntWrapper.IntWrapperSerializer) DataSerializer.register(c);
-          org.apache.geode.test.dunit.LogWriterUtils.getLogWriter()
-              .info("Registered serializer id:" + serializer.getId() + " class:" + c.getName());
+          logger.info("Registered serializer id:" + serializer.getId() + " class:" + c.getName());
 
-          Region region = getRootRegion().getSubregion(name);
+          Region<Object, Object> region = getRootRegion().getSubregion(name);
           region.put(key, new IntWrapper(intValue));
 
           flushIfNecessary(region);
-          assertTrue(serializer.wasInvoked);
+          assertThat(serializer.wasInvoked).isTrue();
         }
       });
-      org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info(name + ": after vm0 put");
+      logger.info(name + ": after vm0 put");
 
       SerializableRunnable get = new CacheSerializableRunnable("Get int") {
         @Override
         public void run2() throws CacheException {
-          Region region = getRootRegion().getSubregion(name);
+          Region<Object, Object> region = getRootRegion().getSubregion(name);
           // wait a while for the serializer to be registered
           // A race condition exists in the product in which
           // this thread can be stuck waiting in getSerializer
@@ -5351,29 +5105,20 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
           final int savVal = InternalDataSerializer.GetMarker.WAIT_MS;
           InternalDataSerializer.GetMarker.WAIT_MS = 1;
           try {
-            WaitCriterion ev = new WaitCriterion() {
-              @Override
-              public boolean done() {
-                return InternalDataSerializer.getSerializer((byte) 120) != null;
-              }
-
-              @Override
-              public String description() {
-                return "DataSerializer with id 120 was never registered";
-              }
-            };
-            Wait.waitForCriterion(ev, 30 * 1000, 10, true);
+            await("DataSerializer with id 120 was never registered")
+                .atMost(30, SECONDS).pollInterval(10, MILLISECONDS)
+                .until(() -> InternalDataSerializer.getSerializer((byte) 120) != null);
           } finally {
             InternalDataSerializer.GetMarker.WAIT_MS = savVal;
           }
           IntWrapper value = (IntWrapper) region.get(key);
-          assertNotNull(InternalDataSerializer.getSerializer((byte) 120));
-          assertNotNull(value);
-          assertEquals(intValue, value.intValue);
+          assertThat(InternalDataSerializer.getSerializer((byte) 120)).isNotNull();
+          assertThat(value).isNotNull();
+          assertThat(value.intValue).isEqualTo(intValue);
         }
       };
       vm1.invoke(get);
-      org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info(name + ": after vm1 get");
+      logger.info(name + ": after vm1 get");
 
       // Make sure that VMs that connect after registration can get the
       // serializer
@@ -5388,38 +5133,38 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
         }
       });
       vm2.invoke(create);
-      org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info(name + ": after vm2 create");
+      logger.info(name + ": after vm2 create");
       vm2.invoke(new CacheSerializableRunnable("Put long") {
         @Override
         public void run2() throws CacheException {
-          Region region = getRootRegion().getSubregion(name);
+          Region<Object, Object> region = getRootRegion().getSubregion(name);
           region.put(key2, new LongWrapper(longValue));
 
           flushIfNecessary(region);
 
           LongWrapper.LongWrapperSerializer serializer =
               (LongWrapper.LongWrapperSerializer) InternalDataSerializer.getSerializer((byte) 121);
-          assertTrue(serializer.wasInvoked);
+          assertThat(serializer.wasInvoked).isTrue();
         }
       });
-      org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info(name + ": after vm2 put");
+      logger.info(name + ": after vm2 put");
       vm2.invoke(get);
-      org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info(name + ": after vm2 get");
+      logger.info(name + ": after vm2 get");
 
       SerializableRunnable get2 = new CacheSerializableRunnable("Get long") {
         @Override
         public void run2() throws CacheException {
-          Region region = getRootRegion().getSubregion(name);
+          Region<Object, Object> region = getRootRegion().getSubregion(name);
           LongWrapper value = (LongWrapper) region.get(key2);
-          assertNotNull(InternalDataSerializer.getSerializer((byte) 121));
-          assertNotNull(value);
-          assertEquals(longValue, value.longValue);
+          assertThat(InternalDataSerializer.getSerializer((byte) 121)).isNotNull();
+          assertThat(value).isNotNull();
+          assertThat(value.longValue).isEqualTo(longValue);
         }
       };
       vm0.invoke(get2);
-      org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info(name + ": after vm0 get2");
+      logger.info(name + ": after vm0 get2");
       vm1.invoke(get2);
-      org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info(name + ": after vm1 get2");
+      logger.info(name + ": after vm1 get2");
 
       // wait a little while for other netsearch requests to return
       // before unregistering the serializers that will be needed to process these
@@ -5427,7 +5172,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     } finally {
       Wait.pause(1500);
       unregisterAllSerializers();
-      org.apache.geode.test.dunit.LogWriterUtils.getLogWriter().info(name + ": after unregister");
+      logger.info(name + ": after unregister");
     }
   }
 
@@ -5438,8 +5183,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * @since GemFire 3.5
    */
   @Test
-  public void testNoInstantiator() throws Exception {
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+  public void testNoInstantiator() {
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     final String name = this.getUniqueName();
 
@@ -5450,10 +5195,9 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
-    VM vm2 = host.getVM(2);
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
+    VM vm2 = VM.getVM(2);
 
     vm0.invoke(create);
     vm1.invoke(create);
@@ -5476,7 +5220,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       public void run2() throws CacheException {
         Instantiator.register(new DSIntWrapper.DSIntWrapperInstantiator());
 
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         region.put(key, new DSIntWrapper(intValue));
 
         flushIfNecessary(region);
@@ -5486,12 +5230,12 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable get = new CacheSerializableRunnable("Get int") {
       @Override
       public void run2() throws CacheException {
-        Region region = getRootRegion().getSubregion(name);
+        Region<Object, Object> region = getRootRegion().getSubregion(name);
         DSIntWrapper.DSIntWrapperInstantiator inst = new DSIntWrapper.DSIntWrapperInstantiator();
-        assertNotNull(InternalInstantiator.getInstantiator(inst.getId()));
+        assertThat(InternalInstantiator.getInstantiator(inst.getId())).isNotNull();
         DSIntWrapper value = (DSIntWrapper) region.get(key);
-        assertNotNull(value);
-        assertEquals(intValue, value.intValue);
+        assertThat(value).isNotNull();
+        assertThat(value.intValue).isEqualTo(intValue);
       }
     };
     try {
@@ -5512,7 +5256,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       vm2.invoke(new CacheSerializableRunnable("Put long") {
         @Override
         public void run2() throws CacheException {
-          Region region = getRootRegion().getSubregion(name);
+          Region<Object, Object> region = getRootRegion().getSubregion(name);
           region.put(key2, new DSLongWrapper(longValue));
 
           flushIfNecessary(region);
@@ -5523,18 +5267,18 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       SerializableRunnable get2 = new CacheSerializableRunnable("Get long") {
         @Override
         public void run2() throws CacheException {
-          Region region = getRootRegion().getSubregion(name);
+          Region<Object, Object> region = getRootRegion().getSubregion(name);
           DSLongWrapper.DSLongWrapperInstantiator inst =
               new DSLongWrapper.DSLongWrapperInstantiator();
-          assertNotNull(InternalInstantiator.getInstantiator(inst.getId()));
+          assertThat(InternalInstantiator.getInstantiator(inst.getId())).isNotNull();
           LongWrapper value = (LongWrapper) region.get(key2);
-          assertNotNull(value);
-          assertEquals(longValue, value.longValue);
+          assertThat(value).isNotNull();
+          assertThat(value.longValue).isEqualTo(longValue);
 
           inst = (DSLongWrapper.DSLongWrapperInstantiator) InternalInstantiator
               .getInstantiator(inst.getId());
-          assertNotNull(inst);
-          assertTrue(inst.wasInvoked);
+          assertThat(inst).isNotNull();
+          assertThat(inst.wasInvoked).isTrue();
         }
       };
       vm0.invoke(get2);
@@ -5604,7 +5348,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
 
       @Override
-      public Object fromData(DataInput in) throws IOException, ClassNotFoundException {
+      public Object fromData(DataInput in) throws IOException {
 
         return new IntWrapper(in.readInt());
       }
@@ -5620,7 +5364,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       super(intValue);
     }
 
-    protected DSIntWrapper() {
+    DSIntWrapper() {
       super(0);
     }
 
@@ -5630,7 +5374,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     }
 
     @Override
-    public void fromData(DataInput in) throws IOException, ClassNotFoundException {
+    public void fromData(DataInput in) throws IOException {
       this.intValue = in.readInt();
     }
 
@@ -5639,7 +5383,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
         this(DSIntWrapper.class, (byte) 76);
       }
 
-      DSIntWrapperInstantiator(Class c, byte id) {
+      DSIntWrapperInstantiator(Class<? extends DSIntWrapper> c, byte id) {
         super(c, id);
       }
 
@@ -5697,7 +5441,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
 
       @Override
-      public Object fromData(DataInput in) throws IOException, ClassNotFoundException {
+      public Object fromData(DataInput in) throws IOException {
 
         return new LongWrapper(in.readLong());
       }
@@ -5713,7 +5457,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       super(longValue);
     }
 
-    protected DSLongWrapper() {
+    DSLongWrapper() {
       super(0L);
     }
 
@@ -5723,14 +5467,14 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     }
 
     @Override
-    public void fromData(DataInput in) throws IOException, ClassNotFoundException {
+    public void fromData(DataInput in) throws IOException {
       this.longValue = in.readLong();
     }
 
     static class DSLongWrapperInstantiator extends Instantiator {
       boolean wasInvoked = false;
 
-      DSLongWrapperInstantiator(Class c, byte id) {
+      DSLongWrapperInstantiator(Class<? extends DSLongWrapper> c, byte id) {
         super(c, id);
       }
 
@@ -5746,196 +5490,157 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     }
   }
 
-  public class MyTransactionListener implements TransactionListener {
-    public volatile TransactionId expectedTxId;
-    public volatile TransactionEvent lastEvent;
-    public volatile int afterCommitCount;
-    public volatile int afterFailedCommitCount;
-    public volatile int afterRollbackCount;
-    public volatile int closeCount;
+  private static class MyTransactionListener<K, V> implements TransactionListener<K, V> {
+    private volatile TransactionId expectedTxId;
+    private volatile TransactionEvent<K, V> lastEvent;
+    private volatile int afterCommitCount;
+    private volatile int afterFailedCommitCount;
+    private volatile int afterRollbackCount;
+    private volatile int closeCount;
 
     @Override
-    public void afterCommit(TransactionEvent event) {
+    public synchronized void afterCommit(TransactionEvent<K, V> event) {
       this.lastEvent = event;
       this.afterCommitCount++;
-      // getSystem().getLogWriter().info("TXListener("
-      // + System.identityHashCode(this)
-      // + "): afterCommit "
-      // + event.getTransactionId()
-      // + " #" + this.afterCommitCount);
     }
 
     @Override
-    public void afterFailedCommit(TransactionEvent event) {
+    public synchronized void afterFailedCommit(TransactionEvent<K, V> event) {
       this.lastEvent = event;
       this.afterFailedCommitCount++;
-      // getSystem().getLogWriter().info("TXListener("
-      // + System.identityHashCode(this)
-      // + "): afterFailCommit "
-      // + event.getTransactionId()
-      // + " #" + this.afterFailedCommitCount);
     }
 
     @Override
-    public void afterRollback(TransactionEvent event) {
+    public synchronized void afterRollback(TransactionEvent<K, V> event) {
       this.lastEvent = event;
       this.afterRollbackCount++;
-      // getSystem().getLogWriter().info("TXListener("
-      // + System.identityHashCode(this)
-      // + "): afterRollback "
-      // + event.getTransactionId()
-      // + " #" + this.afterRollbackCount);
     }
 
     @Override
-    public void close() {
+    public synchronized void close() {
       this.closeCount++;
     }
 
-    public void reset() {
-      // getSystem().getLogWriter().info("TXListener("
-      // + System.identityHashCode(this)
-      // + "): resetting TX listener");
-      this.afterCommitCount = 0;
-      this.afterFailedCommitCount = 0;
-      this.afterRollbackCount = 0;
-      this.closeCount = 0;
+    synchronized void checkAfterCommitCount(int expected) {
+      assertThat(this.afterCommitCount).isEqualTo(expected);
     }
 
-    public void checkAfterCommitCount(int expected) {
-      // if (this.afterCommitCount != expected) {
-      // getSystem().getLogWriter().info("TXListener("
-      // + System.identityHashCode(this)
-      // + "):checkAfterCommitCount "
-      // + " #" + this.afterCommitCount);
-      // }
-      assertEquals(expected, this.afterCommitCount);
-    }
-
-    public void assertCounts(int commitCount, int failedCommitCount, int rollbackCount,
+    synchronized void assertCounts(int commitCount, int failedCommitCount, int rollbackCount,
         int closeCount1) {
-      assertEquals(commitCount, this.afterCommitCount);
-      assertEquals(failedCommitCount, this.afterFailedCommitCount);
-      assertEquals(rollbackCount, this.afterRollbackCount);
-      assertEquals(closeCount1, this.closeCount);
+      assertThat(this.afterCommitCount).isEqualTo(commitCount);
+      assertThat(this.afterFailedCommitCount).isEqualTo(failedCommitCount);
+      assertThat(this.afterRollbackCount).isEqualTo(rollbackCount);
+      assertThat(this.closeCount).isEqualTo(closeCount1);
     }
   }
 
-  class CountingDistCacheListener extends CacheListenerAdapter {
-    int aCreateCalls, aUpdateCalls, aInvalidateCalls, aDestroyCalls, aLocalDestroyCalls, regionOps;
-    EntryEvent lastEvent;
+  private static class CountingDistCacheListener<K, V> extends CacheListenerAdapter<K, V> {
+    private int aCreateCalls, aUpdateCalls, aInvalidateCalls, aDestroyCalls, regionOps;
+    private EntryEvent<K, V> lastEvent;
 
     @Override
     public void close() {}
 
-    public synchronized void reset() {
-      this.aCreateCalls =
-          this.aUpdateCalls = this.aInvalidateCalls = this.aDestroyCalls = this.regionOps = 0;
-      this.lastEvent = null;
-    }
-
     @Override
-    public void afterCreate(EntryEvent e) {
-      if (e.isOriginRemote())
+    public void afterCreate(EntryEvent<K, V> e) {
+      if (e.isOriginRemote()) {
         synchronized (this) {
           ++this.aCreateCalls;
           this.lastEvent = e;
         }
+      }
     }
 
     @Override
-    public void afterUpdate(EntryEvent e) {
-      if (e.isOriginRemote())
+    public void afterUpdate(EntryEvent<K, V> e) {
+      if (e.isOriginRemote()) {
         synchronized (this) {
           ++this.aUpdateCalls;
           this.lastEvent = e;
         }
+      }
     }
 
     @Override
-    public void afterInvalidate(EntryEvent e) {
-      if (e.isOriginRemote())
+    public void afterInvalidate(EntryEvent<K, V> e) {
+      if (e.isOriginRemote()) {
         synchronized (this) {
           ++this.aInvalidateCalls;
           this.lastEvent = e;
         }
+      }
     }
 
     @Override
-    public void afterDestroy(EntryEvent e) {
-      if (e.isOriginRemote())
+    public void afterDestroy(EntryEvent<K, V> e) {
+      if (e.isOriginRemote()) {
         synchronized (this) {
           ++this.aDestroyCalls;
           this.lastEvent = e;
         }
+      }
     }
 
     @Override
-    public void afterRegionInvalidate(RegionEvent e) {
+    public synchronized void afterRegionInvalidate(RegionEvent<K, V> e) {
       ++this.regionOps;
     }
 
     @Override
-    public void afterRegionDestroy(RegionEvent e) {
+    public synchronized void afterRegionDestroy(RegionEvent<K, V> e) {
       ++this.regionOps;
     }
 
-    public synchronized void assertCount(int expectedCreate, int expectedUpdate,
+    synchronized void assertCount(int expectedCreate, int expectedUpdate,
         int expectedInvalidate, int expectedDestroy) {
-      assertEquals(expectedCreate, this.aCreateCalls);
-      assertEquals(expectedUpdate, this.aUpdateCalls);
-      assertEquals(expectedInvalidate, this.aInvalidateCalls);
-      assertEquals(expectedDestroy, this.aDestroyCalls);
-      assertEquals(0, this.regionOps);
+      assertThat(this.aCreateCalls).isEqualTo(expectedCreate);
+      assertThat(this.aUpdateCalls).isEqualTo(expectedUpdate);
+      assertThat(this.aInvalidateCalls).isEqualTo(expectedInvalidate);
+      assertThat(this.aDestroyCalls).isEqualTo(expectedDestroy);
+      assertThat(this.regionOps).isEqualTo(0);
     }
 
-    public synchronized EntryEvent getEntryEvent() {
+    synchronized EntryEvent<K, V> getEntryEvent() {
       return this.lastEvent;
     }
 
-    public synchronized void setEntryEvent(EntryEvent event) {
+    synchronized void setEntryEvent(EntryEvent<K, V> event) {
       this.lastEvent = event;
     }
   }
 
   private void assertCacheCallbackEvents(String regionName, TransactionId txId, Object key,
       Object oldValue, Object newValue) {
-    Region re = getCache().getRegion("root").getSubregion(regionName);
-    MyTransactionListener tl =
-        (MyTransactionListener) getCache().getCacheTransactionManager().getListeners()[0];
+    Region<Object, Object> re = getCache().getRegion("root").getSubregion(regionName);
+    MyTransactionListener<Object, Object> tl =
+        firstTransactionListenerFrom(getCache().getCacheTransactionManager());
     tl.expectedTxId = txId;
-    assertNotNull("Cannot assert TX Callout Events with a null Region: " + regionName, re);
-    final CountingDistCacheListener cdcl =
-        (CountingDistCacheListener) re.getAttributes().getCacheListeners()[0];
-    // May need to wait a bit for the event to be received
-    WaitCriterion ev = new WaitCriterion() {
-      @Override
-      public boolean done() {
-        return cdcl.getEntryEvent() != null;
-      }
-
-      @Override
-      public String description() {
-        return "waiting for entry event";
-      }
-    };
-    Wait.waitForCriterion(ev, 60 * 1000, 200, true);
-    EntryEvent listenEvent = cdcl.getEntryEvent();
-    assertNotNull("Cannot assert TX CacheListener Events with a null Entry Event", listenEvent);
-    assertEquals(re, listenEvent.getRegion());
-    assertEquals(txId, listenEvent.getTransactionId());
-    assertEquals(key, listenEvent.getKey());
-    assertEquals(oldValue, listenEvent.getOldValue());
-    assertEquals(newValue, listenEvent.getNewValue());
-    assertEquals(null, listenEvent.getCallbackArgument());
-    assertEquals(true, listenEvent.isCallbackArgumentAvailable());
-    assertTrue(!listenEvent.getOperation().isLoad());
-    assertTrue(!listenEvent.getOperation().isNetLoad());
-    assertTrue(!listenEvent.getOperation().isNetSearch());
-    assertTrue(!listenEvent.getOperation().isLocalLoad());
-    assertTrue(listenEvent.getOperation().isDistributed());
-    assertTrue(!listenEvent.getOperation().isExpiration());
-    assertTrue(listenEvent.isOriginRemote());
+    assertThat(re).describedAs("Cannot assert TX Callout Events with a null Region: " + regionName)
+        .isNotNull();
+    final CountingDistCacheListener<Object, Object> cdcl =
+        (CountingDistCacheListener<Object, Object>) re.getAttributes().getCacheListeners()[0];
+
+    await("retry event = null where it should not be")
+        .atMost(1, MINUTES).pollInterval(200, MILLISECONDS)
+        .until(() -> cdcl.getEntryEvent() != null);
+
+    EntryEvent<Object, Object> listenEvent = cdcl.getEntryEvent();
+    assertThat(listenEvent).describedAs(
+        "Cannot assert TX CacheListener Events with a null Entry Event").isNotNull();
+    assertThat(listenEvent.getRegion()).isEqualTo(re);
+    assertThat(listenEvent.getTransactionId()).isEqualTo(txId);
+    assertThat(listenEvent.getKey()).isEqualTo(key);
+    assertThat(listenEvent.getOldValue()).isEqualTo(oldValue);
+    assertThat(listenEvent.getNewValue()).isEqualTo(newValue);
+    assertThat(listenEvent.getCallbackArgument()).isNull();
+    assertThat(listenEvent.isCallbackArgumentAvailable()).isTrue();
+    assertThat(listenEvent.getOperation().isLoad()).isFalse();
+    assertThat(listenEvent.getOperation().isNetLoad()).isFalse();
+    assertThat(listenEvent.getOperation().isNetSearch()).isFalse();
+    assertThat(listenEvent.getOperation().isLocalLoad()).isFalse();
+    assertThat(listenEvent.getOperation().isDistributed()).isTrue();
+    assertThat(listenEvent.getOperation().isExpiration()).isFalse();
+    assertThat(listenEvent.isOriginRemote()).isTrue();
     cdcl.setEntryEvent(null);
   }
 
@@ -5943,22 +5648,20 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * Tests that an entry update is propagated to other caches that have that same entry defined.
    */
   @Test
-  public void testTXSimpleOps() throws Exception {
-    assumeTrue(supportsTransactions());
+  public void testTXSimpleOps() {
+    assumeThat(supportsTransactions()).isTrue();
 
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
     CacheTransactionManager txMgr = this.getCache().getCacheTransactionManager();
 
     if (getRegionAttributes().getScope().isGlobal()
         || getRegionAttributes().getDataPolicy().withPersistence()) {
       // just make sure transactions are not allowed on global or shared regions
-      Region rgn = createRegion(getUniqueName());
+      Region<String, String> rgn = createRegion(getUniqueName());
       txMgr.begin();
-      try {
-        rgn.put("testTXSimpleOpsKey1", "val");
-        fail("expected UnsupportedOperationException");
-      } catch (UnsupportedOperationException ok) {
-      }
+      assertThatThrownBy(() -> rgn.put("testTXSimpleOpsKey1", "val"))
+          .isInstanceOf(UnsupportedOperationException.class);
+
       txMgr.rollback();
       rgn.localDestroyRegion();
       return;
@@ -5970,16 +5673,17 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       @Override
       public void run() {
         CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-        MyTransactionListener tl = new MyTransactionListener();
-        txMgr2.addListener(tl);
-        assertEquals(null, tl.lastEvent);
-        assertEquals(0, tl.afterCommitCount);
-        assertEquals(0, tl.afterFailedCommitCount);
-        assertEquals(0, tl.afterRollbackCount);
-        assertEquals(0, tl.closeCount);
+        MyTransactionListener<Object, Object> tl = new MyTransactionListener<>();
+        setTxListener(txMgr2, tl);
+        assertThat(tl.lastEvent).isNull();
+        assertThat(tl.afterCommitCount).isEqualTo(0);
+        assertThat(tl.afterFailedCommitCount).isEqualTo(0);
+        assertThat(tl.afterRollbackCount).isEqualTo(0);
+        assertThat(tl.closeCount).isEqualTo(0);
         try {
-          Region rgn = createRegion(rgnName);
-          CountingDistCacheListener cacheListener = new CountingDistCacheListener();
+          Region<Object, Object> rgn = createRegion(rgnName);
+          CountingDistCacheListener<Object, Object> cacheListener =
+              new CountingDistCacheListener<>();
           rgn.getAttributesMutator().addCacheListener(cacheListener);
           cacheListener.assertCount(0, 0, 0, 0);
           getSystem().getLogWriter().info("testTXSimpleOps: Created region");
@@ -5994,11 +5698,11 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
           @Override
           public void run() {
             try {
-              Region root = getRootRegion();
-              Region rgn = root.getSubregion(rgnName);
+              Region<?, ?> root = getRootRegion();
+              Region<Object, Object> rgn = root.getSubregion(rgnName);
               rgn.create("key", null);
               CountingDistCacheListener cacheListener =
-                  (CountingDistCacheListener) rgn.getAttributes().getCacheListener();
+                  (CountingDistCacheListener) rgn.getAttributes().getCacheListeners()[0];
               cacheListener.assertCount(0, 0, 0, 0);
               getSystem().getLogWriter().info("testTXSimpleOps: Created Key");
             } catch (CacheException e) {
@@ -6007,23 +5711,22 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
           }
         };
 
-    Host host = Host.getHost(0);
-    VM vm = host.getVM(0);
+    VM vm = VM.getVM(0);
     vm.invoke(create);
     vm.invoke(newKey);
-    int vmCount = host.getVMCount();
+    int vmCount = VM.getVMCount();
     for (int i = 1; i < vmCount; i++) {
-      vm = host.getVM(i);
+      vm = VM.getVM(i);
       vm.invoke(create);
       if (!getRegionAttributes().getDataPolicy().withReplication()
-          && !getRegionAttributes().getDataPolicy().isPreloaded()) {
+          && !getRegionAttributes().getDataPolicy().withPreloaded()) {
         vm.invoke(newKey);
       }
     }
     // GemFireVersion.waitForJavaDebugger(getLogWriter(), "CTRLR WAITING AFTER CREATE");
 
     try {
-      Region rgn = createRegion(rgnName);
+      Region<String, String> rgn = createRegion(rgnName);
       DMStats dmStats = getSystem().getDistributionManager().getStats();
       long cmtMsgs = dmStats.getSentCommitMessages();
       long commitWaits = dmStats.getCommitWaits();
@@ -6033,64 +5736,66 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
         rgn.put("key", "value");
         final TransactionId txId = txMgr.getTransactionId();
         txMgr.commit();
-        assertEquals(cmtMsgs + 1, dmStats.getSentCommitMessages());
+        assertThat(dmStats.getSentCommitMessages()).isEqualTo(cmtMsgs + 1);
         if (rgn.getAttributes().getScope().isAck()) {
-          assertEquals(commitWaits + 1, dmStats.getCommitWaits());
+          assertThat(dmStats.getCommitWaits()).isEqualTo(commitWaits + 1);
         } else {
-          assertEquals(commitWaits, dmStats.getCommitWaits());
+          assertThat(dmStats.getCommitWaits()).isEqualTo(commitWaits);
         }
         getSystem().getLogWriter().info("testTXSimpleOps: Create/Put Value");
-        Invoke.invokeInEveryVM(new SerializableRunnable() {
+        invokeInEveryVM(new SerializableRunnable() {
           public void run() {
             assertCacheCallbackEvents(rgnName, txId, "key", null, "value");
           }
         });
-        Invoke.invokeInEveryVMRepeatingIfNecessary(
+        invokeInEveryVM(repeatingIfNecessary(
             new CacheSerializableRunnable("testTXSimpleOps: Verify Received Value") {
               @Override
               public void run2() {
-                Region rgn1 = getRootRegion().getSubregion(rgnName);
-                assertNotNull("Could not find entry for 'key'", rgn1.getEntry("key"));
-                assertEquals("value", rgn1.getEntry("key").getValue());
+                Region<String, String> rgn1 = getRootRegion().getSubregion(rgnName);
+                assertThat(rgn1.getEntry("key")).describedAs("Could not find entry for 'key'")
+                    .isNotNull();
+                assertThat(rgn1.getEntry("key").getValue()).isEqualTo("value");
                 CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-                MyTransactionListener tl = (MyTransactionListener) txMgr2.getListeners()[0];
+                MyTransactionListener<String, String> tl =
+                    firstTransactionListenerFrom(txMgr2);
                 tl.checkAfterCommitCount(1);
-                assertEquals(0, tl.afterFailedCommitCount);
-                assertEquals(0, tl.afterRollbackCount);
-                assertEquals(0, tl.closeCount);
-                assertEquals(rgn1.getCache(), tl.lastEvent.getCache());
+                assertThat(tl.afterFailedCommitCount).isEqualTo(0);
+                assertThat(tl.afterRollbackCount).isEqualTo(0);
+                assertThat(tl.closeCount).isEqualTo(0);
+                assertThat(tl.lastEvent.getCache()).isEqualTo(rgn1.getRegionService());
                 {
-                  Collection events;
-                  RegionAttributes attr = getRegionAttributes();
+                  Collection<EntryEvent<String, String>> events;
+                  RegionAttributes<String, String> attr = getRegionAttributes();
                   if (!attr.getDataPolicy().withReplication()
                       || attr.getConcurrencyChecksEnabled()) {
                     events = TxEventTestUtil.getPutEvents(tl.lastEvent.getEvents());
                   } else {
                     events = TxEventTestUtil.getCreateEvents(tl.lastEvent.getEvents());
                   }
-                  assertEquals(1, events.size());
-                  EntryEvent ev = (EntryEvent) events.iterator().next();
-                  assertEquals(tl.expectedTxId, ev.getTransactionId());
-                  assertTrue(ev.getRegion() == rgn1);
-                  assertEquals("key", ev.getKey());
-                  assertEquals("value", ev.getNewValue());
-                  assertEquals(null, ev.getOldValue());
-                  assertTrue(!ev.getOperation().isLocalLoad());
-                  assertTrue(!ev.getOperation().isNetLoad());
-                  assertTrue(!ev.getOperation().isLoad());
-                  assertTrue(!ev.getOperation().isNetSearch());
-                  assertTrue(!ev.getOperation().isExpiration());
-                  assertEquals(null, ev.getCallbackArgument());
-                  assertEquals(true, ev.isCallbackArgumentAvailable());
-                  assertTrue(ev.isOriginRemote());
-                  assertTrue(ev.getOperation().isDistributed());
+                  assertThat(events.size()).isEqualTo(1);
+                  EntryEvent ev = events.iterator().next();
+                  assertThat(ev.getTransactionId()).isEqualTo(tl.expectedTxId);
+                  assertThat(rgn1).isSameAs(ev.getRegion());
+                  assertThat(ev.getKey()).isEqualTo("key");
+                  assertThat(ev.getNewValue()).isEqualTo("value");
+                  assertThat(ev.getOldValue()).isNull();
+                  assertThat(ev.getOperation().isLocalLoad()).isFalse();
+                  assertThat(ev.getOperation().isNetLoad()).isFalse();
+                  assertThat(ev.getOperation().isLoad()).isFalse();
+                  assertThat(ev.getOperation().isNetSearch()).isFalse();
+                  assertThat(ev.getOperation().isExpiration()).isFalse();
+                  assertThat(ev.getCallbackArgument()).isNull();
+                  assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+                  assertThat(ev.isOriginRemote()).isTrue();
+                  assertThat(ev.getOperation().isDistributed()).isTrue();
                 }
-                CountingDistCacheListener cdcL =
-                    (CountingDistCacheListener) rgn1.getAttributes().getCacheListeners()[0];
+                CountingDistCacheListener<String, String> cdcL =
+                    (CountingDistCacheListener<String, String>) rgn1.getAttributes()
+                        .getCacheListeners()[0];
                 cdcL.assertCount(0, 1, 0, 0);
-
               }
-            }, getRepeatTimeoutMs());
+            }));
       }
 
       {
@@ -6099,47 +5804,48 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
         final TransactionId txId = txMgr.getTransactionId();
         txMgr.commit();
         getSystem().getLogWriter().info("testTXSimpleOps: Put(update) Value2");
-        Invoke.invokeInEveryVM(new SerializableRunnable() {
+        invokeInEveryVM(new SerializableRunnable() {
           public void run() {
             assertCacheCallbackEvents(rgnName, txId, "key", "value", "value2");
           }
         });
-        Invoke.invokeInEveryVMRepeatingIfNecessary(
+        invokeInEveryVM(repeatingIfNecessary(
             new CacheSerializableRunnable("testTXSimpleOps: Verify Received Value") {
               @Override
               public void run2() {
-                Region rgn1 = getRootRegion().getSubregion(rgnName);
-                assertNotNull("Could not find entry for 'key'", rgn1.getEntry("key"));
-                assertEquals("value2", rgn1.getEntry("key").getValue());
+                Region<String, String> rgn1 = getRootRegion().getSubregion(rgnName);
+                assertThat(rgn1.getEntry("key")).describedAs("Could not find entry for 'key'")
+                    .isNotNull();
+                assertThat(rgn1.getEntry("key").getValue()).isEqualTo("value2");
                 CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-                MyTransactionListener tl = (MyTransactionListener) txMgr2.getListeners()[0];
+                MyTransactionListener<String, String> tl = firstTransactionListenerFrom(txMgr2);
                 tl.checkAfterCommitCount(2);
-                assertEquals(rgn1.getCache(), tl.lastEvent.getCache());
+                assertThat(tl.lastEvent.getCache()).isEqualTo(rgn1.getRegionService());
                 {
-                  Collection events = TxEventTestUtil.getPutEvents(tl.lastEvent.getEvents());
-                  assertEquals(1, events.size());
-                  EntryEvent ev = (EntryEvent) events.iterator().next();
-                  assertEquals(tl.expectedTxId, ev.getTransactionId());
-                  assertTrue(ev.getRegion() == rgn1);
-                  assertEquals("key", ev.getKey());
-                  assertEquals("value2", ev.getNewValue());
-                  assertEquals("value", ev.getOldValue());
-                  assertTrue(!ev.getOperation().isLocalLoad());
-                  assertTrue(!ev.getOperation().isNetLoad());
-                  assertTrue(!ev.getOperation().isLoad());
-                  assertTrue(!ev.getOperation().isNetSearch());
-                  assertTrue(!ev.getOperation().isExpiration());
-                  assertEquals(null, ev.getCallbackArgument());
-                  assertEquals(true, ev.isCallbackArgumentAvailable());
-                  assertTrue(ev.isOriginRemote());
-                  assertTrue(ev.getOperation().isDistributed());
+                  Collection<EntryEvent<String, String>> events =
+                      TxEventTestUtil.getPutEvents(tl.lastEvent.getEvents());
+                  assertThat(events.size()).isEqualTo(1);
+                  EntryEvent<String, String> ev = events.iterator().next();
+                  assertThat(ev.getTransactionId()).isEqualTo(tl.expectedTxId);
+                  assertThat(rgn1).isSameAs(ev.getRegion());
+                  assertThat(ev.getKey()).isEqualTo("key");
+                  assertThat(ev.getNewValue()).isEqualTo("value2");
+                  assertThat(ev.getOldValue()).isEqualTo("value");
+                  assertThat(ev.getOperation().isLocalLoad()).isFalse();
+                  assertThat(ev.getOperation().isNetLoad()).isFalse();
+                  assertThat(ev.getOperation().isLoad()).isFalse();
+                  assertThat(ev.getOperation().isNetSearch()).isFalse();
+                  assertThat(ev.getOperation().isExpiration()).isFalse();
+                  assertThat(ev.getCallbackArgument()).isNull();
+                  assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+                  assertThat(ev.isOriginRemote()).isTrue();
+                  assertThat(ev.getOperation().isDistributed()).isTrue();
                 }
                 CountingDistCacheListener cdcL =
                     (CountingDistCacheListener) rgn1.getAttributes().getCacheListeners()[0];
                 cdcL.assertCount(0, 2, 0, 0);
-
               }
-            }, getRepeatTimeoutMs());
+            }));
       }
 
       {
@@ -6149,48 +5855,50 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
         txMgr.commit();
         getSystem().getLogWriter().info("testTXSimpleOps: invalidate key");
         // validate each of the CacheListeners EntryEvents
-        Invoke.invokeInEveryVM(new SerializableRunnable() {
+        invokeInEveryVM(new SerializableRunnable() {
           public void run() {
             assertCacheCallbackEvents(rgnName, txId, "key", "value2", null);
           }
         });
-        Invoke.invokeInEveryVMRepeatingIfNecessary(
+        invokeInEveryVM(repeatingIfNecessary(
             new CacheSerializableRunnable("testTXSimpleOps: Verify Received Value") {
               @Override
               public void run2() {
-                Region rgn1 = getRootRegion().getSubregion(rgnName);
-                assertNotNull("Could not find entry for 'key'", rgn1.getEntry("key"));
-                assertTrue(rgn1.containsKey("key"));
-                assertTrue(!rgn1.containsValueForKey("key"));
+                Region<String, String> rgn1 = getRootRegion().getSubregion(rgnName);
+                assertThat(rgn1.getEntry("key")).describedAs("entry for 'key'")
+                    .isNotNull();
+                assertThat(rgn1.containsKey("key")).isTrue();
+                assertThat(rgn1.containsValueForKey("key")).isFalse();
                 CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-                MyTransactionListener tl = (MyTransactionListener) txMgr2.getListeners()[0];
+                MyTransactionListener<String, String> tl =
+                    firstTransactionListenerFrom(txMgr2);
                 tl.checkAfterCommitCount(3);
-                assertEquals(rgn1.getCache(), tl.lastEvent.getCache());
+                assertThat(tl.lastEvent.getCache()).isEqualTo(rgn1.getRegionService());
                 {
-                  Collection events = TxEventTestUtil.getInvalidateEvents(tl.lastEvent.getEvents());
-                  assertEquals(1, events.size());
-                  EntryEvent ev = (EntryEvent) events.iterator().next();
-                  assertEquals(tl.expectedTxId, ev.getTransactionId());
-                  assertTrue(ev.getRegion() == rgn1);
-                  assertEquals("key", ev.getKey());
-                  assertEquals(null, ev.getNewValue());
-                  assertEquals("value2", ev.getOldValue());
-                  assertTrue(!ev.getOperation().isLocalLoad());
-                  assertTrue(!ev.getOperation().isNetLoad());
-                  assertTrue(!ev.getOperation().isLoad());
-                  assertTrue(!ev.getOperation().isNetSearch());
-                  assertTrue(!ev.getOperation().isExpiration());
-                  assertEquals(null, ev.getCallbackArgument());
-                  assertEquals(true, ev.isCallbackArgumentAvailable());
-                  assertTrue(ev.isOriginRemote());
-                  assertTrue(ev.getOperation().isDistributed());
+                  List<EntryEvent<String, String>> events =
+                      TxEventTestUtil.getInvalidateEvents(tl.lastEvent.getEvents());
+                  assertThat(events.size()).isEqualTo(1);
+                  EntryEvent<String, String> ev = events.get(0);
+                  assertThat(ev.getTransactionId()).isEqualTo(tl.expectedTxId);
+                  assertThat(rgn1).isSameAs(ev.getRegion());
+                  assertThat(ev.getKey()).isEqualTo("key");
+                  assertThat(ev.getNewValue()).isNull();
+                  assertThat(ev.getOldValue()).isEqualTo("value2");
+                  assertThat(ev.getOperation().isLocalLoad()).isFalse();
+                  assertThat(ev.getOperation().isNetLoad()).isFalse();
+                  assertThat(ev.getOperation().isLoad()).isFalse();
+                  assertThat(ev.getOperation().isNetSearch()).isFalse();
+                  assertThat(ev.getOperation().isExpiration()).isFalse();
+                  assertThat(ev.getCallbackArgument()).isNull();
+                  assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+                  assertThat(ev.isOriginRemote()).isTrue();
+                  assertThat(ev.getOperation().isDistributed()).isTrue();
                 }
                 CountingDistCacheListener cdcL =
                     (CountingDistCacheListener) rgn1.getAttributes().getCacheListeners()[0];
                 cdcL.assertCount(0, 2, 1, 0);
-
               }
-            }, getRepeatTimeoutMs());
+            }));
       }
 
       {
@@ -6200,47 +5908,47 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
         txMgr.commit();
         getSystem().getLogWriter().info("testTXSimpleOps: destroy key");
         // validate each of the CacheListeners EntryEvents
-        Invoke.invokeInEveryVM(new SerializableRunnable() {
+        invokeInEveryVM(new SerializableRunnable() {
           public void run() {
             assertCacheCallbackEvents(rgnName, txId, "key", null, null);
           }
         });
-        Invoke.invokeInEveryVMRepeatingIfNecessary(
+        invokeInEveryVM(repeatingIfNecessary(
             new CacheSerializableRunnable("testTXSimpleOps: Verify Received Value") {
               @Override
               public void run2() {
-                Region rgn1 = getRootRegion().getSubregion(rgnName);
-                assertTrue(!rgn1.containsKey("key"));
+                Region<String, String> rgn1 = getRootRegion().getSubregion(rgnName);
+                assertThat(rgn1.containsKey("key")).isFalse();
                 CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-                MyTransactionListener tl = (MyTransactionListener) txMgr2.getListeners()[0];
+                MyTransactionListener<String, String> tl = firstTransactionListenerFrom(txMgr2);
                 tl.checkAfterCommitCount(4);
-                assertEquals(rgn1.getCache(), tl.lastEvent.getCache());
+                assertThat(tl.lastEvent.getCache()).isEqualTo(rgn1.getRegionService());
                 {
-                  Collection events = TxEventTestUtil.getDestroyEvents(tl.lastEvent.getEvents());
-                  assertEquals(1, events.size());
-                  EntryEvent ev = (EntryEvent) events.iterator().next();
-                  assertEquals(tl.expectedTxId, ev.getTransactionId());
-                  assertTrue(ev.getRegion() == rgn1);
-                  assertEquals("key", ev.getKey());
-                  assertEquals(null, ev.getNewValue());
-                  assertEquals(null, ev.getOldValue());
-                  assertTrue(!ev.getOperation().isLocalLoad());
-                  assertTrue(!ev.getOperation().isNetLoad());
-                  assertTrue(!ev.getOperation().isLoad());
-                  assertTrue(!ev.getOperation().isNetSearch());
-                  assertTrue(!ev.getOperation().isExpiration());
-                  assertEquals(null, ev.getCallbackArgument());
-                  assertEquals(true, ev.isCallbackArgumentAvailable());
-                  assertTrue(ev.isOriginRemote());
-                  assertTrue(ev.getOperation().isDistributed());
+                  Collection<EntryEvent<String, String>> events =
+                      TxEventTestUtil.getDestroyEvents(tl.lastEvent.getEvents());
+                  assertThat(events.size()).isEqualTo(1);
+                  EntryEvent<String, String> ev = events.iterator().next();
+                  assertThat(ev.getTransactionId()).isEqualTo(tl.expectedTxId);
+                  assertThat(rgn1).isSameAs(ev.getRegion());
+                  assertThat(ev.getKey()).isEqualTo("key");
+                  assertThat(ev.getNewValue()).isNull();
+                  assertThat(ev.getOldValue()).isNull();
+                  assertThat(ev.getOperation().isLocalLoad()).isFalse();
+                  assertThat(ev.getOperation().isNetLoad()).isFalse();
+                  assertThat(ev.getOperation().isLoad()).isFalse();
+                  assertThat(ev.getOperation().isNetSearch()).isFalse();
+                  assertThat(ev.getOperation().isExpiration()).isFalse();
+                  assertThat(ev.getCallbackArgument()).isNull();
+                  assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+                  assertThat(ev.isOriginRemote()).isTrue();
+                  assertThat(ev.getOperation().isDistributed()).isTrue();
                 }
                 CountingDistCacheListener cdcL =
                     (CountingDistCacheListener) rgn1.getAttributes().getCacheListeners()[0];
                 cdcL.assertCount(0, 2, 1, 1);
               }
-            }, getRepeatTimeoutMs());
+            }));
       }
-
     } catch (Exception e) {
       getCache().close();
       getSystem().getLogWriter().fine("testTXSimpleOps: Caused exception in createRegion");
@@ -6264,20 +5972,12 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    */
   @Ignore("TODO: this test always hits early out")
   @Test
-  public void testTXUpdateLoadNoConflict() throws Exception {
-    /*
-     * this no longer holds true - we have load conflicts now
-     *
-     */
-    if (true) {
-      return;
-    }
-
-    assumeTrue(supportsTransactions());
-    assumeFalse(getRegionAttributes().getScope().isGlobal());
-    assumeFalse(getRegionAttributes().getDataPolicy().withPersistence());
+  public void testTXUpdateLoadNoConflict() {
+    assumeThat(supportsTransactions()).isTrue();
+    assumeThat(getRegionAttributes().getScope().isGlobal()).isFalse();
+    assumeThat(getRegionAttributes().getDataPolicy().withPersistence()).isFalse();
 
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
     CacheTransactionManager txMgr = this.getCache().getCacheTransactionManager();
 
     final String rgnName = getUniqueName();
@@ -6287,26 +5987,26 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
           @Override
           public void run() {
             CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-            MyTransactionListener tl = new MyTransactionListener();
-            txMgr2.addListener(tl);
+            MyTransactionListener<String, String> tl = new MyTransactionListener<>();
+            setTxListener(txMgr2, tl);
             try {
-              Region rgn = createRegion(rgnName);
-              AttributesMutator mutator = rgn.getAttributesMutator();
-              mutator.setCacheLoader(new CacheLoader() {
+              Region<String, String> rgn = createRegion(rgnName);
+              AttributesMutator<String, String> mutator = rgn.getAttributesMutator();
+              mutator.setCacheLoader(new CacheLoader<String, String>() {
                 int count = 0;
 
                 @Override
-                public Object load(LoaderHelper helper) throws CacheLoaderException {
+                public String load(LoaderHelper<String, String> helper)
+                    throws CacheLoaderException {
                   count++;
                   return "LV " + count;
-
                 }
 
                 @Override
                 public void close() {}
               });
               Object value = rgn.get("key");
-              assertEquals("LV 1", value);
+              assertThat(value).isEqualTo("LV 1");
               getSystem().getLogWriter().info("testTXUpdateLoadNoConflict: loaded Key");
               flushIfNecessary(rgn);
             } catch (CacheException e) {
@@ -6315,15 +6015,15 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
           }
         };
 
-    VM vm0 = Host.getHost(0).getVM(0);
+    VM vm0 = VM.getVM(0);
     // GemFireVersion.waitForJavaDebugger(getLogWriter(), "CTRLR WAITING AFTER CREATE");
 
     try {
-      MyTransactionListener tl = new MyTransactionListener();
-      txMgr.addListener(tl);
-      AttributesFactory rgnAtts = new AttributesFactory(getRegionAttributes());
+      MyTransactionListener<String, String> tl = new MyTransactionListener<>();
+      setTxListener(txMgr, tl);
+      AttributesFactory<String, String> rgnAtts = new AttributesFactory<>(getRegionAttributes());
       rgnAtts.setDataPolicy(DataPolicy.REPLICATE);
-      Region rgn = createRegion(rgnName, rgnAtts.create());
+      Region<String, String> rgn = createRegion(rgnName, rgnAtts.create());
 
       txMgr.begin();
       TransactionId myTXId = txMgr.getTransactionId();
@@ -6334,34 +6034,35 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
 
       {
         TXStateProxy tx = ((TXManagerImpl) txMgr).pauseTransaction();
-        assertTrue(rgn.containsKey("key"));
-        assertEquals("LV 1", rgn.getEntry("key").getValue());
+        assertThat(rgn.containsKey("key")).isTrue();
+        assertThat(rgn.getEntry("key").getValue()).isEqualTo("LV 1");
         ((TXManagerImpl) txMgr).unpauseTransaction(tx);
       }
       // make sure transactional view is still correct
-      assertEquals("txValue", rgn.getEntry("key").getValue());
+      assertThat(rgn.getEntry("key").getValue()).isEqualTo("txValue");
 
       txMgr.commit();
       getSystem().getLogWriter().info("testTXUpdateLoadNoConflict: did commit");
-      assertEquals("txValue", rgn.getEntry("key").getValue());
+      assertThat(rgn.getEntry("key").getValue()).isEqualTo("txValue");
       {
-        Collection events = TxEventTestUtil.getCreateEvents(tl.lastEvent.getEvents());
-        assertEquals(1, events.size());
-        EntryEvent ev = (EntryEvent) events.iterator().next();
-        assertEquals(myTXId, ev.getTransactionId());
-        assertTrue(ev.getRegion() == rgn);
-        assertEquals("key", ev.getKey());
-        assertEquals("txValue", ev.getNewValue());
-        assertEquals(null, ev.getOldValue());
-        assertTrue(!ev.getOperation().isLocalLoad());
-        assertTrue(!ev.getOperation().isNetLoad());
-        assertTrue(!ev.getOperation().isLoad());
-        assertTrue(!ev.getOperation().isNetSearch());
-        assertTrue(!ev.getOperation().isExpiration());
-        assertEquals(null, ev.getCallbackArgument());
-        assertEquals(true, ev.isCallbackArgumentAvailable());
-        assertTrue(!ev.isOriginRemote());
-        assertTrue(ev.getOperation().isDistributed());
+        Collection<EntryEvent<String, String>> events =
+            TxEventTestUtil.getCreateEvents(tl.lastEvent.getEvents());
+        assertThat(events.size()).isEqualTo(1);
+        EntryEvent<String, String> ev = events.iterator().next();
+        assertThat(ev.getTransactionId()).isEqualTo(myTXId);
+        assertThat(rgn).isSameAs(ev.getRegion());
+        assertThat(ev.getKey()).isEqualTo("key");
+        assertThat(ev.getNewValue()).isEqualTo("txValue");
+        assertThat(ev.getOldValue()).isNull();
+        assertThat(ev.getOperation().isLocalLoad()).isFalse();
+        assertThat(ev.getOperation().isNetLoad()).isFalse();
+        assertThat(ev.getOperation().isLoad()).isFalse();
+        assertThat(ev.getOperation().isNetSearch()).isFalse();
+        assertThat(ev.getOperation().isExpiration()).isFalse();
+        assertThat(ev.getCallbackArgument()).isNull();
+        assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+        assertThat(ev.isOriginRemote()).isFalse();
+        assertThat(ev.getOperation().isDistributed()).isTrue();
       }
 
       // Now setup recreate the region in the controller with NONE
@@ -6372,7 +6073,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
 
       // now see if net loader is working
       Object v2 = rgn.get("key2");
-      assertEquals("LV 2", v2);
+      assertThat(v2).isEqualTo("LV 2");
 
       // now confirm that netload does not cause a conflict
       txMgr.begin();
@@ -6384,52 +6085,52 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
         TXStateProxy tx = ((TXManagerImpl) txMgr).pauseTransaction();
         // do a get outside of the transaction to force a net load
         Object v3 = rgn.get("key3");
-        assertEquals("LV 3", v3);
+        assertThat(v3).isEqualTo("LV 3");
         ((TXManagerImpl) txMgr).unpauseTransaction(tx);
       }
       // make sure transactional view is still correct
-      assertEquals("txValue3", rgn.getEntry("key3").getValue());
+      assertThat(rgn.getEntry("key3").getValue()).isEqualTo("txValue3");
 
       txMgr.commit();
       getSystem().getLogWriter().info("testTXUpdateLoadNoConflict: did commit");
-      assertEquals("txValue3", rgn.getEntry("key3").getValue());
+      assertThat(rgn.getEntry("key3").getValue()).isEqualTo("txValue3");
       {
-        Collection events = TxEventTestUtil.getCreateEvents(tl.lastEvent.getEvents());
-        assertEquals(1, events.size());
-        EntryEvent ev = (EntryEvent) events.iterator().next();
-        assertEquals(myTXId, ev.getTransactionId());
-        assertTrue(ev.getRegion() == rgn);
-        assertEquals("key3", ev.getKey());
-        assertEquals("txValue3", ev.getNewValue());
-        assertEquals(null, ev.getOldValue());
-        assertTrue(!ev.getOperation().isLocalLoad());
-        assertTrue(!ev.getOperation().isNetLoad());
-        assertTrue(!ev.getOperation().isLoad());
-        assertTrue(!ev.getOperation().isNetSearch());
-        assertTrue(!ev.getOperation().isExpiration());
-        assertEquals(null, ev.getCallbackArgument());
-        assertEquals(true, ev.isCallbackArgumentAvailable());
-        assertTrue(!ev.isOriginRemote());
-        assertTrue(ev.getOperation().isDistributed());
+        Collection<EntryEvent<String, String>> events =
+            TxEventTestUtil.getCreateEvents(tl.lastEvent.getEvents());
+        assertThat(events.size()).isEqualTo(1);
+        EntryEvent<String, String> ev = events.iterator().next();
+        assertThat(ev.getTransactionId()).isEqualTo(myTXId);
+        assertThat(rgn).isSameAs(ev.getRegion());
+        assertThat(ev.getKey()).isEqualTo("key3");
+        assertThat(ev.getNewValue()).isEqualTo("txValue3");
+        assertThat(ev.getOldValue()).isNull();
+        assertThat(ev.getOperation().isLocalLoad()).isFalse();
+        assertThat(ev.getOperation().isNetLoad()).isFalse();
+        assertThat(ev.getOperation().isLoad()).isFalse();
+        assertThat(ev.getOperation().isNetSearch()).isFalse();
+        assertThat(ev.getOperation().isExpiration()).isFalse();
+        assertThat(ev.getCallbackArgument()).isNull();
+        assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+        assertThat(ev.isOriginRemote()).isFalse();
+        assertThat(ev.getOperation().isDistributed()).isTrue();
       }
 
       // now see if tx net loader is working
 
       // now confirm that netload does not cause a conflict
       txMgr.begin();
-      myTXId = txMgr.getTransactionId();
       Object v4 = rgn.get("key4");
-      assertEquals("LV 4", v4);
-      assertEquals("LV 4", rgn.get("key4"));
-      assertEquals("LV 4", rgn.getEntry("key4").getValue());
+      assertThat(v4).isEqualTo("LV 4");
+      assertThat(rgn.get("key4")).isEqualTo("LV 4");
+      assertThat(rgn.getEntry("key4").getValue()).isEqualTo("LV 4");
       txMgr.rollback();
       // confirm that netLoad is transactional
-      assertEquals("LV 5", rgn.get("key4"));
-      assertEquals("LV 5", rgn.getEntry("key4").getValue());
+      assertThat(rgn.get("key4")).isEqualTo("LV 5");
+      assertThat(rgn.getEntry("key4").getValue()).isEqualTo("LV 5");
 
       // make sure non-tx netsearch works
-      assertEquals("txValue", rgn.get("key"));
-      assertEquals("txValue", rgn.getEntry("key").getValue());
+      assertThat(rgn.get("key")).isEqualTo("txValue");
+      assertThat(rgn.getEntry("key").getValue()).isEqualTo("txValue");
 
       // make sure net-search result does not conflict with commit
       rgn.localInvalidate("key");
@@ -6441,63 +6142,63 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       {
         TXStateProxy tx = ((TXManagerImpl) txMgr).pauseTransaction();
         // do a get outside of the transaction to force a netsearch
-        assertEquals("txValue", rgn.get("key")); // does a netsearch
-        assertEquals("txValue", rgn.getEntry("key").getValue());
+        assertThat(rgn.get("key")).isEqualTo("txValue");
+        assertThat(rgn.getEntry("key").getValue()).isEqualTo("txValue");
         ((TXManagerImpl) txMgr).unpauseTransaction(tx);
       }
       // make sure transactional view is still correct
-      assertEquals("new txValue", rgn.getEntry("key").getValue());
+      assertThat(rgn.getEntry("key").getValue()).isEqualTo("new txValue");
 
       txMgr.commit();
       flushIfNecessary(rgn); // give other side change to process commit
       getSystem().getLogWriter().info("testTXUpdateLoadNoConflict: did commit");
-      assertEquals("new txValue", rgn.getEntry("key").getValue());
+      assertThat(rgn.getEntry("key").getValue()).isEqualTo("new txValue");
       {
-        Collection events = TxEventTestUtil.getPutEvents(tl.lastEvent.getEvents());
-        assertEquals(1, events.size());
-        EntryEvent ev = (EntryEvent) events.iterator().next();
-        assertEquals(myTXId, ev.getTransactionId());
-        assertTrue(ev.getRegion() == rgn);
-        assertEquals("key", ev.getKey());
-        assertEquals("new txValue", ev.getNewValue());
-        assertEquals(null, ev.getOldValue());
-        assertTrue(!ev.getOperation().isLocalLoad());
-        assertTrue(!ev.getOperation().isNetLoad());
-        assertTrue(!ev.getOperation().isLoad());
-        assertTrue(!ev.getOperation().isNetSearch());
-        assertTrue(!ev.getOperation().isExpiration());
-        assertEquals(null, ev.getCallbackArgument());
-        assertEquals(true, ev.isCallbackArgumentAvailable());
-        assertTrue(!ev.isOriginRemote());
-        assertTrue(ev.getOperation().isDistributed());
+        Collection<EntryEvent<String, String>> events =
+            TxEventTestUtil.getPutEvents(tl.lastEvent.getEvents());
+        assertThat(events.size()).isEqualTo(1);
+        EntryEvent<String, String> ev = events.iterator().next();
+        assertThat(ev.getTransactionId()).isEqualTo(myTXId);
+        assertThat(rgn).isSameAs(ev.getRegion());
+        assertThat(ev.getKey()).isEqualTo("key");
+        assertThat(ev.getNewValue()).isEqualTo("new txValue");
+        assertThat(ev.getOldValue()).isNull();
+        assertThat(ev.getOperation().isLocalLoad()).isFalse();
+        assertThat(ev.getOperation().isNetLoad()).isFalse();
+        assertThat(ev.getOperation().isLoad()).isFalse();
+        assertThat(ev.getOperation().isNetSearch()).isFalse();
+        assertThat(ev.getOperation().isExpiration()).isFalse();
+        assertThat(ev.getCallbackArgument()).isNull();
+        assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+        assertThat(ev.isOriginRemote()).isFalse();
+        assertThat(ev.getOperation().isDistributed()).isTrue();
       }
 
-
       // make sure tx local invalidate allows netsearch
       Object localCmtValue = rgn.getEntry("key").getValue();
       txMgr.begin();
-      assertSame(localCmtValue, rgn.getEntry("key").getValue());
+      assertThat(rgn.getEntry("key").getValue()).isSameAs(localCmtValue);
       rgn.localInvalidate("key");
-      assertNull(rgn.getEntry("key").getValue());
+      assertThat(rgn.getEntry("key").getValue()).isNull();
       // now make sure a get will do a netsearch and find the value
       // in the other vm instead of the one in local cmt state
       Object txValue = rgn.get("key");
-      assertNotSame(localCmtValue, txValue);
-      assertSame(txValue, rgn.get("key"));
-      assertNotSame(localCmtValue, rgn.getEntry("key").getValue());
+      assertThat(txValue).isNotSameAs(localCmtValue);
+      assertThat(rgn.get("key")).isSameAs(txValue);
+      assertThat(rgn.getEntry("key").getValue()).isNotSameAs(localCmtValue);
       // make sure we did a search and not a load
-      assertEquals(localCmtValue, rgn.getEntry("key").getValue());
+      assertThat(rgn.getEntry("key").getValue()).isEqualTo(localCmtValue);
       // now make sure that if we do a tx distributed invalidate
       // that we will do a load and not a search
       rgn.invalidate("key");
-      assertNull(rgn.getEntry("key").getValue());
+      assertThat(rgn.getEntry("key").getValue()).isNull();
       txValue = rgn.get("key");
-      assertEquals("LV 6", txValue);
-      assertSame(txValue, rgn.get("key"));
-      assertEquals("LV 6", rgn.getEntry("key").getValue());
+      assertThat(txValue).isEqualTo("LV 6");
+      assertThat(rgn.get("key")).isSameAs(txValue);
+      assertThat(rgn.getEntry("key").getValue()).isEqualTo("LV 6");
       // now make sure after rollback that local cmt state has not changed
       txMgr.rollback();
-      assertSame(localCmtValue, rgn.getEntry("key").getValue());
+      assertThat(rgn.getEntry("key").getValue()).isSameAs(localCmtValue);
     } catch (Exception e) {
       getCache().close();
       getSystem().getLogWriter()
@@ -6507,12 +6208,12 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
   }
 
   @Test
-  public void testTXMultiRegion() throws Exception {
-    assumeTrue(supportsTransactions());
-    assumeFalse(getRegionAttributes().getScope().isGlobal());
-    assumeFalse(getRegionAttributes().getDataPolicy().withPersistence());
+  public void testTXMultiRegion() {
+    assumeThat(supportsTransactions()).isTrue();
+    assumeThat(getRegionAttributes().getScope().isGlobal()).isFalse();
+    assumeThat(getRegionAttributes().getDataPolicy().withPersistence()).isFalse();
 
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     CacheTransactionManager txMgr = this.getCache().getCacheTransactionManager();
 
@@ -6524,8 +6225,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       @Override
       public void run() {
         CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-        MyTransactionListener tl = new MyTransactionListener();
-        txMgr2.setListener(tl);
+        MyTransactionListener<Object, Object> tl = new MyTransactionListener<>();
+        setTxListener(txMgr2, tl);
         try {
           createRegion(rgnName1);
           getSystem().getLogWriter().info("testTXMultiRegion: Created region1");
@@ -6538,7 +6239,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       @Override
       public void run() {
         try {
-          Region rgn = getRootRegion("root").getSubregion(rgnName1);
+          Region<String, ?> rgn = getRootRegion("root").getSubregion(rgnName1);
           rgn.create("key", null);
           getSystem().getLogWriter().info("testTXMultiRegion: Created key");
         } catch (CacheException e) {
@@ -6551,8 +6252,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       @Override
       public void run() {
         CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-        MyTransactionListener tl = new MyTransactionListener();
-        txMgr2.setListener(tl);
+        MyTransactionListener<Object, Object> tl = new MyTransactionListener<>();
+        setTxListener(txMgr2, tl);
         try {
           createRegion(rgnName2);
           getSystem().getLogWriter().info("testTXMultiRegion: Created region2");
@@ -6565,8 +6266,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       @Override
       public void run() {
         try {
-          Region root = getRootRegion("root");
-          Region rgn = root.getSubregion(rgnName2);
+          Region<?, ?> root = getRootRegion("root");
+          Region<String, ?> rgn = root.getSubregion(rgnName2);
           rgn.create("key", null);
           getSystem().getLogWriter().info("testTXMultiRegion: Created Key");
         } catch (CacheException e) {
@@ -6579,8 +6280,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       @Override
       public void run() {
         CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-        MyTransactionListener tl = new MyTransactionListener();
-        txMgr2.setListener(tl);
+        MyTransactionListener<Object, Object> tl = new MyTransactionListener<>();
+        setTxListener(txMgr2, tl);
         try {
           createRegion(rgnName3);
           getSystem().getLogWriter().info("testTXMultiRegion: Created Region");
@@ -6593,8 +6294,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       @Override
       public void run() {
         try {
-          Region root = getRootRegion("root");
-          Region rgn = root.getSubregion(rgnName3);
+          Region<?, ?> root = getRootRegion("root");
+          Region<String, ?> rgn = root.getSubregion(rgnName3);
           rgn.create("key", null);
           getSystem().getLogWriter().info("testTXMultiRegion: Created Key");
         } catch (CacheException e) {
@@ -6606,77 +6307,44 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable check1_3 = new SerializableRunnable("testTXMultiRegion: check") {
       @Override
       public void run() {
-        Region rgn1 = getRootRegion().getSubregion(rgnName1);
+        Region<String, String> rgn1 = getRootRegion().getSubregion(rgnName1);
         {
-          assertNotNull("Could not find entry for 'key'", rgn1.getEntry("key"));
-          assertEquals("value1", rgn1.getEntry("key").getValue());
+          assertThat(rgn1.getEntry("key")).describedAs("Could not find entry for 'key'")
+              .isNotNull();
+          assertThat(rgn1.getEntry("key").getValue()).isEqualTo("value1");
         }
-        Region rgn3 = getRootRegion().getSubregion(rgnName3);
+        Region<String, String> rgn3 = getRootRegion().getSubregion(rgnName3);
         {
-          assertNotNull("Could not find entry for 'key'", rgn3.getEntry("key"));
-          assertEquals("value3", rgn3.getEntry("key").getValue());
+          assertThat(rgn3.getEntry("key")).describedAs("Could not find entry for 'key'")
+              .isNotNull();
+          assertThat(rgn3.getEntry("key").getValue()).isEqualTo("value3");
         }
         CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-        MyTransactionListener tl = (MyTransactionListener) txMgr2.getListeners()[0];
+        MyTransactionListener<String, String> tl = firstTransactionListenerFrom(txMgr2);
         tl.checkAfterCommitCount(1);
-        assertEquals(0, tl.afterFailedCommitCount);
-        assertEquals(0, tl.afterRollbackCount);
-        assertEquals(0, tl.closeCount);
-        assertEquals(rgn1.getCache(), tl.lastEvent.getCache());
+        assertThat(tl.afterFailedCommitCount).isEqualTo(0);
+        assertThat(tl.afterRollbackCount).isEqualTo(0);
+        assertThat(tl.closeCount).isEqualTo(0);
+        assertThat(tl.lastEvent.getCache()).isEqualTo(rgn1.getRegionService());
         {
-          Collection events;
-          RegionAttributes attr = getRegionAttributes();
+          Collection<EntryEvent<String, String>> events;
+          RegionAttributes<String, String> attr = getRegionAttributes();
           if (!attr.getDataPolicy().withReplication() || attr.getConcurrencyChecksEnabled()) {
             events = TxEventTestUtil.getPutEvents(tl.lastEvent.getEvents());
           } else {
             events = TxEventTestUtil.getCreateEvents(tl.lastEvent.getEvents());
           }
-          assertEquals(2, events.size());
-          ArrayList eventList = new ArrayList(events);
-          Collections.sort(eventList, new Comparator() {
-            @Override
-            public int compare(Object o1, Object o2) {
-              EntryEvent e1 = (EntryEvent) o1;
-              EntryEvent e2 = (EntryEvent) o2;
-              String s1 = e1.getRegion().getFullPath() + e1.getKey();
-              String s2 = e2.getRegion().getFullPath() + e2.getKey();
-              return s1.compareTo(s2);
-            }
+          assertThat(events.size()).isEqualTo(2);
+          List<EntryEvent<String, String>> eventList = new ArrayList<>(events);
+          eventList.sort((o1, o2) -> {
+            String s1 = o1.getRegion().getFullPath() + o1.getKey();
+            String s2 = o2.getRegion().getFullPath() + o2.getKey();
+            return s1.compareTo(s2);
           });
-          Iterator it = eventList.iterator();
-          EntryEvent ev;
 
-          ev = (EntryEvent) it.next();
-          assertSame(rgn1, ev.getRegion());
-          // assertIndexDetailsEquals(tl.expectedTxId, ev.getTransactionId());
-          assertEquals("key", ev.getKey());
-          assertEquals("value1", ev.getNewValue());
-          assertEquals(null, ev.getOldValue());
-          assertTrue(!ev.getOperation().isLocalLoad());
-          assertTrue(!ev.getOperation().isNetLoad());
-          assertTrue(!ev.getOperation().isLoad());
-          assertTrue(!ev.getOperation().isNetSearch());
-          assertTrue(!ev.getOperation().isExpiration());
-          assertEquals(null, ev.getCallbackArgument());
-          assertEquals(true, ev.isCallbackArgumentAvailable());
-          assertTrue(ev.isOriginRemote());
-          assertTrue(ev.getOperation().isDistributed());
-
-          ev = (EntryEvent) it.next();
-          assertSame(rgn3, ev.getRegion());
-          // assertIndexDetailsEquals(tl.expectedTxId, ev.getTransactionId());
-          assertEquals("key", ev.getKey());
-          assertEquals("value3", ev.getNewValue());
-          assertEquals(null, ev.getOldValue());
-          assertTrue(!ev.getOperation().isLocalLoad());
-          assertTrue(!ev.getOperation().isNetLoad());
-          assertTrue(!ev.getOperation().isLoad());
-          assertTrue(!ev.getOperation().isNetSearch());
-          assertTrue(!ev.getOperation().isExpiration());
-          assertEquals(null, ev.getCallbackArgument());
-          assertEquals(true, ev.isCallbackArgumentAvailable());
-          assertTrue(ev.isOriginRemote());
-          assertTrue(ev.getOperation().isDistributed());
+          verifyMirrorRegionEventsMatch(eventList.get(0), rgn1, "value1");
+
+          verifyMirrorRegionEventsMatch(eventList.get(1), rgn3, "value3");
         }
       }
     };
@@ -6685,75 +6353,42 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       public void run() {
         Region rgn2 = getRootRegion().getSubregion(rgnName2);
         {
-          assertNotNull("Could not find entry for 'key'", rgn2.getEntry("key"));
-          assertEquals("value2", rgn2.getEntry("key").getValue());
+          assertThat(rgn2.getEntry("key")).describedAs("Could not find entry for 'key'")
+              .isNotNull();
+          assertThat(rgn2.getEntry("key").getValue()).isEqualTo("value2");
         }
         Region rgn3 = getRootRegion().getSubregion(rgnName3);
         {
-          assertNotNull("Could not find entry for 'key'", rgn3.getEntry("key"));
-          assertEquals("value3", rgn3.getEntry("key").getValue());
+          assertThat(rgn3.getEntry("key")).describedAs("Could not find entry for 'key'")
+              .isNotNull();
+          assertThat(rgn3.getEntry("key").getValue()).isEqualTo("value3");
         }
         CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-        MyTransactionListener tl = (MyTransactionListener) txMgr2.getListeners()[0];
+        MyTransactionListener<String, String> tl = firstTransactionListenerFrom(txMgr2);
         tl.checkAfterCommitCount(1);
-        assertEquals(0, tl.afterFailedCommitCount);
-        assertEquals(0, tl.afterRollbackCount);
-        assertEquals(0, tl.closeCount);
-        assertEquals(rgn2.getCache(), tl.lastEvent.getCache());
+        assertThat(tl.afterFailedCommitCount).isEqualTo(0);
+        assertThat(tl.afterRollbackCount).isEqualTo(0);
+        assertThat(tl.closeCount).isEqualTo(0);
+        assertThat(tl.lastEvent.getCache()).isEqualTo(rgn2.getRegionService());
         {
-          Collection events;
+          Collection<EntryEvent<String, String>> events;
           RegionAttributes attr = getRegionAttributes();
           if (!attr.getDataPolicy().withReplication() || attr.getConcurrencyChecksEnabled()) {
             events = TxEventTestUtil.getPutEvents(tl.lastEvent.getEvents());
           } else {
             events = TxEventTestUtil.getCreateEvents(tl.lastEvent.getEvents());
           }
-          assertEquals(2, events.size());
-          ArrayList eventList = new ArrayList(events);
-          Collections.sort(eventList, new Comparator() {
-            @Override
-            public int compare(Object o1, Object o2) {
-              EntryEvent e1 = (EntryEvent) o1;
-              EntryEvent e2 = (EntryEvent) o2;
-              String s1 = e1.getRegion().getFullPath() + e1.getKey();
-              String s2 = e2.getRegion().getFullPath() + e2.getKey();
-              return s1.compareTo(s2);
-            }
+          assertThat(events.size()).isEqualTo(2);
+          List<EntryEvent<String, String>> eventList = new ArrayList<>(events);
+          eventList.sort((o1, o2) -> {
+            String s1 = o1.getRegion().getFullPath() + o1.getKey();
+            String s2 = o2.getRegion().getFullPath() + o2.getKey();
+            return s1.compareTo(s2);
           });
-          Iterator it = eventList.iterator();
-          EntryEvent ev;
 
-          ev = (EntryEvent) it.next();
-          assertSame(rgn2, ev.getRegion());
-          // assertIndexDetailsEquals(tl.expectedTxId, ev.getTransactionId());
-          assertEquals("key", ev.getKey());
-          assertEquals("value2", ev.getNewValue());
-          assertEquals(null, ev.getOldValue());
-          assertTrue(!ev.getOperation().isLocalLoad());
-          assertTrue(!ev.getOperation().isNetLoad());
-          assertTrue(!ev.getOperation().isLoad());
-          assertTrue(!ev.getOperation().isNetSearch());
-          assertTrue(!ev.getOperation().isExpiration());
-          assertEquals(null, ev.getCallbackArgument());
-          assertEquals(true, ev.isCallbackArgumentAvailable());
-          assertTrue(ev.isOriginRemote());
-          assertTrue(ev.getOperation().isDistributed());
-
-          ev = (EntryEvent) it.next();
-          assertSame(rgn3, ev.getRegion());
-          // assertIndexDetailsEquals(tl.expectedTxId, ev.getTransactionId());
-          assertEquals("key", ev.getKey());
-          assertEquals("value3", ev.getNewValue());
-          assertEquals(null, ev.getOldValue());
-          assertTrue(!ev.getOperation().isLocalLoad());
-          assertTrue(!ev.getOperation().isNetLoad());
-          assertTrue(!ev.getOperation().isLoad());
-          assertTrue(!ev.getOperation().isNetSearch());
-          assertTrue(!ev.getOperation().isExpiration());
-          assertEquals(null, ev.getCallbackArgument());
-          assertEquals(true, ev.isCallbackArgumentAvailable());
-          assertTrue(ev.isOriginRemote());
-          assertTrue(ev.getOperation().isDistributed());
+          verifyMirrorRegionEventsMatch(eventList.get(0), rgn2, "value2");
+
+          verifyMirrorRegionEventsMatch(eventList.get(1), rgn3, "value3");
 
         }
       }
@@ -6761,135 +6396,133 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable check1 = new SerializableRunnable("testTXMultiRegion: check") {
       @Override
       public void run() {
-        Region rgn = getRootRegion().getSubregion(rgnName1);
-        assertNotNull("Could not find entry for 'key'", rgn.getEntry("key"));
-        assertEquals("value1", rgn.getEntry("key").getValue());
+        Region<String, String> rgn = getRootRegion().getSubregion(rgnName1);
+        assertThat(rgn.getEntry("key")).describedAs("Could not find entry for 'key'").isNotNull();
+        assertThat(rgn.getEntry("key").getValue()).isEqualTo("value1");
         CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-        MyTransactionListener tl = (MyTransactionListener) txMgr2.getListeners()[0];
+        MyTransactionListener<String, String> tl = firstTransactionListenerFrom(txMgr2);
         tl.checkAfterCommitCount(1);
-        assertEquals(0, tl.afterFailedCommitCount);
-        assertEquals(0, tl.afterRollbackCount);
-        assertEquals(0, tl.closeCount);
-        assertEquals(rgn.getCache(), tl.lastEvent.getCache());
+        assertThat(tl.afterFailedCommitCount).isEqualTo(0);
+        assertThat(tl.afterRollbackCount).isEqualTo(0);
+        assertThat(tl.closeCount).isEqualTo(0);
+        assertThat(tl.lastEvent.getCache()).isEqualTo(rgn.getRegionService());
         {
-          Collection events;
-          RegionAttributes attr = getRegionAttributes();
+          Collection<EntryEvent<String, String>> events;
+          RegionAttributes<String, String> attr = getRegionAttributes();
           if (!attr.getDataPolicy().withReplication() || attr.getConcurrencyChecksEnabled()) {
             events = TxEventTestUtil.getPutEvents(tl.lastEvent.getEvents());
           } else {
             events = TxEventTestUtil.getCreateEvents(tl.lastEvent.getEvents());
           }
-          assertEquals(1, events.size());
-          EntryEvent ev = (EntryEvent) events.iterator().next();
+          assertThat(events.size()).isEqualTo(1);
+          EntryEvent<String, String> ev = events.iterator().next();
           // assertIndexDetailsEquals(tl.expectedTxId, ev.getTransactionId());
-          assertTrue(ev.getRegion() == rgn);
-          assertEquals("key", ev.getKey());
-          assertEquals("value1", ev.getNewValue());
-          assertEquals(null, ev.getOldValue());
-          assertTrue(!ev.getOperation().isLocalLoad());
-          assertTrue(!ev.getOperation().isNetLoad());
-          assertTrue(!ev.getOperation().isLoad());
-          assertTrue(!ev.getOperation().isNetSearch());
-          assertTrue(!ev.getOperation().isExpiration());
-          assertEquals(null, ev.getCallbackArgument());
-          assertEquals(true, ev.isCallbackArgumentAvailable());
-          assertTrue(ev.isOriginRemote());
-          assertTrue(ev.getOperation().isDistributed());
+          assertThat(rgn).isSameAs(ev.getRegion());
+          assertThat(ev.getKey()).isEqualTo("key");
+          assertThat(ev.getNewValue()).isEqualTo("value1");
+          assertThat(ev.getOldValue()).isNull();
+          assertThat(ev.getOperation().isLocalLoad()).isFalse();
+          assertThat(ev.getOperation().isNetLoad()).isFalse();
+          assertThat(ev.getOperation().isLoad()).isFalse();
+          assertThat(ev.getOperation().isNetSearch()).isFalse();
+          assertThat(ev.getOperation().isExpiration()).isFalse();
+          assertThat(ev.getCallbackArgument()).isNull();
+          assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+          assertThat(ev.isOriginRemote()).isTrue();
+          assertThat(ev.getOperation().isDistributed()).isTrue();
         }
       }
     };
     SerializableRunnable check2 = new SerializableRunnable("testTXMultiRegion: check") {
       @Override
       public void run() {
-        Region rgn = getRootRegion().getSubregion(rgnName2);
-        assertNotNull("Could not find entry for 'key'", rgn.getEntry("key"));
-        assertEquals("value2", rgn.getEntry("key").getValue());
+        Region<String, String> rgn = getRootRegion().getSubregion(rgnName2);
+        assertThat(rgn.getEntry("key")).describedAs("Could not find entry for 'key'").isNotNull();
+        assertThat(rgn.getEntry("key").getValue()).isEqualTo("value2");
         CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-        MyTransactionListener tl = (MyTransactionListener) txMgr2.getListeners()[0];
+        MyTransactionListener<String, String> tl = firstTransactionListenerFrom(txMgr2);
         tl.checkAfterCommitCount(1);
-        assertEquals(0, tl.afterFailedCommitCount);
-        assertEquals(0, tl.afterRollbackCount);
-        assertEquals(0, tl.closeCount);
-        assertEquals(rgn.getCache(), tl.lastEvent.getCache());
+        assertThat(tl.afterFailedCommitCount).isEqualTo(0);
+        assertThat(tl.afterRollbackCount).isEqualTo(0);
+        assertThat(tl.closeCount).isEqualTo(0);
+        assertThat(tl.lastEvent.getCache()).isEqualTo(rgn.getRegionService());
         {
-          Collection events;
-          RegionAttributes attr = getRegionAttributes();
+          Collection<EntryEvent<String, String>> events;
+          RegionAttributes<String, String> attr = getRegionAttributes();
           if (!attr.getDataPolicy().withReplication() || attr.getConcurrencyChecksEnabled()) {
             events = TxEventTestUtil.getPutEvents(tl.lastEvent.getEvents());
           } else {
             events = TxEventTestUtil.getCreateEvents(tl.lastEvent.getEvents());
           }
-          assertEquals(1, events.size());
-          EntryEvent ev = (EntryEvent) events.iterator().next();
-          // assertIndexDetailsEquals(tl.expectedTxId, ev.getTransactionId());
-          assertTrue(ev.getRegion() == rgn);
-          assertEquals("key", ev.getKey());
-          assertEquals("value2", ev.getNewValue());
-          assertEquals(null, ev.getOldValue());
-          assertTrue(!ev.getOperation().isLocalLoad());
-          assertTrue(!ev.getOperation().isNetLoad());
-          assertTrue(!ev.getOperation().isLoad());
-          assertTrue(!ev.getOperation().isNetSearch());
-          assertTrue(!ev.getOperation().isExpiration());
-          assertEquals(null, ev.getCallbackArgument());
-          assertEquals(true, ev.isCallbackArgumentAvailable());
-          assertTrue(ev.isOriginRemote());
-          assertTrue(ev.getOperation().isDistributed());
+          assertThat(events.size()).isEqualTo(1);
+          EntryEvent<String, String> ev = events.iterator().next();
+          assertThat(rgn).isSameAs(ev.getRegion());
+          assertThat(ev.getKey()).isEqualTo("key");
+          assertThat(ev.getNewValue()).isEqualTo("value2");
+          assertThat(ev.getOldValue()).isNull();
+          assertThat(ev.getOperation().isLocalLoad()).isFalse();
+          assertThat(ev.getOperation().isNetLoad()).isFalse();
+          assertThat(ev.getOperation().isLoad()).isFalse();
+          assertThat(ev.getOperation().isNetSearch()).isFalse();
+          assertThat(ev.getOperation().isExpiration()).isFalse();
+          assertThat(ev.getCallbackArgument()).isNull();
+          assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+          assertThat(ev.isOriginRemote()).isTrue();
+          assertThat(ev.getOperation().isDistributed()).isTrue();
         }
       }
     };
     SerializableRunnable check3 = new SerializableRunnable("testTXMultiRegion: check") {
       @Override
       public void run() {
-        Region rgn = getRootRegion().getSubregion(rgnName3);
-        assertNotNull("Could not find entry for 'key'", rgn.getEntry("key"));
-        assertEquals("value3", rgn.getEntry("key").getValue());
+        Region<String, String> rgn = getRootRegion().getSubregion(rgnName3);
+        assertThat(rgn.getEntry("key")).describedAs("Could not find entry for 'key'").isNotNull();
+        assertThat(rgn.getEntry("key").getValue()).isEqualTo("value3");
         CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-        MyTransactionListener tl = (MyTransactionListener) txMgr2.getListeners()[0];
+        MyTransactionListener<String, String> tl = firstTransactionListenerFrom(txMgr2);
         tl.checkAfterCommitCount(1);
-        assertEquals(0, tl.afterFailedCommitCount);
-        assertEquals(0, tl.afterRollbackCount);
-        assertEquals(0, tl.closeCount);
-        assertEquals(rgn.getCache(), tl.lastEvent.getCache());
+        assertThat(tl.afterFailedCommitCount).isEqualTo(0);
+        assertThat(tl.afterRollbackCount).isEqualTo(0);
+        assertThat(tl.closeCount).isEqualTo(0);
+        assertThat(tl.lastEvent.getCache()).isEqualTo(rgn.getRegionService());
         {
-          Collection events;
+          Collection<EntryEvent<String, String>> events;
           RegionAttributes attr = getRegionAttributes();
           if (!attr.getDataPolicy().withReplication() || attr.getConcurrencyChecksEnabled()) {
             events = TxEventTestUtil.getPutEvents(tl.lastEvent.getEvents());
           } else {
             events = TxEventTestUtil.getCreateEvents(tl.lastEvent.getEvents());
           }
-          assertEquals(1, events.size());
-          EntryEvent ev = (EntryEvent) events.iterator().next();
+          assertThat(events.size()).isEqualTo(1);
+          EntryEvent<String, String> ev = events.iterator().next();
           // assertIndexDetailsEquals(tl.expectedTxId, ev.getTransactionId());
-          assertTrue(ev.getRegion() == rgn);
-          assertEquals("key", ev.getKey());
-          assertEquals("value3", ev.getNewValue());
-          assertEquals(null, ev.getOldValue());
-          assertTrue(!ev.getOperation().isLocalLoad());
-          assertTrue(!ev.getOperation().isNetLoad());
-          assertTrue(!ev.getOperation().isLoad());
-          assertTrue(!ev.getOperation().isNetSearch());
-          assertTrue(!ev.getOperation().isExpiration());
-          assertEquals(null, ev.getCallbackArgument());
-          assertEquals(true, ev.isCallbackArgumentAvailable());
-          assertTrue(ev.isOriginRemote());
-          assertTrue(ev.getOperation().isDistributed());
+          assertThat(rgn).isSameAs(ev.getRegion());
+          assertThat(ev.getKey()).isEqualTo("key");
+          assertThat(ev.getNewValue()).isEqualTo("value3");
+          assertThat(ev.getOldValue()).isNull();
+          assertThat(ev.getOperation().isLocalLoad()).isFalse();
+          assertThat(ev.getOperation().isNetLoad()).isFalse();
+          assertThat(ev.getOperation().isLoad()).isFalse();
+          assertThat(ev.getOperation().isNetSearch()).isFalse();
+          assertThat(ev.getOperation().isExpiration()).isFalse();
+          assertThat(ev.getCallbackArgument()).isNull();
+          assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+          assertThat(ev.isOriginRemote()).isTrue();
+          assertThat(ev.getOperation().isDistributed()).isTrue();
         }
       }
     };
 
-    // GemFireVersion.waitForJavaDebugger(getLogWriter(), "CTRLR WAITING AFTER CREATE");
-    VM vm0 = Host.getHost(0).getVM(0);
-    VM vm1 = Host.getHost(0).getVM(1);
-    VM vm2 = Host.getHost(0).getVM(2);
-    VM vm3 = Host.getHost(0).getVM(3);
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
+    VM vm2 = VM.getVM(2);
+    VM vm3 = VM.getVM(3);
 
     try {
       DMStats dmStats = getSystem().getDistributionManager().getStats();
-      Region rgn1;
-      Region rgn2;
-      Region rgn3;
+      Region<String, String> rgn1;
+      Region<String, String> rgn2;
+      Region<String, String> rgn3;
       long cmtMsgs;
       // long sentMsgs;
       long commitWaits;
@@ -6903,7 +6536,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       vm1.invoke(create1);
       vm1.invoke(create3);
       if (!getRegionAttributes().getDataPolicy().withReplication()
-          && !getRegionAttributes().getDataPolicy().isPreloaded()) {
+          && !getRegionAttributes().getDataPolicy().withPreloaded()) {
         vm1.invoke(newKey1);
         vm1.invoke(newKey3);
       }
@@ -6914,7 +6547,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       vm3.invoke(create2);
       vm3.invoke(create3);
       if (!getRegionAttributes().getDataPolicy().withReplication()
-          && !getRegionAttributes().getDataPolicy().isPreloaded()) {
+          && !getRegionAttributes().getDataPolicy().withPreloaded()) {
         vm3.invoke(newKey2);
         vm3.invoke(newKey3);
       }
@@ -6933,12 +6566,12 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       getSystem().getLogWriter()
           .info("testTXMultiRegion: vm0->R1,R3 vm1->R1,R3 vm2->R2 vm3->R2,R3");
       txMgr.commit();
-      assertEquals(cmtMsgs + 3, dmStats.getSentCommitMessages());
+      assertThat(dmStats.getSentCommitMessages()).isEqualTo(cmtMsgs + 3);
       if (rgn1.getAttributes().getScope().isAck() || rgn2.getAttributes().getScope().isAck()
           || rgn3.getAttributes().getScope().isAck()) {
-        assertEquals(commitWaits + 1, dmStats.getCommitWaits());
+        assertThat(dmStats.getCommitWaits()).isEqualTo(commitWaits + 1);
       } else {
-        assertEquals(commitWaits, dmStats.getCommitWaits());
+        assertThat(dmStats.getCommitWaits()).isEqualTo(commitWaits);
         // pause to give cmt message a chance to be processed
         // [bruce] changed from 200 to 2000 for mcast testing
         try {
@@ -6964,7 +6597,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       vm1.invoke(create1);
       vm1.invoke(create3);
       if (!getRegionAttributes().getDataPolicy().withReplication()
-          && !getRegionAttributes().getDataPolicy().isPreloaded()) {
+          && !getRegionAttributes().getDataPolicy().withPreloaded()) {
         vm1.invoke(newKey1);
         vm1.invoke(newKey3);
       }
@@ -6973,14 +6606,14 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       vm2.invoke(newKey2);
       vm2.invoke(create3);
       if (!getRegionAttributes().getDataPolicy().withReplication()
-          && !getRegionAttributes().getDataPolicy().isPreloaded()) {
+          && !getRegionAttributes().getDataPolicy().withPreloaded()) {
         vm2.invoke(newKey3);
       }
 
       vm3.invoke(create2);
       vm3.invoke(create3);
       if (!getRegionAttributes().getDataPolicy().withReplication()
-          && !getRegionAttributes().getDataPolicy().isPreloaded()) {
+          && !getRegionAttributes().getDataPolicy().withPreloaded()) {
         vm3.invoke(newKey2);
         vm3.invoke(newKey3);
       }
@@ -6995,16 +6628,16 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       rgn1.put("key", "value1");
       rgn2.put("key", "value2");
       rgn3.put("key", "value3");
-      // txId = txMgr.getTransactionId();
+
       getSystem().getLogWriter()
           .info("testTXMultiRegion: vm0->R1,R3 vm1->R1,R3 vm2->R2,R3 vm3->R2,R3");
       txMgr.commit();
-      assertEquals(cmtMsgs + 2, dmStats.getSentCommitMessages());
+      assertThat(dmStats.getSentCommitMessages()).isEqualTo(cmtMsgs + 2);
       if (rgn1.getAttributes().getScope().isAck() || rgn2.getAttributes().getScope().isAck()
           || rgn3.getAttributes().getScope().isAck()) {
-        assertEquals(commitWaits + 1, dmStats.getCommitWaits());
+        assertThat(dmStats.getCommitWaits()).isEqualTo(commitWaits + 1);
       } else {
-        assertEquals(commitWaits, dmStats.getCommitWaits());
+        assertThat(dmStats.getCommitWaits()).isEqualTo(commitWaits);
         // pause to give cmt message a chance to be processed
         try {
           Thread.sleep(200);
@@ -7029,7 +6662,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       vm1.invoke(create1);
       vm1.invoke(create3);
       if (!getRegionAttributes().getDataPolicy().withReplication()
-          && !getRegionAttributes().getDataPolicy().isPreloaded()) {
+          && !getRegionAttributes().getDataPolicy().withPreloaded()) {
         vm1.invoke(newKey1);
         vm1.invoke(newKey3);
       }
@@ -7040,7 +6673,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       vm3.invoke(create1);
       vm3.invoke(create3);
       if (!getRegionAttributes().getDataPolicy().withReplication()
-          && !getRegionAttributes().getDataPolicy().isPreloaded()) {
+          && !getRegionAttributes().getDataPolicy().withPreloaded()) {
         vm3.invoke(newKey1);
         vm3.invoke(newKey3);
       }
@@ -7055,16 +6688,16 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       rgn1.put("key", "value1");
       rgn2.put("key", "value2");
       rgn3.put("key", "value3");
-      // txId = txMgr.getTransactionId();
+
       getSystem().getLogWriter()
           .info("testTXMultiRegion: vm0->R1,R3 vm1->R1,R3 vm2->R2 vm3->R1,R3");
       txMgr.commit();
-      assertEquals(cmtMsgs + 2, dmStats.getSentCommitMessages());
+      assertThat(dmStats.getSentCommitMessages()).isEqualTo(cmtMsgs + 2);
       if (rgn1.getAttributes().getScope().isAck() || rgn2.getAttributes().getScope().isAck()
           || rgn3.getAttributes().getScope().isAck()) {
-        assertEquals(commitWaits + 1, dmStats.getCommitWaits());
+        assertThat(dmStats.getCommitWaits()).isEqualTo(commitWaits + 1);
       } else {
-        assertEquals(commitWaits, dmStats.getCommitWaits());
+        assertThat(dmStats.getCommitWaits()).isEqualTo(commitWaits);
         // pause to give cmt message a chance to be processed
         try {
           Thread.sleep(200);
@@ -7086,7 +6719,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
 
       vm1.invoke(create1);
       if (!getRegionAttributes().getDataPolicy().withReplication()
-          && !getRegionAttributes().getDataPolicy().isPreloaded()) {
+          && !getRegionAttributes().getDataPolicy().withPreloaded()) {
         vm1.invoke(newKey1);
       }
 
@@ -7106,15 +6739,15 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       rgn1.put("key", "value1");
       rgn2.put("key", "value2");
       rgn3.put("key", "value3");
-      // txId = txMgr.getTransactionId();
+
       getSystem().getLogWriter().info("testTXMultiRegion: vm0->R1 vm1->R1 vm2->R2 vm3->R3");
       txMgr.commit();
-      assertEquals(cmtMsgs + 3, dmStats.getSentCommitMessages());
+      assertThat(dmStats.getSentCommitMessages()).isEqualTo(cmtMsgs + 3);
       if (rgn1.getAttributes().getScope().isAck() || rgn2.getAttributes().getScope().isAck()
           || rgn3.getAttributes().getScope().isAck()) {
-        assertEquals(commitWaits + 1, dmStats.getCommitWaits());
+        assertThat(dmStats.getCommitWaits()).isEqualTo(commitWaits + 1);
       } else {
-        assertEquals(commitWaits, dmStats.getCommitWaits());
+        assertThat(dmStats.getCommitWaits()).isEqualTo(commitWaits);
         // pause to give cmt message a chance to be processed
         try {
           Thread.sleep(200);
@@ -7140,19 +6773,19 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       vm1.invoke(newKey2);
       vm1.invoke(create3);
       if (!getRegionAttributes().getDataPolicy().withReplication()
-          && !getRegionAttributes().getDataPolicy().isPreloaded()) {
+          && !getRegionAttributes().getDataPolicy().withPreloaded()) {
         vm1.invoke(newKey3);
       }
 
       vm2.invoke(create2);
       if (!getRegionAttributes().getDataPolicy().withReplication()
-          && !getRegionAttributes().getDataPolicy().isPreloaded()) {
+          && !getRegionAttributes().getDataPolicy().withPreloaded()) {
         vm2.invoke(newKey2);
       }
 
       vm3.invoke(create3);
       if (!getRegionAttributes().getDataPolicy().withReplication()
-          && !getRegionAttributes().getDataPolicy().isPreloaded()) {
+          && !getRegionAttributes().getDataPolicy().withPreloaded()) {
         vm3.invoke(newKey3);
       }
 
@@ -7166,15 +6799,15 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       rgn1.put("key", "value1");
       rgn2.put("key", "value2");
       rgn3.put("key", "value3");
-      // txId = txMgr.getTransactionId();
+
       getSystem().getLogWriter().info("testTXMultiRegion: vm0->R1,R3 vm1->R2,R3 vm2->R2 vm3->R3");
       txMgr.commit();
-      assertEquals(cmtMsgs + 4, dmStats.getSentCommitMessages());
+      assertThat(dmStats.getSentCommitMessages()).isEqualTo(cmtMsgs + 4);
       if (rgn1.getAttributes().getScope().isAck() || rgn2.getAttributes().getScope().isAck()
           || rgn3.getAttributes().getScope().isAck()) {
-        assertEquals(commitWaits + 1, dmStats.getCommitWaits());
+        assertThat(dmStats.getCommitWaits()).isEqualTo(commitWaits + 1);
       } else {
-        assertEquals(commitWaits, dmStats.getCommitWaits());
+        assertThat(dmStats.getCommitWaits()).isEqualTo(commitWaits);
         // pause to give cmt message a chance to be processed
         try {
           Thread.sleep(200);
@@ -7198,19 +6831,19 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
 
       vm1.invoke(create1);
       if (!getRegionAttributes().getDataPolicy().withReplication()
-          && !getRegionAttributes().getDataPolicy().isPreloaded()) {
+          && !getRegionAttributes().getDataPolicy().withPreloaded()) {
         vm1.invoke(newKey1);
       }
       vm1.invoke(create3);
       if (!getRegionAttributes().getDataPolicy().withReplication()
-          && !getRegionAttributes().getDataPolicy().isPreloaded()) {
+          && !getRegionAttributes().getDataPolicy().withPreloaded()) {
         vm1.invoke(newKey3);
       }
 
       vm2.invoke(create1);
       vm2.invoke(create3);
       if (!getRegionAttributes().getDataPolicy().withReplication()
-          && !getRegionAttributes().getDataPolicy().isPreloaded()) {
+          && !getRegionAttributes().getDataPolicy().withPreloaded()) {
         vm2.invoke(newKey1);
         vm2.invoke(newKey3);
       }
@@ -7218,7 +6851,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       vm3.invoke(create1);
       vm3.invoke(create3);
       if (!getRegionAttributes().getDataPolicy().withReplication()
-          && !getRegionAttributes().getDataPolicy().isPreloaded()) {
+          && !getRegionAttributes().getDataPolicy().withPreloaded()) {
         vm3.invoke(newKey1);
         vm3.invoke(newKey3);
       }
@@ -7233,16 +6866,16 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       rgn1.put("key", "value1");
       rgn2.put("key", "value2");
       rgn3.put("key", "value3");
-      // txId = txMgr.getTransactionId();
+
       getSystem().getLogWriter()
           .info("testTXMultiRegion: vm0->R1,R3 vm1->R1,R3 vm2->R1,R3 vm3->R1,R3");
       txMgr.commit();
-      assertEquals(cmtMsgs + 1, dmStats.getSentCommitMessages());
+      assertThat(dmStats.getSentCommitMessages()).isEqualTo(cmtMsgs + 1);
       if (rgn1.getAttributes().getScope().isAck() || rgn2.getAttributes().getScope().isAck()
           || rgn3.getAttributes().getScope().isAck()) {
-        assertEquals(commitWaits + 1, dmStats.getCommitWaits());
+        assertThat(dmStats.getCommitWaits()).isEqualTo(commitWaits + 1);
       } else {
-        assertEquals(commitWaits, dmStats.getCommitWaits());
+        assertThat(dmStats.getCommitWaits()).isEqualTo(commitWaits);
         // pause to give cmt message a chance to be processed
         try {
           Thread.sleep(200);
@@ -7264,13 +6897,40 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     }
   }
 
+  /**
+   * Clear all existing transaction listeners and install the given listener.
+   */
+  private static <K, V> void setTxListener(CacheTransactionManager manager,
+      TransactionListener<K, V> listener) {
+    Stream.of(manager.getListeners())
+        .forEach(manager::removeListener);
+    manager.addListener(listener);
+  }
+
+  private void verifyMirrorRegionEventsMatch(EntryEvent<String, String> event, Region region,
+      String expectedValue) {
+    assertThat(event.getRegion()).isSameAs(region);
+    assertThat(event.getKey()).isEqualTo("key");
+    assertThat(event.getNewValue()).isEqualTo(expectedValue);
+    assertThat(event.getOldValue()).isNull();
+    assertThat(event.getOperation().isLocalLoad()).isFalse();
+    assertThat(event.getOperation().isNetLoad()).isFalse();
+    assertThat(event.getOperation().isLoad()).isFalse();
+    assertThat(event.getOperation().isNetSearch()).isFalse();
+    assertThat(event.getOperation().isExpiration()).isFalse();
+    assertThat(event.getCallbackArgument()).isNull();
+    assertThat(event.isCallbackArgumentAvailable()).isTrue();
+    assertThat(event.isOriginRemote()).isTrue();
+    assertThat(event.getOperation().isDistributed()).isTrue();
+  }
+
   @Test
-  public void testTXRmtMirror() throws Exception {
-    assumeTrue(supportsTransactions());
-    assumeFalse(getRegionAttributes().getScope().isGlobal());
-    assumeFalse(getRegionAttributes().getDataPolicy().withPersistence());
+  public void testTXRmtMirror() {
+    assumeThat(supportsTransactions()).isTrue();
+    assumeThat(getRegionAttributes().getScope().isGlobal()).isFalse();
+    assumeThat(getRegionAttributes().getDataPolicy().withPersistence()).isFalse();
 
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
     CacheTransactionManager txMgr = this.getCache().getCacheTransactionManager();
 
     final String rgnName = getUniqueName();
@@ -7280,10 +6940,10 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
           @Override
           public void run() {
             CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-            MyTransactionListener tl = new MyTransactionListener();
-            txMgr2.addListener(tl);
+            MyTransactionListener<Object, Object> tl = new MyTransactionListener<>();
+            setTxListener(txMgr2, tl);
             try {
-              AttributesFactory rgnAtts = new AttributesFactory(getRegionAttributes());
+              AttributesFactory<?, ?> rgnAtts = new AttributesFactory<>(getRegionAttributes());
               rgnAtts.setDataPolicy(DataPolicy.REPLICATE);
               createRegion(rgnName, rgnAtts.create());
             } catch (CacheException e) {
@@ -7297,10 +6957,10 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
           @Override
           public void run() {
             CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-            MyTransactionListener tl = new MyTransactionListener();
-            txMgr2.addListener(tl);
+            MyTransactionListener<Object, Object> tl = new MyTransactionListener<>();
+            setTxListener(txMgr2, tl);
             try {
-              AttributesFactory rgnAtts = new AttributesFactory(getRegionAttributes());
+              AttributesFactory<?, ?> rgnAtts = new AttributesFactory<>(getRegionAttributes());
               rgnAtts.setDataPolicy(DataPolicy.NORMAL);
               createRegion(rgnName, rgnAtts.create());
             } catch (CacheException e) {
@@ -7309,9 +6969,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
           }
         };
 
-
-
-    Region region;
+    Region<String, String> region;
 
     // Make sure that a remote create done in a tx is created in a remote mirror
     // and dropped in a remote non-mirror
@@ -7327,7 +6985,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     txMgr.commit();
 
     if (!region.getAttributes().getScope().isAck()) {
-      Awaitility.await().atMost(5, TimeUnit.MINUTES)
+      waitAtMost(5, MINUTES)
           .untilAsserted(() -> validateTXRmtMirror(rgnName, vm0, vm1));
     } else {
       validateTXRmtMirror(rgnName, vm0, vm1);
@@ -7338,55 +6996,57 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     SerializableRunnable checkExists = new SerializableRunnable("textTXRmtMirror: checkExists") {
       @Override
       public void run() {
-        Region rgn = getRootRegion().getSubregion(rgnName);
+        Region<String, String> rgn = getRootRegion().getSubregion(rgnName);
         {
-          assertNotNull("Could not find entry for 'key'", rgn.getEntry("key"));
-          assertEquals("value", rgn.getEntry("key").getValue());
+          assertThat(rgn.getEntry("key")).describedAs("Could not find entry for 'key'").isNotNull();
+          assertThat(rgn.getEntry("key").getValue()).isEqualTo("value");
         }
         CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-        MyTransactionListener tl = (MyTransactionListener) txMgr2.getListeners()[0];
+        MyTransactionListener<String, String> tl = firstTransactionListenerFrom(txMgr2);
         tl.checkAfterCommitCount(1);
-        assertEquals(0, tl.afterFailedCommitCount);
-        assertEquals(0, tl.afterRollbackCount);
-        assertEquals(0, tl.closeCount);
-        assertEquals(rgn.getCache(), tl.lastEvent.getCache());
+        assertThat(tl.afterFailedCommitCount).isEqualTo(0);
+        assertThat(tl.afterRollbackCount).isEqualTo(0);
+        assertThat(tl.closeCount).isEqualTo(0);
+        assertThat(tl.lastEvent.getCache()).isEqualTo(rgn.getRegionService());
         {
-          Collection events = TxEventTestUtil.getCreateEvents(tl.lastEvent.getEvents());
-          assertEquals(1, events.size());
-          EntryEvent ev = (EntryEvent) events.iterator().next();
-          // assertIndexDetailsEquals(tl.expectedTxId, ev.getTransactionId());
-          assertTrue(ev.getRegion() == rgn);
-          assertEquals("key", ev.getKey());
-          assertEquals("value", ev.getNewValue());
-          assertEquals(null, ev.getOldValue());
-          assertTrue(!ev.getOperation().isLocalLoad());
-          assertTrue(!ev.getOperation().isNetLoad());
-          assertTrue(!ev.getOperation().isLoad());
-          assertTrue(!ev.getOperation().isNetSearch());
-          assertTrue(!ev.getOperation().isExpiration());
-          assertEquals(null, ev.getCallbackArgument());
-          assertEquals(true, ev.isCallbackArgumentAvailable());
-          assertTrue(ev.isOriginRemote());
-          assertTrue(ev.getOperation().isDistributed());
+          Collection<EntryEvent<String, String>> events =
+              TxEventTestUtil.getCreateEvents(tl.lastEvent.getEvents());
+          assertThat(events.size()).isEqualTo(1);
+          EntryEvent<String, String> ev = events.iterator().next();
+          assertThat(rgn).isSameAs(ev.getRegion());
+          assertThat(ev.getKey()).isEqualTo("key");
+          assertThat(ev.getNewValue()).isEqualTo("value");
+          assertThat(ev.getOldValue()).isNull();
+          assertThat(ev.getOperation().isLocalLoad()).isFalse();
+          assertThat(ev.getOperation().isNetLoad()).isFalse();
+          assertThat(ev.getOperation().isLoad()).isFalse();
+          assertThat(ev.getOperation().isNetSearch()).isFalse();
+          assertThat(ev.getOperation().isExpiration()).isFalse();
+          assertThat(ev.getCallbackArgument()).isNull();
+          assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+          assertThat(ev.isOriginRemote()).isTrue();
+          assertThat(ev.getOperation().isDistributed()).isTrue();
         }
       }
     };
     SerializableRunnable checkNoKey = new SerializableRunnable("textTXRmtMirror: checkNoKey") {
       @Override
       public void run() {
-        Region rgn = getRootRegion().getSubregion(rgnName);
+        Region<String, String> rgn = getRootRegion().getSubregion(rgnName);
         {
-          assertTrue(rgn.getEntry("key") == null);
+          assertThat(rgn.getEntry("key")).isNull();
         }
         CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-        MyTransactionListener tl = (MyTransactionListener) txMgr2.getListeners()[0];
+        MyTransactionListener<String, String> tl = firstTransactionListenerFrom(txMgr2);
         tl.checkAfterCommitCount(1);
-        assertEquals(0, tl.afterFailedCommitCount);
-        assertEquals(0, tl.afterRollbackCount);
-        assertEquals(0, tl.closeCount);
-        assertEquals(0, TxEventTestUtil.getCreateEvents(tl.lastEvent.getEvents()).size());
-        assertEquals(0, TxEventTestUtil.getPutEvents(tl.lastEvent.getEvents()).size());
-        assertEquals(rgn.getCache(), tl.lastEvent.getCache());
+        assertThat(tl.afterFailedCommitCount).isEqualTo(0);
+        assertThat(tl.afterRollbackCount).isEqualTo(0);
+        assertThat(tl.closeCount).isEqualTo(0);
+        assertThat(TxEventTestUtil.getCreateEvents(tl.lastEvent.getEvents()).size()).isEqualTo(
+            (long) 0);
+        assertThat(TxEventTestUtil.getPutEvents(tl.lastEvent.getEvents()).size()).isEqualTo(
+            (long) 0);
+        assertThat(tl.lastEvent.getCache()).isEqualTo(rgn.getRegionService());
       }
     };
     vm0.invoke(checkExists);
@@ -7395,17 +7055,17 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
 
   @Ignore("TODO: test is disabled")
   @Test
-  public void testTXAlgebra() throws Exception {
-    assumeFalse(getRegionAttributes().getScope().isGlobal());
-    assumeFalse(getRegionAttributes().getDataPolicy().withPersistence());
+  public void testTXAlgebra() {
+    assumeThat(getRegionAttributes().getScope().isGlobal()).isFalse();
+    assumeThat(getRegionAttributes().getDataPolicy().withPersistence()).isFalse();
 
-    assertTrue(getRegionAttributes().getScope().isDistributed());
+    assertThat(getRegionAttributes().getScope().isDistributed()).isTrue();
 
     CacheTransactionManager txMgr = this.getCache().getCacheTransactionManager();
-    MyTransactionListener localTl = new MyTransactionListener();
+    MyTransactionListener<String, String> localTl = new MyTransactionListener<>();
     TransactionId myTXId;
-    txMgr.addListener(localTl);
-    assertEquals(null, localTl.lastEvent);
+    setTxListener(txMgr, localTl);
+    assertThat(localTl.lastEvent).isNull();
     localTl.assertCounts(0, 0, 0, 0);
     final String rgnName = getUniqueName();
 
@@ -7413,12 +7073,12 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       @Override
       public void run() {
         CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-        MyTransactionListener tl = new MyTransactionListener();
-        txMgr2.addListener(tl);
-        assertEquals(null, tl.lastEvent);
+        MyTransactionListener<String, Object> tl = new MyTransactionListener<>();
+        setTxListener(txMgr2, tl);
+        assertThat(tl.lastEvent).isNull();
         tl.assertCounts(0, 0, 0, 0);
         try {
-          Region rgn = createRegion(rgnName);
+          Region<String, Object> rgn = createRegion(rgnName);
           if (!getRegionAttributes().getDataPolicy().withReplication()) {
             rgn.create("key", null);
             getSystem().getLogWriter().info("testTXAlgebra: Created Key");
@@ -7429,88 +7089,83 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     };
 
-    Invoke.invokeInEveryVM(create);
+    invokeInEveryVM(create);
     // make sure each op sequence has the correct affect transaction event
     // check C + C -> EX
     // check C + P -> C
     try {
-      AttributesFactory rgnAtts = new AttributesFactory(getRegionAttributes());
+      AttributesFactory<String, String> rgnAtts = new AttributesFactory<>(getRegionAttributes());
       rgnAtts.setDataPolicy(DataPolicy.NORMAL);
-      Region rgn = createRegion(rgnName, rgnAtts.create());
-      //// callbackVal.reset();
+      Region<String, String> rgn = createRegion(rgnName, rgnAtts.create());
+
       txMgr.begin();
       myTXId = txMgr.getTransactionId();
       rgn.create("key", "value1");
-      //// callbackVal.assertCreateCnt(1);
-      try {
-        rgn.create("key", "value2");
-        fail("expected EntryExistsException");
-      } catch (EntryExistsException ok) {
-      }
-      //// callbackVal.assertCreateCnt(1, /*remember*/ false);
+      assertThatThrownBy(() -> rgn.create("key", "value2"))
+          .isInstanceOf(EntryExistsException.class);
+
       rgn.put("key", "value2");
-      //// callbackVal.assertUpdateCnt(1);
-      assertEquals("value2", rgn.getEntry("key").getValue());
+      assertThat(rgn.getEntry("key").getValue()).isEqualTo("value2");
       txMgr.commit();
+
       // Make sure commit did not trigger callbacks
-      //// callbackVal.reAssert();
-      Invoke.invokeInEveryVM(new CacheSerializableRunnable("testTXAlgebra: check: C+P->C") {
+      invokeInEveryVM(new CacheSerializableRunnable("testTXAlgebra: check: C+P->C") {
         @Override
         public void run2() {
-          Region rgn1 = getRootRegion().getSubregion(rgnName);
+          Region<String, String> rgn1 = getRootRegion().getSubregion(rgnName);
           CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-          MyTransactionListener tl = (MyTransactionListener) txMgr2.getListeners()[0];
+          MyTransactionListener<String, String> tl = firstTransactionListenerFrom(txMgr2);
 
-          assertEquals("value2", rgn1.getEntry("key").getValue());
+          assertThat(rgn1.getEntry("key").getValue()).isEqualTo("value2");
           tl.assertCounts(1, 0, 0, 0);
           {
-            Collection events;
+            Collection<EntryEvent<String, String>> events;
             RegionAttributes attr = getRegionAttributes();
             if (!attr.getDataPolicy().withReplication() || attr.getConcurrencyChecksEnabled()) {
               events = TxEventTestUtil.getPutEvents(tl.lastEvent.getEvents());
             } else {
               events = TxEventTestUtil.getCreateEvents(tl.lastEvent.getEvents());
             }
-            assertEquals(1, events.size());
-            EntryEvent ev = (EntryEvent) events.iterator().next();
-            // assertIndexDetailsEquals(tl.expectedTxId, ev.getTransactionId());
-            assertTrue(ev.getRegion() == rgn1);
-            assertEquals("key", ev.getKey());
-            assertEquals("value2", ev.getNewValue());
-            assertNull(ev.getOldValue());
-            assertTrue(!ev.getOperation().isLocalLoad());
-            assertTrue(!ev.getOperation().isNetLoad());
-            assertTrue(!ev.getOperation().isLoad());
-            assertTrue(!ev.getOperation().isNetSearch());
-            assertTrue(!ev.getOperation().isExpiration());
-            assertEquals(null, ev.getCallbackArgument());
-            assertEquals(true, ev.isCallbackArgumentAvailable());
-            assertTrue(ev.isOriginRemote());
-            assertTrue(ev.getOperation().isDistributed());
+            assertThat(events.size()).isEqualTo(1);
+            EntryEvent<String, String> ev = events.iterator().next();
+            assertThat(rgn1).isSameAs(ev.getRegion());
+            assertThat(ev.getKey()).isEqualTo("key");
+            assertThat(ev.getNewValue()).isEqualTo("value2");
+            assertThat(ev.getOldValue()).isNull();
+            assertThat(ev.getOperation().isLocalLoad()).isFalse();
+            assertThat(ev.getOperation().isNetLoad()).isFalse();
+            assertThat(ev.getOperation().isLoad()).isFalse();
+            assertThat(ev.getOperation().isNetSearch()).isFalse();
+            assertThat(ev.getOperation().isExpiration()).isFalse();
+            assertThat(ev.getCallbackArgument()).isNull();
+            assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+            assertThat(ev.isOriginRemote()).isTrue();
+            assertThat(ev.getOperation().isDistributed()).isTrue();
           }
         }
       });
-      assertEquals("value2", rgn.getEntry("key").getValue());
+      assertThat(rgn.getEntry("key").getValue()).isEqualTo("value2");
       {
         localTl.assertCounts(1, 0, 0, 0);
-        Collection events = TxEventTestUtil.getCreateEvents(localTl.lastEvent.getEvents());
-        assertEquals(myTXId, localTl.lastEvent.getTransactionId());
-        assertEquals(1, events.size());
-        EntryEvent ev = (EntryEvent) events.iterator().next();
-        assertEquals(myTXId, ev.getTransactionId());
-        assertTrue(ev.getRegion() == rgn);
-        assertEquals("key", ev.getKey());
-        assertEquals("value2", ev.getNewValue());
-        assertNull(ev.getOldValue());
-        assertTrue(!ev.getOperation().isLocalLoad());
-        assertTrue(!ev.getOperation().isNetLoad());
-        assertTrue(!ev.getOperation().isLoad());
-        assertTrue(!ev.getOperation().isNetSearch());
-        assertEquals(null, ev.getCallbackArgument());
-        assertEquals(true, ev.isCallbackArgumentAvailable());
-        assertTrue(!ev.isOriginRemote());
-        assertTrue(!ev.getOperation().isExpiration());
-        assertTrue(ev.getOperation().isDistributed());
+        Collection<EntryEvent<String, String>> events =
+            TxEventTestUtil.getCreateEvents(localTl.lastEvent.getEvents());
+        assertThat(localTl.lastEvent.getTransactionId()).isEqualTo(myTXId);
+        assertThat(events.size()).isEqualTo(1);
+        EntryEvent<String, String> ev = events.iterator().next();
+        assertThat(ev.getTransactionId()).isEqualTo(myTXId);
+        assertThat(rgn).isSameAs(ev.getRegion());
+        assertThat(ev.getKey()).isEqualTo("key");
+        assertThat(ev.getNewValue()).isEqualTo("value2");
+        assertThat(ev.getOldValue()).isNull();
+        assertThat(ev.getOperation().isLocalLoad()).isFalse();
+        assertThat(ev.getOperation().isNetLoad()).isFalse();
+        assertThat(ev.getOperation().isLoad()).isFalse();
+        assertThat(ev.getOperation().isNetSearch()).isFalse();
+        assertThat(ev.getCallbackArgument()).isNull();
+        assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+        assertThat(ev.isOriginRemote()).isFalse();
+        assertThat(ev.getOperation().isExpiration()).isFalse();
+        assertThat(ev.getOperation().isDistributed()).isTrue();
       }
       if (!getRegionAttributes().getDataPolicy().withReplication()) {
         rgn.invalidate("key");
@@ -7520,102 +7175,100 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
 
       // Check C + DI -> C (invalid value)
-      //// callbackVal.reset();
       txMgr.begin();
       myTXId = txMgr.getTransactionId();
       rgn.create("key", "value1");
-      //// callbackVal.assertCreateCnt(1);
+
       rgn.invalidate("key");
-      //// callbackVal.assertInvalidateCnt(1);
-      assertTrue(rgn.containsKey("key"));
-      assertTrue(!rgn.containsValueForKey("key"));
+
+      assertThat(rgn.containsKey("key")).isTrue();
+      assertThat(rgn.containsValueForKey("key")).isFalse();
       txMgr.commit();
-      //// callbackVal.reAssert();
-      Invoke.invokeInEveryVM(
+
+      invokeInEveryVM(
           new CacheSerializableRunnable("testTXAlgebra: check: C+DI->C (invalid value)") {
             @Override
             public void run2() {
-              Region rgn1 = getRootRegion().getSubregion(rgnName);
+              Region<String, Object> rgn1 = getRootRegion().getSubregion(rgnName);
               CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-              MyTransactionListener tl = (MyTransactionListener) txMgr2.getListeners()[0];
+              MyTransactionListener<String, Object> tl = firstTransactionListenerFrom(txMgr2);
 
-              assertTrue(rgn1.containsKey("key"));
-              assertTrue(!rgn1.containsValueForKey("key"));
+              assertThat(rgn1.containsKey("key")).isTrue();
+              assertThat(rgn1.containsValueForKey("key")).isFalse();
               tl.assertCounts(2, 0, 0, 0);
               {
-                Collection events;
+                Collection<EntryEvent<String, Object>> events;
                 RegionAttributes attr = getRegionAttributes();
                 if (!attr.getDataPolicy().withReplication() || attr.getConcurrencyChecksEnabled()) {
                   events = TxEventTestUtil.getPutEvents(tl.lastEvent.getEvents());
                 } else {
                   events = TxEventTestUtil.getCreateEvents(tl.lastEvent.getEvents());
                 }
-                assertEquals(1, events.size());
-                EntryEvent ev = (EntryEvent) events.iterator().next();
-                // assertIndexDetailsEquals(tl.expectedTxId, ev.getTransactionId());
-                assertTrue(ev.getRegion() == rgn1);
-                assertEquals("key", ev.getKey());
-                assertNull(ev.getNewValue());
-                assertNull(ev.getOldValue());
-                assertTrue(!ev.getOperation().isLocalLoad());
-                assertTrue(!ev.getOperation().isNetLoad());
-                assertTrue(!ev.getOperation().isLoad());
-                assertTrue(!ev.getOperation().isNetSearch());
-                assertTrue(!ev.getOperation().isExpiration());
-                assertEquals(null, ev.getCallbackArgument());
-                assertEquals(true, ev.isCallbackArgumentAvailable());
-                assertTrue(ev.isOriginRemote());
-                assertTrue(ev.getOperation().isDistributed());
+                assertThat(events.size()).isEqualTo(1);
+                EntryEvent<String, Object> ev = events.iterator().next();
+                assertThat(rgn1).isSameAs(ev.getRegion());
+                assertThat(ev.getKey()).isEqualTo("key");
+                assertThat(ev.getNewValue()).isNull();
+                assertThat(ev.getOldValue()).isNull();
+                assertThat(ev.getOperation().isLocalLoad()).isFalse();
+                assertThat(ev.getOperation().isNetLoad()).isFalse();
+                assertThat(ev.getOperation().isLoad()).isFalse();
+                assertThat(ev.getOperation().isNetSearch()).isFalse();
+                assertThat(ev.getOperation().isExpiration()).isFalse();
+                assertThat(ev.getCallbackArgument()).isNull();
+                assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+                assertThat(ev.isOriginRemote()).isTrue();
+                assertThat(ev.getOperation().isDistributed()).isTrue();
               }
             }
           });
-      assertTrue(rgn.containsKey("key"));
-      assertTrue(!rgn.containsValueForKey("key"));
+      assertThat(rgn.containsKey("key")).isTrue();
+      assertThat(rgn.containsValueForKey("key")).isFalse();
       localTl.assertCounts(2, 0, 0, 0);
       {
-        Collection events = TxEventTestUtil.getCreateEvents(localTl.lastEvent.getEvents());
-        assertEquals(myTXId, localTl.lastEvent.getTransactionId());
-        assertEquals(1, events.size());
-        EntryEvent ev = (EntryEvent) events.iterator().next();
-        assertEquals(myTXId, ev.getTransactionId());
-        assertTrue(ev.getRegion() == rgn);
-        assertEquals("key", ev.getKey());
-        assertNull(ev.getNewValue());
-        assertNull(ev.getOldValue());
-        assertTrue(!ev.getOperation().isLocalLoad());
-        assertTrue(!ev.getOperation().isNetLoad());
-        assertTrue(!ev.getOperation().isLoad());
-        assertTrue(!ev.getOperation().isNetSearch());
-        assertEquals(null, ev.getCallbackArgument());
-        assertEquals(true, ev.isCallbackArgumentAvailable());
-        assertTrue(!ev.isOriginRemote());
-        assertTrue(!ev.getOperation().isExpiration());
-        assertTrue(ev.getOperation().isDistributed());
+        Collection<EntryEvent<String, String>> events =
+            TxEventTestUtil.getCreateEvents(localTl.lastEvent.getEvents());
+        assertThat(localTl.lastEvent.getTransactionId()).isEqualTo(myTXId);
+        assertThat(events.size()).isEqualTo(1);
+        EntryEvent<String, String> ev = events.iterator().next();
+        assertThat(ev.getTransactionId()).isEqualTo(myTXId);
+        assertThat(rgn).isSameAs(ev.getRegion());
+        assertThat(ev.getKey()).isEqualTo("key");
+        assertThat(ev.getNewValue()).isNull();
+        assertThat(ev.getOldValue()).isNull();
+        assertThat(ev.getOperation().isLocalLoad()).isFalse();
+        assertThat(ev.getOperation().isNetLoad()).isFalse();
+        assertThat(ev.getOperation().isLoad()).isFalse();
+        assertThat(ev.getOperation().isNetSearch()).isFalse();
+        assertThat(ev.getCallbackArgument()).isNull();
+        assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+        assertThat(ev.isOriginRemote()).isFalse();
+        assertThat(ev.getOperation().isExpiration()).isFalse();
+        assertThat(ev.getOperation().isDistributed()).isTrue();
       }
 
       // check (commited) LI + DI -> NOOP
-      assertTrue(rgn.containsKey("key"));
-      assertTrue(!rgn.containsValueForKey("key"));
+      assertThat(rgn.containsKey("key")).isTrue();
+      assertThat(rgn.containsValueForKey("key")).isFalse();
       txMgr.begin();
-      myTXId = txMgr.getTransactionId();
       rgn.invalidate("key");
-      assertTrue(rgn.containsKey("key"));
-      assertTrue(!rgn.containsValueForKey("key"));
+      assertThat(rgn.containsKey("key")).isTrue();
+      assertThat(rgn.containsValueForKey("key")).isFalse();
       txMgr.commit();
-      Invoke.invokeInEveryVM(
+      invokeInEveryVM(
           new CacheSerializableRunnable("testTXAlgebra: check: committed LI + TX DI-> NOOP") {
             @Override
             public void run2() {
               Region rgn1 = getRootRegion().getSubregion(rgnName);
               CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-              MyTransactionListener tl = (MyTransactionListener) txMgr2.getListeners()[0];
+              MyTransactionListener<String, String> tl = firstTransactionListenerFrom(txMgr2);
 
-              assertEquals("value1", rgn1.getEntry("key").getValue());
+              assertThat(rgn1.getEntry("key").getValue()).isEqualTo("value1");
               tl.assertCounts(2, 0, 0, 0); // There should be no change in counts
             }
           });
-      assertTrue(rgn.containsKey("key"));
-      assertTrue(!rgn.containsValueForKey("key"));
+      assertThat(rgn.containsKey("key")).isTrue();
+      assertThat(rgn.containsValueForKey("key")).isFalse();
       localTl.assertCounts(2, 0, 0, 0); // There should be no change in counts
 
       // @todo mitch
@@ -7625,50 +7278,51 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       if (!getRegionAttributes().getDataPolicy().withReplication()) {
         // check (exists commited) LI + DI -> LI
         rgn.put("key", "value1");
-        assertTrue(rgn.containsKey("key"));
-        assertEquals("value1", rgn.getEntry("key").getValue());
+        assertThat(rgn.containsKey("key")).isTrue();
+        assertThat(rgn.getEntry("key").getValue()).isEqualTo("value1");
         txMgr.begin();
         myTXId = txMgr.getTransactionId();
         rgn.localInvalidate("key");
         rgn.invalidate("key");
-        assertTrue(rgn.containsKey("key"));
-        assertTrue(!rgn.containsValueForKey("key"));
+        assertThat(rgn.containsKey("key")).isTrue();
+        assertThat(rgn.containsValueForKey("key")).isFalse();
         txMgr.commit();
-        Invoke.invokeInEveryVM(
+        invokeInEveryVM(
             new CacheSerializableRunnable("testTXAlgebra: check: TX LI + TX DI -> LI") {
               @Override
               public void run2() {
                 Region rgn1 = getRootRegion().getSubregion(rgnName);
                 CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-                MyTransactionListener tl = (MyTransactionListener) txMgr2.getListeners()[0];
-                assertTrue(rgn1.containsKey("key"));
-                assertTrue(rgn1.containsValueForKey("key"));
-                assertEquals("value1", rgn1.getEntry("key").getValue());
+                MyTransactionListener<String, String> tl = firstTransactionListenerFrom(txMgr2);
+                assertThat(rgn1.containsKey("key")).isTrue();
+                assertThat(rgn1.containsValueForKey("key")).isTrue();
+                assertThat(rgn1.getEntry("key").getValue()).isEqualTo("value1");
                 tl.assertCounts(2, 0, 0, 0); // nothing happened remotely
               }
             });
-        assertTrue(rgn.containsKey("key"));
-        assertTrue(!rgn.containsValueForKey("key"));
-        assertNull(rgn.getEntry("key").getValue());
+        assertThat(rgn.containsKey("key")).isTrue();
+        assertThat(rgn.containsValueForKey("key")).isFalse();
+        assertThat(rgn.getEntry("key").getValue()).isNull();
         localTl.assertCounts(3, 0, 0, 0);
         {
-          Collection events = TxEventTestUtil.getInvalidateEvents(localTl.lastEvent.getEvents());
-          assertEquals(1, events.size());
-          EntryEvent ev = (EntryEvent) events.iterator().next();
-          assertEquals(myTXId, ev.getTransactionId());
-          assertTrue(ev.getRegion() == rgn);
-          assertEquals("key", ev.getKey());
-          assertNull(ev.getNewValue());
-          assertEquals("value1", ev.getOldValue());
-          assertTrue(!ev.getOperation().isLocalLoad());
-          assertTrue(!ev.getOperation().isNetLoad());
-          assertTrue(!ev.getOperation().isLoad());
-          assertTrue(!ev.getOperation().isNetSearch());
-          assertEquals(null, ev.getCallbackArgument());
-          assertEquals(true, ev.isCallbackArgumentAvailable());
-          assertTrue(!ev.isOriginRemote());
-          assertTrue(!ev.getOperation().isExpiration());
-          assertTrue(ev.getOperation().isDistributed());
+          Collection<EntryEvent<String, String>> events =
+              TxEventTestUtil.getInvalidateEvents(localTl.lastEvent.getEvents());
+          assertThat(events.size()).isEqualTo(1);
+          EntryEvent<String, String> ev = events.iterator().next();
+          assertThat(ev.getTransactionId()).isEqualTo(myTXId);
+          assertThat(rgn).isSameAs(ev.getRegion());
+          assertThat(ev.getKey()).isEqualTo("key");
+          assertThat(ev.getNewValue()).isNull();
+          assertThat(ev.getOldValue()).isEqualTo("value1");
+          assertThat(ev.getOperation().isLocalLoad()).isFalse();
+          assertThat(ev.getOperation().isNetLoad()).isFalse();
+          assertThat(ev.getOperation().isLoad()).isFalse();
+          assertThat(ev.getOperation().isNetSearch()).isFalse();
+          assertThat(ev.getCallbackArgument()).isNull();
+          assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+          assertThat(ev.isOriginRemote()).isFalse();
+          assertThat(ev.getOperation().isExpiration()).isFalse();
+          assertThat(ev.getOperation().isDistributed()).isTrue();
         }
 
         rgn.invalidate("key");
@@ -7680,134 +7334,126 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       // check C + DD -> DD
       //// callbackVal.reset();
       txMgr.begin();
-      myTXId = txMgr.getTransactionId();
       rgn.create("key", "value0");
-      //// callbackVal.assertCreateCnt(1);
       rgn.destroy("key");
-      //// callbackVal.assertDestroyCnt(1);
-      assertTrue(!rgn.containsKey("key"));
+      assertThat(rgn.containsKey("key")).isFalse();
       txMgr.commit();
-      //// callbackVal.reAssert();
-      Invoke.invokeInEveryVM(new CacheSerializableRunnable("testTXAlgebra: check: C+DD->DD") {
+      invokeInEveryVM(new CacheSerializableRunnable("testTXAlgebra: check: C+DD->DD") {
         @Override
         public void run2() {
-          Region rgn1 = getRootRegion().getSubregion(rgnName);
+          Region<String, Object> rgn1 = getRootRegion().getSubregion(rgnName);
           CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-          MyTransactionListener tl = (MyTransactionListener) txMgr2.getListeners()[0];
+          MyTransactionListener<String, Object> tl = firstTransactionListenerFrom(txMgr2);
 
-          assertTrue(!rgn1.containsKey("key"));
-          assertTrue(!rgn1.containsValueForKey("key"));
+          assertThat(rgn1.containsKey("key")).isFalse();
+          assertThat(rgn1.containsValueForKey("key")).isFalse();
           tl.assertCounts(3, 0, 0, 0);
           {
-            Collection events = TxEventTestUtil.getDestroyEvents(tl.lastEvent.getEvents());
-            assertEquals(1, events.size());
-            EntryEvent ev = (EntryEvent) events.iterator().next();
-            // assertIndexDetailsEquals(tl.expectedTxId, ev.getTransactionId());
-            assertTrue(ev.getRegion() == rgn1);
-            assertNull(ev.getKey());
-            assertNull(ev.getNewValue());
-            assertNull(ev.getOldValue());
-            assertTrue(!ev.getOperation().isLocalLoad());
-            assertTrue(!ev.getOperation().isNetLoad());
-            assertTrue(!ev.getOperation().isLoad());
-            assertTrue(!ev.getOperation().isNetSearch());
-            assertTrue(!ev.getOperation().isExpiration());
-            assertEquals(null, ev.getCallbackArgument());
-            assertEquals(true, ev.isCallbackArgumentAvailable());
-            assertTrue(ev.isOriginRemote());
-            assertTrue(ev.getOperation().isDistributed());
+            Collection<EntryEvent<String, Object>> events =
+                TxEventTestUtil.getDestroyEvents(tl.lastEvent.getEvents());
+            assertThat(events.size()).isEqualTo(1);
+            EntryEvent<String, Object> ev = events.iterator().next();
+            assertThat(rgn1).isSameAs(ev.getRegion());
+            assertThat(ev.getKey()).isNull();
+            assertThat(ev.getNewValue()).isNull();
+            assertThat(ev.getOldValue()).isNull();
+            assertThat(ev.getOperation().isLocalLoad()).isFalse();
+            assertThat(ev.getOperation().isNetLoad()).isFalse();
+            assertThat(ev.getOperation().isLoad()).isFalse();
+            assertThat(ev.getOperation().isNetSearch()).isFalse();
+            assertThat(ev.getOperation().isExpiration()).isFalse();
+            assertThat(ev.getCallbackArgument()).isNull();
+            assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+            assertThat(ev.isOriginRemote()).isTrue();
+            assertThat(ev.getOperation().isDistributed()).isTrue();
           }
         }
       });
-      assertTrue(!rgn.containsKey("key"));
+      assertThat(rgn.containsKey("key")).isFalse();
       localTl.assertCounts(3, 0, 0, 0); // no change
 
       // Check C + LI -> C
       if (!getRegionAttributes().getDataPolicy().withReplication()) {
         // assume that remote regions have same mirror type as local
-        Invoke
-            .invokeInEveryVM(new CacheSerializableRunnable("testTXAlgebra: C+LI-> entry creation") {
-              @Override
-              public void run2() {
-                Region rgn1 = getRootRegion().getSubregion(rgnName);
-                try {
-                  rgn1.create("key", null);
-                } catch (CacheException e) {
-                  fail("While creating key", e);
-                }
-              }
-            });
+        invokeInEveryVM(new CacheSerializableRunnable("testTXAlgebra: C+LI-> entry creation") {
+          @Override
+          public void run2() {
+            Region<String, ?> rgn1 = getRootRegion().getSubregion(rgnName);
+            try {
+              rgn1.create("key", null);
+            } catch (CacheException e) {
+              fail("While creating key", e);
+            }
+          }
+        });
       }
-      assertTrue(!rgn.containsKey("key"));
+      assertThat(rgn.containsKey("key")).isFalse();
       txMgr.begin();
       myTXId = txMgr.getTransactionId();
       rgn.create("key", "value1");
-      //// callbackVal.assertCreateCnt(1);
       rgn.localInvalidate("key");
-      //// callbackVal.assertInvalidateCnt(1);
-      assertTrue(rgn.containsKey("key"));
-      assertTrue(!rgn.containsValueForKey("key"));
+      assertThat(rgn.containsKey("key")).isTrue();
+      assertThat(rgn.containsValueForKey("key")).isFalse();
       txMgr.commit();
-      //// callbackVal.reAssert();
-      Invoke.invokeInEveryVM(
+      invokeInEveryVM(
           new CacheSerializableRunnable("testTXAlgebra: check: C+LI->C (with value)") {
             @Override
             public void run2() {
-              Region rgn1 = getRootRegion().getSubregion(rgnName);
+              Region<String, String> rgn1 = getRootRegion().getSubregion(rgnName);
               CacheTransactionManager txMgr2 = getCache().getCacheTransactionManager();
-              MyTransactionListener tl = (MyTransactionListener) txMgr2.getListeners()[0];
+              MyTransactionListener<String, String> tl = firstTransactionListenerFrom(txMgr2);
               tl.assertCounts(4, 0, 0, 0);
-              assertTrue(rgn1.containsKey("key"));
-              assertEquals("value1", rgn1.getEntry("key").getValue());
+              assertThat(rgn1.containsKey("key")).isTrue();
+              assertThat(rgn1.getEntry("key").getValue()).isEqualTo("value1");
               {
-                Collection events;
+                Collection<EntryEvent<String, String>> events;
                 RegionAttributes attr = getRegionAttributes();
                 if (!attr.getDataPolicy().withReplication() || attr.getConcurrencyChecksEnabled()) {
                   events = TxEventTestUtil.getPutEvents(tl.lastEvent.getEvents());
                 } else {
                   events = TxEventTestUtil.getCreateEvents(tl.lastEvent.getEvents());
                 }
-                assertEquals(1, events.size());
-                EntryEvent ev = (EntryEvent) events.iterator().next();
-                // assertIndexDetailsEquals(tl.expectedTxId, ev.getTransactionId());
-                assertTrue(ev.getRegion() == rgn1);
-                assertEquals("key", ev.getKey());
-                assertEquals("value1", ev.getNewValue());
-                assertNull(ev.getOldValue());
-                assertTrue(!ev.getOperation().isLocalLoad());
-                assertTrue(!ev.getOperation().isNetLoad());
-                assertTrue(!ev.getOperation().isLoad());
-                assertTrue(!ev.getOperation().isNetSearch());
-                assertTrue(!ev.getOperation().isExpiration());
-                assertEquals(null, ev.getCallbackArgument());
-                assertEquals(true, ev.isCallbackArgumentAvailable());
-                assertTrue(ev.isOriginRemote());
-                assertTrue(ev.getOperation().isDistributed());
+                assertThat(events.size()).isEqualTo(1);
+                EntryEvent<String, String> ev = events.iterator().next();
+                assertThat(rgn1).isSameAs(ev.getRegion());
+                assertThat(ev.getKey()).isEqualTo("key");
+                assertThat(ev.getNewValue()).isEqualTo("value1");
+                assertThat(ev.getOldValue()).isNull();
+                assertThat(ev.getOperation().isLocalLoad()).isFalse();
+                assertThat(ev.getOperation().isNetLoad()).isFalse();
+                assertThat(ev.getOperation().isLoad()).isFalse();
+                assertThat(ev.getOperation().isNetSearch()).isFalse();
+                assertThat(ev.getOperation().isExpiration()).isFalse();
+                assertThat(ev.getCallbackArgument()).isNull();
+                assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+                assertThat(ev.isOriginRemote()).isTrue();
+                assertThat(ev.getOperation().isDistributed()).isTrue();
               }
             }
           });
-      assertTrue(rgn.containsKey("key"));
-      assertTrue(!rgn.containsValueForKey("key"));
+      assertThat(rgn.containsKey("key")).isTrue();
+      assertThat(rgn.containsValueForKey("key")).isFalse();
       localTl.assertCounts(4, 0, 0, 0);
       {
-        Collection events = TxEventTestUtil.getCreateEvents(localTl.lastEvent.getEvents());
-        assertEquals(myTXId, localTl.lastEvent.getTransactionId());
-        assertEquals(1, events.size());
-        EntryEvent ev = (EntryEvent) events.iterator().next();
-        assertEquals(myTXId, ev.getTransactionId());
-        assertTrue(ev.getRegion() == rgn);
-        assertEquals("key", ev.getKey());
-        assertNull(ev.getNewValue());
-        assertNull(ev.getOldValue());
-        assertTrue(!ev.getOperation().isLocalLoad());
-        assertTrue(!ev.getOperation().isNetLoad());
-        assertTrue(!ev.getOperation().isLoad());
-        assertTrue(!ev.getOperation().isNetSearch());
-        assertEquals(null, ev.getCallbackArgument());
-        assertEquals(true, ev.isCallbackArgumentAvailable());
-        assertTrue(!ev.isOriginRemote());
-        assertTrue(!ev.getOperation().isExpiration());
-        assertTrue(ev.getOperation().isDistributed());
+        Collection<EntryEvent<String, String>> events =
+            TxEventTestUtil.getCreateEvents(localTl.lastEvent.getEvents());
+        assertThat(localTl.lastEvent.getTransactionId()).isEqualTo(myTXId);
+        assertThat(events.size()).isEqualTo(1);
+        EntryEvent<String, String> ev = events.iterator().next();
+        assertThat(ev.getTransactionId()).isEqualTo(myTXId);
+        assertThat(rgn).isSameAs(ev.getRegion());
+        assertThat(ev.getKey()).isEqualTo("key");
+        assertThat(ev.getNewValue()).isNull();
+        assertThat(ev.getOldValue()).isNull();
+        assertThat(ev.getOperation().isLocalLoad()).isFalse();
+        assertThat(ev.getOperation().isNetLoad()).isFalse();
+        assertThat(ev.getOperation().isLoad()).isFalse();
+        assertThat(ev.getOperation().isNetSearch()).isFalse();
+        assertThat(ev.getCallbackArgument()).isNull();
+        assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+        assertThat(ev.isOriginRemote()).isFalse();
+        assertThat(ev.getOperation().isExpiration()).isFalse();
+        assertThat(ev.getOperation().isDistributed()).isTrue();
       }
       rgn.destroy("key");
 
@@ -7817,48 +7463,41 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       txMgr.begin();
       myTXId = txMgr.getTransactionId();
       rgn.create("key", "value1");
-      //// callbackVal.assertCreateCnt(1);
       rgn.localInvalidate("key");
-      //// callbackVal.assertInvalidateCnt(1);
-      try {
-        rgn.create("key", "ex");
-        fail("expected EntryExistsException");
-      } catch (EntryExistsException ok) {
-      }
-      //// callbackVal.assertCreateCnt(1, /*remember*/ false);
+
+      assertThatThrownBy(() -> rgn.create("key", "ex")).isInstanceOf(EntryExistsException.class);
+
       rgn.put("key", "value2");
-      //// callbackVal.assertUpdateCnt(1);
-      assertTrue(rgn.containsKey("key"));
-      assertEquals("value2", rgn.getEntry("key").getValue());
+      assertThat(rgn.containsKey("key")).isTrue();
+      assertThat(rgn.getEntry("key").getValue()).isEqualTo("value2");
       txMgr.commit();
-      //// callbackVal.reAssert();
-      assertTrue(rgn.containsKey("key"));
-      assertEquals("value2", rgn.getEntry("key").getValue());
+
+      assertThat(rgn.containsKey("key")).isTrue();
+      assertThat(rgn.getEntry("key").getValue()).isEqualTo("value2");
       localTl.assertCounts(5, 0, 0, 0);
       {
-        Collection events = TxEventTestUtil.getCreateEvents(localTl.lastEvent.getEvents());
-        assertEquals(myTXId, localTl.lastEvent.getTransactionId());
-        assertEquals(1, events.size());
-        EntryEvent ev = (EntryEvent) events.iterator().next();
-        assertEquals(myTXId, ev.getTransactionId());
-        assertTrue(ev.getRegion() == rgn);
-        assertEquals("key", ev.getKey());
-        assertEquals("value2", ev.getNewValue());
-        assertNull(ev.getOldValue());
-        assertTrue(!ev.getOperation().isLocalLoad());
-        assertTrue(!ev.getOperation().isNetLoad());
-        assertTrue(!ev.getOperation().isLoad());
-        assertTrue(!ev.getOperation().isNetSearch());
-        assertEquals(null, ev.getCallbackArgument());
-        assertEquals(true, ev.isCallbackArgumentAvailable());
-        assertTrue(!ev.isOriginRemote());
-        assertTrue(!ev.getOperation().isExpiration());
-        assertTrue(ev.getOperation().isDistributed());
+        Collection<EntryEvent<String, String>> events =
+            TxEventTestUtil.getCreateEvents(localTl.lastEvent.getEvents());
+        assertThat(localTl.lastEvent.getTransactionId()).isEqualTo(myTXId);
+        assertThat(events.size()).isEqualTo(1);
+        EntryEvent<String, String> ev = events.iterator().next();
+        assertThat(ev.getTransactionId()).isEqualTo(myTXId);
+        assertThat(rgn).isSameAs(ev.getRegion());
+        assertThat(ev.getKey()).isEqualTo("key");
+        assertThat(ev.getNewValue()).isEqualTo("value2");
+        assertThat(ev.getOldValue()).isNull();
+        assertThat(ev.getOperation().isLocalLoad()).isFalse();
+        assertThat(ev.getOperation().isNetLoad()).isFalse();
+        assertThat(ev.getOperation().isLoad()).isFalse();
+        assertThat(ev.getOperation().isNetSearch()).isFalse();
+        assertThat(ev.getCallbackArgument()).isNull();
+        assertThat(ev.isCallbackArgumentAvailable()).isTrue();
+        assertThat(ev.isOriginRemote()).isFalse();
+        assertThat(ev.getOperation().isExpiration()).isFalse();
+        assertThat(ev.getOperation().isDistributed()).isTrue();
       }
       rgn.localDestroy("key");
 
-
-
     } catch (Exception e) {
       getCache().close();
       getSystem().getLogWriter().fine("testTXAlgebra: Caused exception in createRegion");
@@ -7871,18 +7510,13 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
   // M E T H O D S F O R V E R S I O N I N G F O L L O W
   //////////////////////////////////////////////////////////////////////////////////////
 
-
-  public static LocalRegion CCRegion;
-  static int distributedSystemID;
-  static int afterCreates;
-
-
   /**
    * return the region attributes for the given type of region. See
-   * GemFireCache.getRegionAttributes(String). Subclasses are expected to reimplement this method.
-   * See DistributedAckRegionCCEDUnitTest.getRegionAttributes(String).
+   * GemFireCache.getRegionAttributes(String).
+   * Subclasses are expected to reimplement this method. See
+   * DistributedAckRegionCCEDUnitTest.getRegionAttributes(String).
    */
-  protected RegionAttributes getRegionAttributes(String type) {
+  protected <K, V> RegionAttributes<K, V> getRegionAttributes(String type) {
     throw new IllegalStateException("subclass must reimplement this method");
   }
 
@@ -7892,11 +7526,9 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
    * same sort of check is performed for register-interest.
    */
 
-  public void versionTestGIISendsTombstones() throws Exception {
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
-    VM vm2 = host.getVM(2);
+  public void versionTestGIISendsTombstones() {
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
     final int serverPort = AvailablePortHelper.getRandomAvailableTCPPort();
 
     // create replicated regions in VM 0 and 1, then perform concurrent ops
@@ -7908,7 +7540,7 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       @Override
       public void run() {
         try {
-          RegionFactory f = getCache().createRegionFactory(getRegionAttributes());
+          RegionFactory<?, ?> f = getCache().createRegionFactory(getRegionAttributes());
           CCRegion = (LocalRegion) f.create(name);
           if (VM.getCurrentVMNum() == 0) {
             CacheServer bridge = CCRegion.getCache().addCacheServer();
@@ -7929,8 +7561,8 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       @Override
       public void run() {
         RegionEntry entry = CCRegion.getRegionEntry("object2");
-        assertTrue(entry != null);
-        assertTrue(entry.isTombstone());
+        assertThat(entry).isNotNull();
+        assertThat(entry.isTombstone()).isTrue();
       }
     };
 
@@ -7945,55 +7577,24 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
       }
     });
 
-    // SerializableRunnable createClientCache = new SerializableRunnable("Create client cache") {
-    // public void run() {
-    // ClientCacheFactory ccf = new ClientCacheFactory();
-    // ccf.addPoolServer("localhost"/*getServerHostName(Host.getHost(0))*/, serverPort);
-    // ccf.setPoolSubscriptionEnabled(true);
-    // ccf.set("log-level", getGemFireLogLevel());
-    // ClientCache cCache = getClientCache(ccf);
-    // ClientRegionFactory<Integer, String> crf = cCache
-    // .createClientRegionFactory(ClientRegionShortcut.CACHING_PROXY);
-    // crf.setConcurrencyChecksEnabled(true);
-    // CCRegion = (LocalRegion)crf.create(name);
-    // CCRegion.registerInterest("ALL_KEYS");
-    // }
-    // };
-
     try {
       vm0.invoke(asserter);
       vm1.invoke(createRegion);
       vm1.invoke(asserter);
-      // vm2.invoke(createClientCache);
-      // vm2.invoke(asserter);
+
     } finally {
       disconnectAllFromDS();
     }
   }
 
-
-  protected void disconnect(VM vm) {
-    SerializableRunnable disconnect = new SerializableRunnable("disconnect") {
-      @Override
-      public void run() {
-        // GatewayBatchOp.VERSION_WITH_OLD_WAN = false;
-        distributedSystemID = -1;
-        CCRegion.getCache().getDistributedSystem().disconnect();
-      }
-    };
-    vm.invoke(disconnect);
-  }
-
-
   /**
    * This tests the concurrency versioning system to ensure that event conflation happens correctly
    * and that the statistic is being updated properly
    */
   public void versionTestConcurrentEvents() throws Exception {
-    Host host = Host.getHost(0);
-    VM vm0 = host.getVM(0);
-    VM vm1 = host.getVM(1);
-    VM vm2 = host.getVM(2);
+    VM vm0 = VM.getVM(0);
+    VM vm1 = VM.getVM(1);
+    VM vm2 = VM.getVM(2);
 
     // create replicated regions in VM 0 and 1, then perform concurrent ops
     // on the same key while creating the region in VM2. Afterward make
@@ -8015,7 +7616,6 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     vm0.invoke(createRegion);
     vm1.invoke(createRegion);
 
-
     SerializableRunnable performOps = new SerializableRunnable("perform concurrent ops") {
       @Override
       public void run() {
@@ -8023,14 +7623,11 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
           doOpsLoop(5000, false);
           long events = CCRegion.getCachePerfStats().getConflatedEventsCount();
           if (!CCRegion.getScope().isGlobal()) {
-            assertTrue("expected some event conflation", events > 0);
+            assertThat(events > 0).describedAs("expected some event conflation").isTrue();
           }
         } catch (CacheException e) {
           fail("while performing concurrent operations", e);
         }
-        // } catch (InterruptedException e) {
-        // fail("someone interrupted my sleep");
-        // }
       }
     };
 
@@ -8053,34 +7650,35 @@ public abstract class MultiVMRegionTestCase extends RegionTestCase {
     }
 
     // check consistency of the regions
-    Map r0Contents = (Map) vm0.invoke(() -> this.getCCRegionContents());
-    Map r1Contents = (Map) vm1.invoke(() -> this.getCCRegionContents());
-    Map r2Contents = (Map) vm2.invoke(() -> this.getCCRegionContents());
+    Map r0Contents = vm0.invoke(MultiVMRegionTestCase::getCCRegionContents);
+    Map r1Contents = vm1.invoke(MultiVMRegionTestCase::getCCRegionContents);
+    Map r2Contents = vm2.invoke(MultiVMRegionTestCase::getCCRegionContents);
 
     for (int i = 0; i < 10; i++) {
       String key = "cckey" + i;
-      assertEquals("region contents are not consistent for " + key, r0Contents.get(key),
... 1811 lines suppressed ...