Adds peer to peer benchmarks. (#135)

* Adds P2P put test benchmark.
* Adds P2P get test benchmark.
* Adds put bytes benchmark.
* Adds SSL parameters to benchmarks.
* Fixes API access for old releases.
diff --git a/.asf.yaml b/.asf.yaml
index 003d459..6769616 100644
--- a/.asf.yaml
+++ b/.asf.yaml
@@ -1,5 +1,11 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
 #
-# http://www.apache.org/licenses/LICENSE-2.0
+#      http://www.apache.org/licenses/LICENSE-2.0
 #
 # Unless required by applicable law or agreed to in writing, software
 # distributed under the License is distributed on an "AS IS" BASIS,
diff --git a/.gitignore b/.gitignore
index 7ab8bfd..096ed77 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,4 @@
 temp-self-signed.jks
 geode-benchmarks/security.json
 harness/security.json
+failedTests
diff --git a/.travis.yml b/.travis.yml
index 6fe694f..9e96e65 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,3 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 language: java
 
 jdk:
diff --git a/README.md b/README.md
index 77d9d55..721d05e 100644
--- a/README.md
+++ b/README.md
@@ -52,6 +52,8 @@
     -PoutputDir           : Results output directory (-PoutputDir=/tmp/results)
     -PtestJVM             : Path to an alternative JVM for running the client, locator, and servers. If not specified JAVA_HOME will be used. Note all compilation tasks will still use JAVA_HOME.
     -PwithSsl             : Flag to run geode with SSL. A self-signed certificate will be generated at runtime.
+    -PwithSslProtocols    : Specifies enabled SSL protocols. See Geode property `ssl-protocols`
+    -PwithSslCiphers      : Specifies enabled SSL chipher suites. See Geode property `ssl-ciphers`
     -PwithSecurityManager : Flag to start Geode with the example implementation of SecurityManager
     -PwithGc              : Select which GC to use. Valid values CMS (default), G1, Z.
     -PwithHeap            : Specify how large a heap the benchmark VMs should use, default "8g". Accepts any `-Xmx` value, like "32g".
diff --git a/build.gradle b/build.gradle
index bfa96ce..f17d9e9 100644
--- a/build.gradle
+++ b/build.gradle
@@ -14,21 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-buildscript {
-  repositories { gradlePluginPortal() }
-  dependencies {
-    classpath 'com.bmuschko:gradle-docker-plugin:4.0.4'
-    classpath "com.diffplug.spotless:spotless-plugin-gradle:3.16.0"
-    classpath "io.spring.gradle:dependency-management-plugin:1.0.3.RELEASE"
-  }
+
+plugins {
+  id "io.spring.dependency-management" version "1.0.10.RELEASE"
+  id "com.bmuschko.docker-remote-api" version "6.6.1"
+  id "com.diffplug.spotless" version "5.6.1"
+  id "org.nosphere.apache.rat" version "0.7.0"
 }
 
-
-plugins { id "org.nosphere.apache.rat" version "0.5.2" }
-
 apply plugin: 'com.bmuschko.docker-remote-api'
 
-
 // Import task types
 import com.bmuschko.gradle.docker.tasks.image.DockerBuildImage
 // Load all properties in dependency-version.properties as project properties, so all projects can read them
@@ -40,7 +35,7 @@
 task buildTestingImage(type: DockerBuildImage) {
   inputDir = file(project.rootDir)
   dockerFile = file('images/geode-performance/Dockerfile')
-  tag = 'geode-performance-testing:latest'
+  images.add('geode-performance-testing:latest')
 }
 
 apply from: "gradle/spotless.gradle"
diff --git a/cryptoinfo/build.gradle b/cryptoinfo/build.gradle
new file mode 100644
index 0000000..58af056
--- /dev/null
+++ b/cryptoinfo/build.gradle
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+plugins { id 'application' }
+
+application { mainClassName = 'org.apache.geode.benchmarks.cryptoinfo.Main' }
+
+compileJava {
+  options.compilerArgs << '-Xlint:unchecked' << "-Werror"
+  options.deprecation = true
+}
diff --git a/cryptoinfo/src/main/java/org/apache/geode/benchmarks/cryptoinfo/Main.java b/cryptoinfo/src/main/java/org/apache/geode/benchmarks/cryptoinfo/Main.java
new file mode 100644
index 0000000..c63ae14
--- /dev/null
+++ b/cryptoinfo/src/main/java/org/apache/geode/benchmarks/cryptoinfo/Main.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.geode.benchmarks.cryptoinfo;
+
+import java.io.PrintStream;
+import java.security.NoSuchAlgorithmException;
+import java.security.Provider;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLParameters;
+
+public class Main {
+  public static void main(String[] args) throws NoSuchAlgorithmException {
+    SSLContext context = SSLContext.getDefault();
+    final PrintStream out = System.out;
+    out.println("Provider: ");
+    printProvider(out, context.getProvider());
+    out.println("SSL Parameters: ");
+    printSSLParameters(out, context.getSupportedSSLParameters());
+  }
+
+  private static void printSSLParameters(final PrintStream out, final SSLParameters sslParameters) {
+    out.println("Protocols:");
+    printStrings(out, sslParameters.getProtocols());
+    out.println("Cipher Suites:");
+    printStrings(out, sslParameters.getCipherSuites());
+  }
+
+  private static void printStrings(PrintStream out, String[] strings) {
+    for (String string : strings) {
+      out.println(string);
+    }
+  }
+
+  private static void printProvider(final PrintStream out, final Provider provider) {
+    out.print("Name: ");
+    out.println(provider.getName());
+    out.print("Info: ");
+    out.println(provider.getInfo());
+    out.print("Version: ");
+    out.println(provider.getVersion());
+  }
+
+}
diff --git a/etc/greclipse.properties b/etc/greclipse.properties
index 7169303..91de269 100644
--- a/etc/greclipse.properties
+++ b/etc/greclipse.properties
@@ -1,3 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 #Whether to use 'space', 'tab' or 'mixed' (both) characters for indentation.
 #The default value is 'tab'.
 org.eclipse.jdt.core.formatter.tabulation.char=space
diff --git a/geode-benchmarks/build.gradle b/geode-benchmarks/build.gradle
index c9c08d0..c1cb54d 100644
--- a/geode-benchmarks/build.gradle
+++ b/geode-benchmarks/build.gradle
@@ -15,6 +15,8 @@
  * limitations under the License.
  */
 
+import org.gradle.util.VersionNumber
+
 plugins { id 'java' }
 
 group 'org.apache.geode-benchmark'
@@ -47,7 +49,11 @@
   implementation(project(':harness'))
 
   implementation(group: 'org.apache.geode', name: 'geode-core', version: geodeVersion)
-  runtime(group: 'org.apache.geode', name: 'geode-log4j', version: geodeVersion)
+  if (VersionNumber.parse(geodeVersion) >= VersionNumber.parse("1.11.0")) {
+    runtime(group: 'org.apache.geode', name: 'geode-log4j', version: geodeVersion)
+  } else {
+    runtime(group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.13.3')
+  }
 
   // Required for missing dependency on geode-core.
   runtime(group: 'org.eclipse.jetty', name: 'jetty-webapp', version: '9.4.12.v20180830')
@@ -56,6 +62,11 @@
   testImplementation(group: 'org.assertj', name: 'assertj-core', version: project.'assertj-core.version')
 }
 
+compileJava {
+  options.compilerArgs << '-Xlint:unchecked' << "-Werror"
+  options.deprecation = true
+}
+
 test{ useJUnitPlatform() }
 
 task benchmark(type: Test) {
@@ -69,9 +80,9 @@
   testLogging { exceptionFormat = 'full' }
 
   exclude "**/NoopBenchmark.class"
-  exclude "**/*LongBenchmark.class"
 
   forkEvery 1
+  failFast = true
 
   systemProperty 'TEST_HOSTS', project.findProperty('hosts')
   systemProperty 'TEST_METADATA', project.findProperty('metadata')
@@ -92,6 +103,8 @@
     systemProperty 'withDuration', project.findProperty('withDuration')
   }
   systemProperty 'withSsl', project.hasProperty('withSsl')
+  systemProperty 'withSslProtocols', project.findProperty('withSslProtocols')
+  systemProperty 'withSslCiphers', project.findProperty('withSslCiphers')
   systemProperty 'withSniProxy', project.hasProperty('withSniProxy')
   systemProperty 'withSecurityManager', project.hasProperty('withSecurityManager')
   systemProperty 'benchmark.profiler.argument', project.findProperty('benchmark.profiler.argument')
diff --git a/geode-benchmarks/src/main/java/benchmark/geode/data/FunctionWithArguments.java b/geode-benchmarks/src/main/java/benchmark/geode/data/FunctionWithArguments.java
index 8a10f1d..1e9eb24 100644
--- a/geode-benchmarks/src/main/java/benchmark/geode/data/FunctionWithArguments.java
+++ b/geode-benchmarks/src/main/java/benchmark/geode/data/FunctionWithArguments.java
@@ -20,14 +20,14 @@
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.cache.execute.RegionFunctionContext;
 
-public class FunctionWithArguments implements Function {
+public class FunctionWithArguments implements Function<Long> {
 
   public FunctionWithArguments() {}
 
   @Override
-  public void execute(final FunctionContext context) {
+  public void execute(final FunctionContext<Long> context) {
     final RegionFunctionContext regionFunctionContext = (RegionFunctionContext) context;
-    final Region region = regionFunctionContext.getDataSet();
+    final Region<?, ?> region = regionFunctionContext.getDataSet();
     final Long key = (Long) regionFunctionContext.getArguments();
     context.getResultSender().lastResult(region.get(key));
   }
diff --git a/geode-benchmarks/src/main/java/benchmark/geode/data/FunctionWithFilter.java b/geode-benchmarks/src/main/java/benchmark/geode/data/FunctionWithFilter.java
index ccc3888..53fe8bb 100644
--- a/geode-benchmarks/src/main/java/benchmark/geode/data/FunctionWithFilter.java
+++ b/geode-benchmarks/src/main/java/benchmark/geode/data/FunctionWithFilter.java
@@ -21,12 +21,12 @@
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.cache.execute.RegionFunctionContext;
 
-public class FunctionWithFilter implements Function {
+public class FunctionWithFilter implements Function<Long> {
 
   public FunctionWithFilter() {}
 
   @Override
-  public void execute(final FunctionContext context) {
+  public void execute(final FunctionContext<Long> context) {
     final RegionFunctionContext regionFunctionContext = (RegionFunctionContext) context;
     final Region<Long, Portfolio> region = regionFunctionContext.getDataSet();
     @SuppressWarnings("unchecked")
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/parameters/GeodeProperties.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/parameters/GeodeProperties.java
index 431f117..deb575d 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/parameters/GeodeProperties.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/parameters/GeodeProperties.java
@@ -14,6 +14,10 @@
  */
 package org.apache.geode.benchmark.parameters;
 
+import static org.apache.geode.benchmark.topology.Topology.WITH_SECURITY_MANAGER_PROPERTY;
+import static org.apache.geode.benchmark.topology.Topology.WITH_SSL_CIPHERS_PROPERTY;
+import static org.apache.geode.benchmark.topology.Topology.WITH_SSL_PROPERTY;
+import static org.apache.geode.benchmark.topology.Topology.WITH_SSL_PROTOCOLS_PROPERTY;
 import static org.apache.geode.distributed.ConfigurationProperties.ARCHIVE_DISK_SPACE_LIMIT;
 import static org.apache.geode.distributed.ConfigurationProperties.ARCHIVE_FILE_SIZE_LIMIT;
 import static org.apache.geode.distributed.ConfigurationProperties.CONSERVE_SOCKETS;
@@ -28,7 +32,9 @@
 import static org.apache.geode.distributed.ConfigurationProperties.REMOVE_UNRESPONSIVE_CLIENT;
 import static org.apache.geode.distributed.ConfigurationProperties.SECURITY_MANAGER;
 import static org.apache.geode.distributed.ConfigurationProperties.SERIALIZABLE_OBJECT_FILTER;
+import static org.apache.geode.distributed.ConfigurationProperties.SSL_CIPHERS;
 import static org.apache.geode.distributed.ConfigurationProperties.SSL_ENABLED_COMPONENTS;
+import static org.apache.geode.distributed.ConfigurationProperties.SSL_PROTOCOLS;
 import static org.apache.geode.distributed.ConfigurationProperties.STATISTIC_SAMPLING_ENABLED;
 import static org.apache.geode.distributed.ConfigurationProperties.USE_CLUSTER_CONFIGURATION;
 import static org.apache.geode.security.SecurableCommunicationChannels.ALL;
@@ -90,15 +96,27 @@
 
   public static Properties withSsl(Properties properties) {
     properties.setProperty(SSL_ENABLED_COMPONENTS, ALL);
+    final String withSslProtocols = System.getProperty(WITH_SSL_PROTOCOLS_PROPERTY);
+    if (!isBlank(withSslProtocols)) {
+      properties.setProperty(SSL_PROTOCOLS, withSslProtocols);
+    }
+    final String withSslCiphers = System.getProperty(WITH_SSL_CIPHERS_PROPERTY);
+    if (!isBlank(withSslCiphers)) {
+      properties.setProperty(SSL_CIPHERS, withSslCiphers);
+    }
     return properties;
   }
 
+  private static boolean isBlank(final String value) {
+    return null == value || value.trim().isEmpty();
+  }
+
   private static boolean isSecurityManagerEnabled() {
-    return isPropertySet("withSecurityManager");
+    return isPropertySet(WITH_SECURITY_MANAGER_PROPERTY);
   }
 
   private static boolean isSslEnabled() {
-    return isPropertySet("withSsl");
+    return isPropertySet(WITH_SSL_PROPERTY);
   }
 
   private static boolean isPropertySet(final String propertyName) {
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/parameters/Utils.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/parameters/Utils.java
index 3475893..07fb16c 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/parameters/Utils.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/parameters/Utils.java
@@ -46,4 +46,14 @@
       configureGeodeProductJvms(testConfig, jvmArgument);
     }
   }
+
+  public static void addToTestConfig(TestConfig testConfig, String systemPropertyKey) {
+    if (System.getProperties().containsKey(systemPropertyKey)) {
+      final String value = System.getProperty(systemPropertyKey);
+      final String jvmArgument = "-D" + systemPropertyKey + "=" + value + "";
+      logger.info("Configuring JVMs to run with " + jvmArgument);
+      configureGeodeProductJvms(testConfig, jvmArgument);
+    }
+  }
+
 }
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/security/ExampleAuthInit.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/security/ExampleAuthInit.java
index 42050df..4eea6a9 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/security/ExampleAuthInit.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/security/ExampleAuthInit.java
@@ -19,11 +19,11 @@
 
 import java.util.Properties;
 
-import org.apache.geode.LogWriter;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.security.AuthInitialize;
 import org.apache.geode.security.AuthenticationFailedException;
 
+@SuppressWarnings("deprecation")
 public class ExampleAuthInit implements AuthInitialize {
 
   private static final String USER_NAME = "security-username";
@@ -53,12 +53,11 @@
   public void close() {}
 
   @Override
-  @Deprecated
-  public void init(LogWriter systemLogger, LogWriter securityLogger)
+  public void init(org.apache.geode.LogWriter systemLogger,
+      org.apache.geode.LogWriter securityLogger)
       throws AuthenticationFailedException {}
 
   @Override
-  @Deprecated
   public Properties getCredentials(Properties securityProps, DistributedMember server,
       boolean isPeer) throws AuthenticationFailedException {
     return getCredentials(securityProps);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/AbstractPrePopulateRegion.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/AbstractPrePopulateRegion.java
new file mode 100644
index 0000000..f88da40
--- /dev/null
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/AbstractPrePopulateRegion.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.geode.benchmark.tasks;
+
+import static org.apache.geode.benchmark.topology.Roles.CLIENT;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.geode.benchmark.LongRange;
+import org.apache.geode.benchmark.topology.Roles;
+import org.apache.geode.cache.Cache;
+import org.apache.geode.cache.CacheFactory;
+import org.apache.geode.cache.Region;
+import org.apache.geode.perftest.Task;
+import org.apache.geode.perftest.TestContext;
+
+
+public abstract class AbstractPrePopulateRegion<V> implements Task {
+  private static final Logger logger = LoggerFactory.getLogger(AbstractPrePopulateRegion.class);
+
+  private final LongRange keyRangeToPrepopulate;
+  private final Roles targetRole;
+
+  private int batchSize = 1000;
+
+  public AbstractPrePopulateRegion() {
+    this(new LongRange(0, 10000), CLIENT);
+  }
+
+  public AbstractPrePopulateRegion(LongRange keyRangeToPrepopulate) {
+    this(keyRangeToPrepopulate, CLIENT);
+  }
+
+  public AbstractPrePopulateRegion(final LongRange keyRangeToPrepopulate, final Roles targetRole) {
+    this.keyRangeToPrepopulate = keyRangeToPrepopulate;
+    this.targetRole = targetRole;
+  }
+
+  /**
+   * This method prepopulates the region before the actual benchmark starts.
+   */
+  @Override
+  public void run(TestContext context) throws InterruptedException {
+    final Cache cache = CacheFactory.getAnyInstance();
+    final Region<Long, V> region = cache.getRegion("region");
+    final ArrayList<Integer> hostIds =
+        new ArrayList<>(context.getHostsIDsForRole(targetRole.name()));
+
+    run(region,
+        keyRangeToPrepopulate.sliceFor(hostIds.size(), hostIds.indexOf(context.getJvmID())));
+  }
+
+  void run(final Map<Long, V> region, final LongRange range) throws InterruptedException {
+    logger.info("*******************************************");
+    logger.info("      Prepopulating the region ");
+    logger.info("*******************************************");
+    final Instant start = Instant.now();
+
+    final int numThreads = Runtime.getRuntime().availableProcessors();
+    final ExecutorService threadPool = Executors.newFixedThreadPool(numThreads);
+    final List<CompletableFuture<Void>> futures = new ArrayList<>();
+
+    for (final LongRange slice : range.slice(numThreads)) {
+      futures.add(CompletableFuture.runAsync(() -> doPuts(region, slice), threadPool));
+    }
+
+    futures.forEach(CompletableFuture::join);
+
+    final Instant finish = Instant.now();
+    logger.info("*******************************************");
+    logger.info("    Prepopulating the region completed");
+    logger.info("    Duration = " + Duration.between(start, finish).toMillis() + "ms.");
+    logger.info("*******************************************");
+
+    threadPool.shutdownNow();
+    threadPool.awaitTermination(5, TimeUnit.MINUTES);
+  }
+
+  private void doPuts(final Map<Long, V> region, final LongRange range) {
+    for (final LongRange slice : range.slicesOfSize(batchSize)) {
+      final Map<Long, V> valueMap = new HashMap<>();
+      slice.forEach(i -> valueMap.put(i, getValue(i)));
+      region.putAll(valueMap);
+    }
+  }
+
+  protected abstract V getValue(long i);
+
+  public int getBatchSize() {
+    return batchSize;
+  }
+
+  public void setBatchSize(int batchSize) {
+    this.batchSize = batchSize;
+  }
+}
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/DefineHostNamingsOffPlatformTask.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/DefineHostNamingsOffPlatformTask.java
index 824c9c1..f17cf9e 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/DefineHostNamingsOffPlatformTask.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/DefineHostNamingsOffPlatformTask.java
@@ -38,6 +38,7 @@
 
   public static String getOffPlatformHostName(final TestContext context,
       final InetAddress addy) throws UnknownHostException {
+    @SuppressWarnings("unchecked")
     final Map<InetAddress, String> namings =
         (Map<InetAddress, String>) context.getAttribute(HOST_NAMINGS_OFF_PLATFORM);
     return namings.get(addy);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteFilteredFunction.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteFilteredFunction.java
index 746682f..610548d 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteFilteredFunction.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteFilteredFunction.java
@@ -54,7 +54,8 @@
   @Override
   public boolean test(Map<Object, Object> ctx) {
     final Set<Long> filterSet = Collections.singleton(keyRange.random());
-    final ResultCollector resultCollector = FunctionService
+    @SuppressWarnings("unchecked")
+    final ResultCollector<?, ?> resultCollector = FunctionService
         .onRegion(region)
         .withFilter(filterSet)
         .execute(function);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteParameterizedFunction.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteParameterizedFunction.java
index e2353f1..6065b18 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteParameterizedFunction.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/ExecuteParameterizedFunction.java
@@ -51,12 +51,12 @@
 
   @Override
   public boolean test(Map<Object, Object> ctx) {
-    ResultCollector resultCollector = FunctionService
+    @SuppressWarnings("unchecked")
+    ResultCollector<?, ?> resultCollector = FunctionService
         .onRegion(region)
         .setArguments(keyRange.random())
         .execute(function);
     resultCollector.getResult();
     return true;
-
   }
 }
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/GetTask.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/GetTask.java
index ec55f40..f6d701d 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/GetTask.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/GetTask.java
@@ -24,9 +24,9 @@
 import org.yardstickframework.BenchmarkDriverAdapter;
 
 import org.apache.geode.benchmark.LongRange;
+import org.apache.geode.cache.Cache;
+import org.apache.geode.cache.CacheFactory;
 import org.apache.geode.cache.Region;
-import org.apache.geode.cache.client.ClientCache;
-import org.apache.geode.cache.client.ClientCacheFactory;
 
 /**
  * Task workload to perform get operations on keys within 0
@@ -46,7 +46,7 @@
   public void setUp(BenchmarkConfiguration cfg) throws Exception {
     super.setUp(cfg);
 
-    final ClientCache cache = ClientCacheFactory.getAnyInstance();
+    final Cache cache = CacheFactory.getAnyInstance();
     region = cache.getRegion("region");
   }
 
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PrePopulateRegion.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PrePopulateRegion.java
index faae4d7..2b633ef 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PrePopulateRegion.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PrePopulateRegion.java
@@ -14,102 +14,30 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package org.apache.geode.benchmark.tasks;
 
-import static org.apache.geode.benchmark.topology.Roles.CLIENT;
-import static org.apache.geode.benchmark.topology.Roles.LOCATOR;
-import static org.apache.geode.benchmark.topology.Roles.SERVER;
-
-import java.time.Duration;
-import java.time.Instant;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
 import benchmark.geode.data.Portfolio;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import org.apache.geode.benchmark.LongRange;
-import org.apache.geode.cache.Region;
-import org.apache.geode.cache.client.ClientCache;
-import org.apache.geode.cache.client.ClientCacheFactory;
-import org.apache.geode.perftest.Task;
-import org.apache.geode.perftest.TestContext;
+import org.apache.geode.benchmark.topology.Roles;
 
-
-public class PrePopulateRegion implements Task {
-  private static final Logger logger = LoggerFactory.getLogger(PrePopulateRegion.class);
-
-  private LongRange keyRangeToPrepopulate = new LongRange(0, 10000);
-  private int batchSize = 1000;
+public class PrePopulateRegion extends AbstractPrePopulateRegion<Portfolio> {
 
   public PrePopulateRegion() {}
 
   public PrePopulateRegion(LongRange keyRangeToPrepopulate) {
-    this.keyRangeToPrepopulate = keyRangeToPrepopulate;
+    super(keyRangeToPrepopulate);
   }
 
-  /**
-   * This method prepopulates the region before the actual benchmark starts.
-   */
+  public PrePopulateRegion(LongRange keyRangeToPrepopulate,
+      Roles targetRole) {
+    super(keyRangeToPrepopulate, targetRole);
+  }
+
   @Override
-  public void run(TestContext context) throws InterruptedException {
-    final ClientCache cache = ClientCacheFactory.getAnyInstance();
-    final Region<Long, Portfolio> region = cache.getRegion("region");
-    final int numLocators = context.getHostsIDsForRole(LOCATOR.name()).size();
-    final int numServers = context.getHostsIDsForRole(SERVER.name()).size();
-    final int numClient = context.getHostsIDsForRole(CLIENT.name()).size();
-    final int jvmID = context.getJvmID();
-    final int clientIndex = jvmID - numLocators - numServers;
-
-    run(region, keyRangeToPrepopulate.sliceFor(numClient, clientIndex));
+  protected Portfolio getValue(long i) {
+    return new Portfolio(i);
   }
 
-  void run(final Map<Long, Portfolio> region, final LongRange range) throws InterruptedException {
-    logger.info("*******************************************");
-    logger.info("      Prepopulating the region ");
-    logger.info("*******************************************");
-    final Instant start = Instant.now();
-
-    final int numThreads = Runtime.getRuntime().availableProcessors();
-    final ExecutorService threadPool = Executors.newFixedThreadPool(numThreads);
-    final List<CompletableFuture<Void>> futures = new ArrayList<>();
-
-    for (final LongRange slice : range.slice(numThreads)) {
-      futures.add(CompletableFuture.runAsync(() -> doPuts(region, slice), threadPool));
-    }
-
-    futures.forEach(CompletableFuture::join);
-
-    final Instant finish = Instant.now();
-    logger.info("*******************************************");
-    logger.info("    Prepopulating the region completed");
-    logger.info("    Duration = " + Duration.between(start, finish).toMillis() + "ms.");
-    logger.info("*******************************************");
-
-    threadPool.shutdownNow();
-    threadPool.awaitTermination(5, TimeUnit.MINUTES);
-  }
-
-  private void doPuts(final Map<Long, Portfolio> region, final LongRange range) {
-    for (final LongRange slice : range.slicesOfSize(batchSize)) {
-      final Map<Long, Portfolio> valueMap = new HashMap<>();
-      slice.forEach(i -> valueMap.put(i, new Portfolio(i)));
-      region.putAll(valueMap);
-    }
-  }
-
-  public int getBatchSize() {
-    return batchSize;
-  }
-
-  public void setBatchSize(int batchSize) {
-    this.batchSize = batchSize;
-  }
 }
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PrePopulateRegionBytes.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PrePopulateRegionBytes.java
new file mode 100644
index 0000000..73ae3a3
--- /dev/null
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PrePopulateRegionBytes.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geode.benchmark.tasks;
+
+import org.apache.geode.benchmark.LongRange;
+import org.apache.geode.benchmark.topology.Roles;
+
+public class PrePopulateRegionBytes extends AbstractPrePopulateRegion<byte[]> {
+
+  public PrePopulateRegionBytes() {}
+
+  public PrePopulateRegionBytes(LongRange keyRangeToPrepopulate) {
+    super(keyRangeToPrepopulate);
+  }
+
+  public PrePopulateRegionBytes(LongRange keyRangeToPrepopulate,
+      Roles targetRole) {
+    super(keyRangeToPrepopulate, targetRole);
+  }
+
+  @Override
+  protected byte[] getValue(long i) {
+    return new byte[1204];
+  }
+
+}
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PrePopulateRegionLong.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PrePopulateRegionLong.java
index 0874835..49f4725 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PrePopulateRegionLong.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PrePopulateRegionLong.java
@@ -14,101 +14,28 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
 package org.apache.geode.benchmark.tasks;
 
-import static org.apache.geode.benchmark.topology.Roles.CLIENT;
-import static org.apache.geode.benchmark.topology.Roles.LOCATOR;
-import static org.apache.geode.benchmark.topology.Roles.SERVER;
-
-import java.time.Duration;
-import java.time.Instant;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.geode.benchmark.LongRange;
-import org.apache.geode.cache.Region;
-import org.apache.geode.cache.client.ClientCache;
-import org.apache.geode.cache.client.ClientCacheFactory;
-import org.apache.geode.perftest.Task;
-import org.apache.geode.perftest.TestContext;
+import org.apache.geode.benchmark.topology.Roles;
 
-
-public class PrePopulateRegionLong implements Task {
-  private static final Logger logger = LoggerFactory.getLogger(PrePopulateRegionLong.class);
-
-  private LongRange keyRangeToPrepopulate = new LongRange(0, 10000);
-  private int batchSize = 1000;
+public class PrePopulateRegionLong extends AbstractPrePopulateRegion<Long> {
 
   public PrePopulateRegionLong() {}
 
   public PrePopulateRegionLong(LongRange keyRangeToPrepopulate) {
-    this.keyRangeToPrepopulate = keyRangeToPrepopulate;
+    super(keyRangeToPrepopulate);
   }
 
-  /**
-   * This method prepopulates the region before the actual benchmark starts.
-   */
+  public PrePopulateRegionLong(LongRange keyRangeToPrepopulate,
+      Roles targetRole) {
+    super(keyRangeToPrepopulate, targetRole);
+  }
+
   @Override
-  public void run(TestContext context) throws InterruptedException {
-    final ClientCache cache = ClientCacheFactory.getAnyInstance();
-    final Region<Long, Long> region = cache.getRegion("region");
-    final int numLocators = context.getHostsIDsForRole(LOCATOR.name()).size();
-    final int numServers = context.getHostsIDsForRole(SERVER.name()).size();
-    final int numClient = context.getHostsIDsForRole(CLIENT.name()).size();
-    final int jvmID = context.getJvmID();
-    final int clientIndex = jvmID - numLocators - numServers;
-
-    run(region, keyRangeToPrepopulate.sliceFor(numClient, clientIndex));
+  protected Long getValue(long i) {
+    return i;
   }
 
-  void run(final Map<Long, Long> region, final LongRange range) throws InterruptedException {
-    logger.info("*******************************************");
-    logger.info("      Prepopulating the region ");
-    logger.info("*******************************************");
-    final Instant start = Instant.now();
-
-    final int numThreads = Runtime.getRuntime().availableProcessors();
-    final ExecutorService threadPool = Executors.newFixedThreadPool(numThreads);
-    final List<CompletableFuture<Void>> futures = new ArrayList<>();
-
-    for (final LongRange slice : range.slice(numThreads)) {
-      futures.add(CompletableFuture.runAsync(() -> doPuts(region, slice), threadPool));
-    }
-
-    futures.forEach(CompletableFuture::join);
-
-    final Instant finish = Instant.now();
-    logger.info("*******************************************");
-    logger.info("    Prepopulating the region completed");
-    logger.info("    Duration = " + Duration.between(start, finish).toMillis() + "ms.");
-    logger.info("*******************************************");
-
-    threadPool.shutdownNow();
-    threadPool.awaitTermination(5, TimeUnit.MINUTES);
-  }
-
-  private void doPuts(final Map<Long, Long> region, final LongRange range) {
-    for (final LongRange slice : range.slicesOfSize(batchSize)) {
-      final Map<Long, Long> valueMap = new HashMap<>();
-      slice.forEach(i -> valueMap.put(i, i));
-      region.putAll(valueMap);
-    }
-  }
-
-  public int getBatchSize() {
-    return batchSize;
-  }
-
-  public void setBatchSize(int batchSize) {
-    this.batchSize = batchSize;
-  }
 }
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PutBytesTask.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PutBytesTask.java
new file mode 100644
index 0000000..a88f5f1
--- /dev/null
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PutBytesTask.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geode.benchmark.tasks;
+
+import java.io.Serializable;
+import java.util.Map;
+
+import org.yardstickframework.BenchmarkConfiguration;
+import org.yardstickframework.BenchmarkDriverAdapter;
+
+import org.apache.geode.benchmark.LongRange;
+import org.apache.geode.cache.Cache;
+import org.apache.geode.cache.CacheFactory;
+import org.apache.geode.cache.Region;
+
+public class PutBytesTask extends BenchmarkDriverAdapter implements Serializable {
+
+  private Region<Object, Object> region;
+
+  private LongRange keyRange;
+
+  public PutBytesTask(LongRange keyRange) {
+    this.keyRange = keyRange;
+  }
+
+  @Override
+  public void setUp(BenchmarkConfiguration cfg) throws Exception {
+    super.setUp(cfg);
+    final Cache cache = CacheFactory.getAnyInstance();
+    region = cache.getRegion("region");
+  }
+
+  @Override
+  public boolean test(Map<Object, Object> ctx) {
+    long key = keyRange.random();
+    byte[] bytes = new byte[1024];
+    region.put(key, bytes);
+    return true;
+  }
+}
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PutLongTask.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PutLongTask.java
new file mode 100644
index 0000000..92bf319
--- /dev/null
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PutLongTask.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geode.benchmark.tasks;
+
+import java.io.Serializable;
+import java.util.Map;
+import java.util.concurrent.ThreadLocalRandom;
+
+import org.yardstickframework.BenchmarkConfiguration;
+import org.yardstickframework.BenchmarkDriverAdapter;
+
+import org.apache.geode.benchmark.LongRange;
+import org.apache.geode.cache.Cache;
+import org.apache.geode.cache.CacheFactory;
+import org.apache.geode.cache.Region;
+
+public class PutLongTask extends BenchmarkDriverAdapter implements Serializable {
+
+  private Region<Object, Object> region;
+
+  private LongRange keyRange;
+
+  public PutLongTask(LongRange keyRange) {
+    this.keyRange = keyRange;
+  }
+
+  @Override
+  public void setUp(BenchmarkConfiguration cfg) throws Exception {
+    super.setUp(cfg);
+    final Cache cache = CacheFactory.getAnyInstance();
+    region = cache.getRegion("region");
+  }
+
+  @Override
+  public boolean test(Map<Object, Object> ctx) {
+    long key = keyRange.random();
+    region.put(key, ThreadLocalRandom.current().nextLong());
+    return true;
+  }
+}
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PutTask.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PutTask.java
index ae3aa98..1af2d64 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PutTask.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/PutTask.java
@@ -25,9 +25,9 @@
 import org.yardstickframework.BenchmarkDriverAdapter;
 
 import org.apache.geode.benchmark.LongRange;
+import org.apache.geode.cache.Cache;
+import org.apache.geode.cache.CacheFactory;
 import org.apache.geode.cache.Region;
-import org.apache.geode.cache.client.ClientCache;
-import org.apache.geode.cache.client.ClientCacheFactory;
 
 public class PutTask extends BenchmarkDriverAdapter implements Serializable {
 
@@ -42,7 +42,7 @@
   @Override
   public void setUp(BenchmarkConfiguration cfg) throws Exception {
     super.setUp(cfg);
-    ClientCache cache = ClientCacheFactory.getAnyInstance();
+    final Cache cache = CacheFactory.getAnyInstance();
     region = cache.getRegion("region");
   }
 
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/Sleep.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/Sleep.java
new file mode 100644
index 0000000..2af7631
--- /dev/null
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/Sleep.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geode.benchmark.tasks;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.geode.perftest.Task;
+import org.apache.geode.perftest.TestContext;
+
+/**
+ * Task to sleep.
+ */
+public class Sleep implements Task {
+
+  private final long durationMs;
+
+  public Sleep(final long duration, final TimeUnit timeUnit) {
+    durationMs = MILLISECONDS.convert(duration, timeUnit);
+  }
+
+  @Override
+  public void run(final TestContext context) throws Exception {
+    Thread.sleep(durationMs);
+  }
+
+}
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartLocator.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartLocator.java
index d91e43d..923ec10 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartLocator.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartLocator.java
@@ -56,6 +56,7 @@
    */
   protected void startLocator(final Properties properties, final int locatorPort,
       final TestContext context) throws IOException {
-    Locator.startLocatorAndDS(locatorPort, null, properties);
+    final Locator locator = Locator.startLocatorAndDS(locatorPort, null, properties);
+    context.setAttribute("LOCATOR", locator);
   }
 }
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartSniProxy.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartSniProxy.java
index 5ac999d..f0f4e48 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartSniProxy.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartSniProxy.java
@@ -52,6 +52,7 @@
   @Override
   public void run(TestContext context) throws Exception {
 
+    @SuppressWarnings("unchecked")
     final Map<InetAddress, String> namings =
         (Map<InetAddress, String>) context.getAttribute(HOST_NAMINGS_OFF_PLATFORM);
 
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StopLocator.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StopLocator.java
new file mode 100644
index 0000000..ffb1398
--- /dev/null
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StopLocator.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geode.benchmark.tasks;
+
+import org.apache.geode.distributed.Locator;
+import org.apache.geode.perftest.Task;
+import org.apache.geode.perftest.TestContext;
+
+/**
+ * Task to stop the locator.
+ */
+public class StopLocator implements Task {
+
+  @Override
+  public void run(final TestContext context) throws Exception {
+    final Locator locator = (Locator) context.getAttribute("LOCATOR");
+    locator.stop();
+  }
+
+}
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StopServer.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StopServer.java
new file mode 100644
index 0000000..6ffd348
--- /dev/null
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StopServer.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geode.benchmark.tasks;
+
+import org.apache.geode.cache.Cache;
+import org.apache.geode.perftest.Task;
+import org.apache.geode.perftest.TestContext;
+
+/**
+ * Task to stop the server.
+ */
+public class StopServer implements Task {
+
+  @Override
+  public void run(final TestContext context) throws Exception {
+    final Cache cache = (Cache) context.getAttribute("SERVER_CACHE");
+    cache.close();
+  }
+
+}
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/AbstractFunctionBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/AbstractFunctionBenchmark.java
index 51d6f07..635b377 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/AbstractFunctionBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/AbstractFunctionBenchmark.java
@@ -41,7 +41,7 @@
 
   @Override
   public TestConfig configure() {
-    TestConfig config = GeodeBenchmark.createConfig();
+    TestConfig config = ClientServerBenchmark.createConfig();
     config.threads(Runtime.getRuntime().availableProcessors() * 3);
     configureRegion(config);
     before(config, new CreateClientProxyRegion(), CLIENT);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ClientServerBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ClientServerBenchmark.java
new file mode 100644
index 0000000..982c332
--- /dev/null
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ClientServerBenchmark.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.geode.benchmark.tests;
+
+
+import org.apache.geode.benchmark.topology.ClientServerTopology;
+import org.apache.geode.benchmark.topology.ClientServerTopologyWithSNIProxy;
+import org.apache.geode.perftest.TestConfig;
+
+public class ClientServerBenchmark extends GeodeBenchmark {
+
+
+  public static TestConfig createConfig() {
+    TestConfig config = GeodeBenchmark.createConfig();
+
+    final String sniProp = System.getProperty("withSniProxy");
+    final boolean doSni = sniProp != null && !sniProp.equals("false");
+
+    if (doSni) {
+      ClientServerTopologyWithSNIProxy.configure(config);
+    } else {
+      ClientServerTopology.configure(config);
+    }
+
+    return config;
+  }
+
+}
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/GeodeBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/GeodeBenchmark.java
index bf7d426..97e3494 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/GeodeBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/GeodeBenchmark.java
@@ -17,8 +17,6 @@
 
 import static java.util.concurrent.TimeUnit.MINUTES;
 
-import org.apache.geode.benchmark.topology.ClientServerTopology;
-import org.apache.geode.benchmark.topology.ClientServerTopologyWithSNIProxy;
 import org.apache.geode.perftest.TestConfig;
 
 public class GeodeBenchmark {
@@ -44,16 +42,6 @@
     config.warmupSeconds(WARM_UP_TIME);
     config.durationSeconds(BENCHMARK_DURATION);
     config.threads(THREADS);
-
-    final String sniProp = System.getProperty("withSniProxy");
-    final boolean doSni = sniProp != null && !sniProp.equals("false");
-
-    if (doSni) {
-      ClientServerTopologyWithSNIProxy.configure(config);
-    } else {
-      ClientServerTopology.configure(config);
-    }
-
     return config;
   }
 
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/NoopBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/NoopBenchmark.java
index 7cf49ab..dbc9a12 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/NoopBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/NoopBenchmark.java
@@ -42,7 +42,7 @@
 
   @Override
   public TestConfig configure() {
-    TestConfig config = GeodeBenchmark.createConfig();
+    TestConfig config = ClientServerBenchmark.createConfig();
     workload(config, new NoopTask(), CLIENT);
     return config;
 
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/P2pBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/P2pBenchmark.java
new file mode 100644
index 0000000..0e2cfe2
--- /dev/null
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/P2pBenchmark.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.geode.benchmark.tests;
+
+import org.apache.geode.benchmark.topology.P2pTopology;
+import org.apache.geode.perftest.TestConfig;
+
+public class P2pBenchmark extends GeodeBenchmark {
+
+
+  public static TestConfig createConfig() {
+    TestConfig config = GeodeBenchmark.createConfig();
+
+    P2pTopology.configure(config);
+
+    return config;
+  }
+
+}
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/P2pPartitionedGetBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/P2pPartitionedGetBenchmark.java
new file mode 100644
index 0000000..9c7709f
--- /dev/null
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/P2pPartitionedGetBenchmark.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geode.benchmark.tests;
+
+
+import static org.apache.geode.benchmark.Config.before;
+import static org.apache.geode.benchmark.Config.workload;
+import static org.apache.geode.benchmark.topology.Roles.SERVER;
+
+import org.junit.jupiter.api.Test;
+
+import org.apache.geode.benchmark.LongRange;
+import org.apache.geode.benchmark.tasks.CreatePartitionedRegion;
+import org.apache.geode.benchmark.tasks.GetTask;
+import org.apache.geode.benchmark.tasks.PrePopulateRegion;
+import org.apache.geode.perftest.PerformanceTest;
+import org.apache.geode.perftest.TestConfig;
+import org.apache.geode.perftest.TestRunners;
+
+/**
+ * Benchmark of gets on a partitioned region.
+ */
+public class P2pPartitionedGetBenchmark implements PerformanceTest {
+
+  private LongRange keyRange = new LongRange(0, 1000000);
+
+  @Test
+  public void run() throws Exception {
+    TestRunners.defaultRunner().runTest(this);
+  }
+
+  public P2pPartitionedGetBenchmark() {}
+
+  public void setKeyRange(final LongRange keyRange) {
+    this.keyRange = keyRange;
+  }
+
+  @Override
+  public TestConfig configure() {
+    final TestConfig config = P2pBenchmark.createConfig();
+    before(config, new CreatePartitionedRegion(), SERVER);
+    before(config, new PrePopulateRegion(keyRange, SERVER), SERVER);
+    workload(config, new GetTask(keyRange), SERVER);
+    return config;
+
+  }
+}
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/P2pPartitionedPutBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/P2pPartitionedPutBenchmark.java
new file mode 100644
index 0000000..4ae1b3c
--- /dev/null
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/P2pPartitionedPutBenchmark.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geode.benchmark.tests;
+
+import static org.apache.geode.benchmark.Config.before;
+import static org.apache.geode.benchmark.Config.workload;
+import static org.apache.geode.benchmark.topology.Roles.SERVER;
+
+import org.junit.jupiter.api.Test;
+
+import org.apache.geode.benchmark.LongRange;
+import org.apache.geode.benchmark.tasks.CreatePartitionedRegion;
+import org.apache.geode.benchmark.tasks.PrePopulateRegion;
+import org.apache.geode.benchmark.tasks.PutTask;
+import org.apache.geode.perftest.PerformanceTest;
+import org.apache.geode.perftest.TestConfig;
+import org.apache.geode.perftest.TestRunners;
+
+/**
+ * Benchmark of puts on a partitioned region.
+ */
+public class P2pPartitionedPutBenchmark implements PerformanceTest {
+
+  private LongRange keyRange = new LongRange(0, 1_000_000);
+
+  public P2pPartitionedPutBenchmark() {}
+
+  public void setKeyRange(final LongRange keyRange) {
+    this.keyRange = keyRange;
+  }
+
+  @Test
+  public void run() throws Exception {
+    TestRunners.defaultRunner().runTest(this);
+  }
+
+  @Override
+  public TestConfig configure() {
+    TestConfig config = P2pBenchmark.createConfig();
+
+    before(config, new CreatePartitionedRegion(), SERVER);
+    before(config, new PrePopulateRegion(keyRange, SERVER), SERVER);
+    workload(config, new PutTask(keyRange), SERVER);
+    return config;
+  }
+}
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/P2pPartitionedPutBytesBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/P2pPartitionedPutBytesBenchmark.java
new file mode 100644
index 0000000..2e4af47
--- /dev/null
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/P2pPartitionedPutBytesBenchmark.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geode.benchmark.tests;
+
+import static org.apache.geode.benchmark.Config.before;
+import static org.apache.geode.benchmark.Config.workload;
+import static org.apache.geode.benchmark.topology.Roles.SERVER;
+
+import org.junit.jupiter.api.Test;
+
+import org.apache.geode.benchmark.LongRange;
+import org.apache.geode.benchmark.tasks.CreatePartitionedRegion;
+import org.apache.geode.benchmark.tasks.PrePopulateRegionBytes;
+import org.apache.geode.benchmark.tasks.PutBytesTask;
+import org.apache.geode.perftest.PerformanceTest;
+import org.apache.geode.perftest.TestConfig;
+import org.apache.geode.perftest.TestRunners;
+
+/**
+ * Benchmark of puts on a partitioned region.
+ */
+public class P2pPartitionedPutBytesBenchmark implements PerformanceTest {
+
+  private LongRange keyRange = new LongRange(0, 1000000);
+
+  public P2pPartitionedPutBytesBenchmark() {}
+
+  public void setKeyRange(final LongRange keyRange) {
+    this.keyRange = keyRange;
+  }
+
+  @Test
+  public void run() throws Exception {
+    TestRunners.defaultRunner().runTest(this);
+  }
+
+  @Override
+  public TestConfig configure() {
+    TestConfig config = P2pBenchmark.createConfig();
+    before(config, new CreatePartitionedRegion(), SERVER);
+    before(config, new PrePopulateRegionBytes(keyRange, SERVER), SERVER);
+    workload(config, new PutBytesTask(keyRange), SERVER);
+    return config;
+  }
+}
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/P2pPartitionedPutLongBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/P2pPartitionedPutLongBenchmark.java
new file mode 100644
index 0000000..961b604
--- /dev/null
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/P2pPartitionedPutLongBenchmark.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geode.benchmark.tests;
+
+import static org.apache.geode.benchmark.Config.before;
+import static org.apache.geode.benchmark.Config.workload;
+import static org.apache.geode.benchmark.topology.Roles.SERVER;
+
+import org.junit.jupiter.api.Test;
+
+import org.apache.geode.benchmark.LongRange;
+import org.apache.geode.benchmark.tasks.CreatePartitionedRegion;
+import org.apache.geode.benchmark.tasks.PrePopulateRegionLong;
+import org.apache.geode.benchmark.tasks.PutLongTask;
+import org.apache.geode.perftest.PerformanceTest;
+import org.apache.geode.perftest.TestConfig;
+import org.apache.geode.perftest.TestRunners;
+
+/**
+ * Benchmark of puts on a partitioned region.
+ */
+public class P2pPartitionedPutLongBenchmark implements PerformanceTest {
+
+  private LongRange keyRange = new LongRange(0, 1000000);
+
+  public P2pPartitionedPutLongBenchmark() {}
+
+  public void setKeyRange(final LongRange keyRange) {
+    this.keyRange = keyRange;
+  }
+
+  @Test
+  public void run() throws Exception {
+    TestRunners.defaultRunner().runTest(this);
+  }
+
+  @Override
+  public TestConfig configure() {
+    TestConfig config = P2pBenchmark.createConfig();
+    before(config, new CreatePartitionedRegion(), SERVER);
+    before(config, new PrePopulateRegionLong(keyRange, SERVER), SERVER);
+    workload(config, new PutLongTask(keyRange), SERVER);
+    return config;
+  }
+}
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedGetBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedGetBenchmark.java
index 676a1f3..d2a6790 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedGetBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedGetBenchmark.java
@@ -54,7 +54,7 @@
 
   @Override
   public TestConfig configure() {
-    TestConfig config = GeodeBenchmark.createConfig();
+    TestConfig config = ClientServerBenchmark.createConfig();
     before(config, new CreatePartitionedRegion(), SERVER);
     before(config, new CreateClientProxyRegion(), CLIENT);
     before(config, new PrePopulateRegion(keyRange), CLIENT);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedGetLongBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedGetLongBenchmark.java
index f64081d..3b770c5 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedGetLongBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedGetLongBenchmark.java
@@ -54,7 +54,7 @@
 
   @Override
   public TestConfig configure() {
-    TestConfig config = GeodeBenchmark.createConfig();
+    TestConfig config = ClientServerBenchmark.createConfig();
     before(config, new CreatePartitionedRegion(), SERVER);
     before(config, new CreateClientProxyRegion(), CLIENT);
     before(config, new PrePopulateRegionLong(keyRange), CLIENT);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedIndexedQueryBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedIndexedQueryBenchmark.java
index 0aa42ad..bc81006 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedIndexedQueryBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedIndexedQueryBenchmark.java
@@ -52,7 +52,7 @@
 
   @Override
   public TestConfig configure() {
-    TestConfig config = GeodeBenchmark.createConfig();
+    TestConfig config = ClientServerBenchmark.createConfig();
     config.threads(Runtime.getRuntime().availableProcessors() * 8);
     before(config, new CreatePartitionedRegion(), SERVER);
     before(config, new CreateClientProxyRegion(), CLIENT);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedNonIndexedQueryBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedNonIndexedQueryBenchmark.java
index 06cf6ea..80ff61c 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedNonIndexedQueryBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedNonIndexedQueryBenchmark.java
@@ -51,7 +51,7 @@
 
   @Override
   public TestConfig configure() {
-    TestConfig config = GeodeBenchmark.createConfig();
+    TestConfig config = ClientServerBenchmark.createConfig();
     config.threads(Runtime.getRuntime().availableProcessors());
     before(config, new CreatePartitionedRegion(), SERVER);
     before(config, new CreateClientProxyRegion(), CLIENT);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutAllBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutAllBenchmark.java
index 7e35bc6..f7f13f6 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutAllBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutAllBenchmark.java
@@ -55,7 +55,7 @@
 
   @Override
   public TestConfig configure() {
-    TestConfig config = GeodeBenchmark.createConfig();
+    TestConfig config = ClientServerBenchmark.createConfig();
     config.threads(Runtime.getRuntime().availableProcessors() * 2);
     before(config, new CreatePartitionedRegion(), SERVER);
     before(config, new CreateClientProxyRegion(), CLIENT);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutAllLongBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutAllLongBenchmark.java
index e300de4..a1ad5e2 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutAllLongBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutAllLongBenchmark.java
@@ -55,7 +55,7 @@
 
   @Override
   public TestConfig configure() {
-    TestConfig config = GeodeBenchmark.createConfig();
+    TestConfig config = ClientServerBenchmark.createConfig();
     config.threads(Runtime.getRuntime().availableProcessors() * 2);
     before(config, new CreatePartitionedRegion(), SERVER);
     before(config, new CreateClientProxyRegion(), CLIENT);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutBenchmark.java
index 8a18d73..8a61a79 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutBenchmark.java
@@ -53,7 +53,7 @@
 
   @Override
   public TestConfig configure() {
-    TestConfig config = GeodeBenchmark.createConfig();
+    TestConfig config = ClientServerBenchmark.createConfig();
 
     before(config, new CreatePartitionedRegion(), SERVER);
     before(config, new CreateClientProxyRegion(), CLIENT);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutBytesBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutBytesBenchmark.java
new file mode 100644
index 0000000..2a70824
--- /dev/null
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutBytesBenchmark.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geode.benchmark.tests;
+
+import static org.apache.geode.benchmark.Config.before;
+import static org.apache.geode.benchmark.Config.workload;
+import static org.apache.geode.benchmark.topology.Roles.CLIENT;
+import static org.apache.geode.benchmark.topology.Roles.SERVER;
+
+import org.junit.jupiter.api.Test;
+
+import org.apache.geode.benchmark.LongRange;
+import org.apache.geode.benchmark.tasks.CreateClientProxyRegion;
+import org.apache.geode.benchmark.tasks.CreatePartitionedRegion;
+import org.apache.geode.benchmark.tasks.PrePopulateRegionBytes;
+import org.apache.geode.benchmark.tasks.PutBytesTask;
+import org.apache.geode.perftest.PerformanceTest;
+import org.apache.geode.perftest.TestConfig;
+import org.apache.geode.perftest.TestRunners;
+
+/**
+ * Benchmark of puts on a partitioned region.
+ */
+public class PartitionedPutBytesBenchmark implements PerformanceTest {
+
+  private LongRange keyRange = new LongRange(0, 1000000);
+
+  public PartitionedPutBytesBenchmark() {}
+
+  public void setKeyRange(final LongRange keyRange) {
+    this.keyRange = keyRange;
+  }
+
+  @Test
+  public void run() throws Exception {
+    TestRunners.defaultRunner().runTest(this);
+  }
+
+  @Override
+  public TestConfig configure() {
+    TestConfig config = ClientServerBenchmark.createConfig();
+    before(config, new CreatePartitionedRegion(), SERVER);
+    before(config, new CreateClientProxyRegion(), CLIENT);
+    before(config, new PrePopulateRegionBytes(keyRange), CLIENT);
+    workload(config, new PutBytesTask(keyRange), CLIENT);
+    return config;
+  }
+}
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutLongBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutLongBenchmark.java
index ed33f1a..5b5307f 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutLongBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/PartitionedPutLongBenchmark.java
@@ -28,7 +28,7 @@
 import org.apache.geode.benchmark.tasks.CreateClientProxyRegion;
 import org.apache.geode.benchmark.tasks.CreatePartitionedRegion;
 import org.apache.geode.benchmark.tasks.PrePopulateRegionLong;
-import org.apache.geode.benchmark.tasks.PutTask;
+import org.apache.geode.benchmark.tasks.PutLongTask;
 import org.apache.geode.perftest.PerformanceTest;
 import org.apache.geode.perftest.TestConfig;
 import org.apache.geode.perftest.TestRunners;
@@ -53,11 +53,11 @@
 
   @Override
   public TestConfig configure() {
-    TestConfig config = GeodeBenchmark.createConfig();
+    TestConfig config = ClientServerBenchmark.createConfig();
     before(config, new CreatePartitionedRegion(), SERVER);
     before(config, new CreateClientProxyRegion(), CLIENT);
     before(config, new PrePopulateRegionLong(keyRange), CLIENT);
-    workload(config, new PutTask(keyRange), CLIENT);
+    workload(config, new PutLongTask(keyRange), CLIENT);
     return config;
   }
 }
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedGetBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedGetBenchmark.java
index 97b01f4..ac4e9a3 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedGetBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedGetBenchmark.java
@@ -54,7 +54,7 @@
 
   @Override
   public TestConfig configure() {
-    TestConfig config = GeodeBenchmark.createConfig();
+    TestConfig config = ClientServerBenchmark.createConfig();
     before(config, new CreateReplicatedRegion(), SERVER);
     before(config, new CreateClientProxyRegion(), CLIENT);
     before(config, new PrePopulateRegion(keyRange), CLIENT);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedGetLongBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedGetLongBenchmark.java
index d796638..c3215b9 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedGetLongBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedGetLongBenchmark.java
@@ -54,7 +54,7 @@
 
   @Override
   public TestConfig configure() {
-    TestConfig config = GeodeBenchmark.createConfig();
+    TestConfig config = ClientServerBenchmark.createConfig();
     before(config, new CreateReplicatedRegion(), SERVER);
     before(config, new CreateClientProxyRegion(), CLIENT);
     before(config, new PrePopulateRegionLong(keyRange), CLIENT);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedIndexedQueryBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedIndexedQueryBenchmark.java
index d0ee1b0..258400e 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedIndexedQueryBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedIndexedQueryBenchmark.java
@@ -52,7 +52,7 @@
 
   @Override
   public TestConfig configure() {
-    TestConfig config = GeodeBenchmark.createConfig();
+    TestConfig config = ClientServerBenchmark.createConfig();
     config.threads(Runtime.getRuntime().availableProcessors() * 8);
     before(config, new CreateReplicatedRegion(), SERVER);
     before(config, new CreateClientProxyRegion(), CLIENT);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedNonIndexedQueryBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedNonIndexedQueryBenchmark.java
index 873ef49..0858a9c 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedNonIndexedQueryBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedNonIndexedQueryBenchmark.java
@@ -51,7 +51,7 @@
 
   @Override
   public TestConfig configure() {
-    TestConfig config = GeodeBenchmark.createConfig();
+    TestConfig config = ClientServerBenchmark.createConfig();
     config.threads(Runtime.getRuntime().availableProcessors());
     before(config, new CreateReplicatedRegion(), SERVER);
     before(config, new CreateClientProxyRegion(), CLIENT);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutAllBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutAllBenchmark.java
index c5b4f90..72e7d1a 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutAllBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutAllBenchmark.java
@@ -55,7 +55,7 @@
 
   @Override
   public TestConfig configure() {
-    TestConfig config = GeodeBenchmark.createConfig();
+    TestConfig config = ClientServerBenchmark.createConfig();
     config.threads(Runtime.getRuntime().availableProcessors() * 2);
     before(config, new CreateReplicatedRegion(), SERVER);
     before(config, new CreateClientProxyRegion(), CLIENT);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutAllLongBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutAllLongBenchmark.java
index 3719f3e..1c7607b 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutAllLongBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutAllLongBenchmark.java
@@ -55,7 +55,7 @@
 
   @Override
   public TestConfig configure() {
-    TestConfig config = GeodeBenchmark.createConfig();
+    TestConfig config = ClientServerBenchmark.createConfig();
     config.threads(Runtime.getRuntime().availableProcessors() * 2);
     before(config, new CreateReplicatedRegion(), SERVER);
     before(config, new CreateClientProxyRegion(), CLIENT);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutBenchmark.java
index 1768b50..4339ca8 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutBenchmark.java
@@ -53,7 +53,7 @@
 
   @Override
   public TestConfig configure() {
-    TestConfig config = GeodeBenchmark.createConfig();
+    TestConfig config = ClientServerBenchmark.createConfig();
     before(config, new CreateReplicatedRegion(), SERVER);
     before(config, new CreateClientProxyRegion(), CLIENT);
     before(config, new PrePopulateRegion(keyRange), CLIENT);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutLongBenchmark.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutLongBenchmark.java
index 3a6b941..9b4d0f7 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutLongBenchmark.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tests/ReplicatedPutLongBenchmark.java
@@ -53,7 +53,7 @@
 
   @Override
   public TestConfig configure() {
-    TestConfig config = GeodeBenchmark.createConfig();
+    TestConfig config = ClientServerBenchmark.createConfig();
     before(config, new CreateReplicatedRegion(), SERVER);
     before(config, new CreateClientProxyRegion(), CLIENT);
     before(config, new PrePopulateRegionLong(keyRange), CLIENT);
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/topology/ClientServerTopology.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/topology/ClientServerTopology.java
index 63fa137..4ef9ffb 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/topology/ClientServerTopology.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/topology/ClientServerTopology.java
@@ -14,48 +14,40 @@
  */
 package org.apache.geode.benchmark.topology;
 
+import static org.apache.geode.benchmark.Config.after;
 import static org.apache.geode.benchmark.Config.before;
 import static org.apache.geode.benchmark.Config.role;
-import static org.apache.geode.benchmark.parameters.Utils.addToTestConfig;
 import static org.apache.geode.benchmark.topology.Ports.LOCATOR_PORT;
 import static org.apache.geode.benchmark.topology.Roles.CLIENT;
 import static org.apache.geode.benchmark.topology.Roles.LOCATOR;
 import static org.apache.geode.benchmark.topology.Roles.SERVER;
 
-import org.apache.geode.benchmark.parameters.GcLoggingParameters;
-import org.apache.geode.benchmark.parameters.GcParameters;
-import org.apache.geode.benchmark.parameters.HeapParameters;
-import org.apache.geode.benchmark.parameters.JvmParameters;
-import org.apache.geode.benchmark.parameters.ProfilerParameters;
 import org.apache.geode.benchmark.tasks.StartClient;
 import org.apache.geode.benchmark.tasks.StartLocator;
 import org.apache.geode.benchmark.tasks.StartServer;
+import org.apache.geode.benchmark.tasks.StopClient;
+import org.apache.geode.benchmark.tasks.StopLocator;
+import org.apache.geode.benchmark.tasks.StopServer;
 import org.apache.geode.perftest.TestConfig;
 
-public class ClientServerTopology {
+public class ClientServerTopology extends Topology {
   private static final int NUM_LOCATORS = 1;
   private static final int NUM_SERVERS = 2;
   private static final int NUM_CLIENTS = 1;
-  private static final String WITH_SSL_ARGUMENT = "-DwithSsl=true";
-  private static final String WITH_SECURITY_MANAGER_ARGUMENT = "-DwithSecurityManager=true";
 
   public static void configure(TestConfig config) {
     role(config, LOCATOR, NUM_LOCATORS);
     role(config, SERVER, NUM_SERVERS);
     role(config, CLIENT, NUM_CLIENTS);
 
-    JvmParameters.configure(config);
-    HeapParameters.configure(config);
-    GcLoggingParameters.configure(config);
-    GcParameters.configure(config);
-    ProfilerParameters.configure(config);
-
-    addToTestConfig(config, "withSsl", WITH_SSL_ARGUMENT);
-    addToTestConfig(config, "withSecurityManager", WITH_SECURITY_MANAGER_ARGUMENT);
+    configureCommon(config);
 
     before(config, new StartLocator(LOCATOR_PORT), LOCATOR);
     before(config, new StartServer(LOCATOR_PORT), SERVER);
     before(config, new StartClient(LOCATOR_PORT), CLIENT);
-  }
 
+    after(config, new StopClient(), CLIENT);
+    after(config, new StopServer(), SERVER);
+    after(config, new StopLocator(), LOCATOR);
+  }
 }
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/topology/ClientServerTopologyWithSNIProxy.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/topology/ClientServerTopologyWithSNIProxy.java
index ee5ade1..d9a72f3 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/topology/ClientServerTopologyWithSNIProxy.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/topology/ClientServerTopologyWithSNIProxy.java
@@ -17,7 +17,6 @@
 import static org.apache.geode.benchmark.Config.after;
 import static org.apache.geode.benchmark.Config.before;
 import static org.apache.geode.benchmark.Config.role;
-import static org.apache.geode.benchmark.parameters.Utils.addToTestConfig;
 import static org.apache.geode.benchmark.parameters.Utils.configureGeodeProductJvms;
 import static org.apache.geode.benchmark.topology.Ports.LOCATOR_PORT;
 import static org.apache.geode.benchmark.topology.Ports.SERVER_PORT_FOR_SNI;
@@ -26,14 +25,10 @@
 import static org.apache.geode.benchmark.topology.Roles.LOCATOR;
 import static org.apache.geode.benchmark.topology.Roles.PROXY;
 import static org.apache.geode.benchmark.topology.Roles.SERVER;
+import static org.apache.geode.benchmark.topology.Topology.WITH_SSL_ARGUMENT;
 
 import java.util.stream.Stream;
 
-import org.apache.geode.benchmark.parameters.GcLoggingParameters;
-import org.apache.geode.benchmark.parameters.GcParameters;
-import org.apache.geode.benchmark.parameters.HeapParameters;
-import org.apache.geode.benchmark.parameters.JvmParameters;
-import org.apache.geode.benchmark.parameters.ProfilerParameters;
 import org.apache.geode.benchmark.tasks.DefineHostNamingsOffPlatformTask;
 import org.apache.geode.benchmark.tasks.StartClientSNI;
 import org.apache.geode.benchmark.tasks.StartLocatorSNI;
@@ -43,13 +38,11 @@
 import org.apache.geode.benchmark.tasks.StopSniProxy;
 import org.apache.geode.perftest.TestConfig;
 
-public class ClientServerTopologyWithSNIProxy {
+public class ClientServerTopologyWithSNIProxy extends Topology {
   private static final int NUM_LOCATORS = 1;
   private static final int NUM_SERVERS = 2;
   private static final int NUM_CLIENTS = 1;
   private static final int NUM_PROXIES = 1;
-  private static final String WITH_SSL_ARGUMENT = "-DwithSsl=true";
-  private static final String WITH_SECURITY_MANAGER_ARGUMENT = "-DwithSecurityManager=true";
 
   public static void configure(TestConfig config) {
     role(config, LOCATOR, NUM_LOCATORS);
@@ -57,14 +50,9 @@
     role(config, CLIENT, NUM_CLIENTS);
     role(config, PROXY, NUM_PROXIES);
 
-    JvmParameters.configure(config);
-    HeapParameters.configure(config);
-    GcLoggingParameters.configure(config);
-    GcParameters.configure(config);
-    ProfilerParameters.configure(config);
+    configureCommon(config);
 
     configureGeodeProductJvms(config, WITH_SSL_ARGUMENT);
-    addToTestConfig(config, "withSecurityManager", WITH_SECURITY_MANAGER_ARGUMENT);
 
     Stream.concat(Roles.rolesFor(GEODE_PRODUCT), Stream.of(PROXY))
         .forEach(role -> before(config, new DefineHostNamingsOffPlatformTask(), role));
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/topology/P2pTopology.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/topology/P2pTopology.java
new file mode 100644
index 0000000..f186926
--- /dev/null
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/topology/P2pTopology.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.apache.geode.benchmark.topology;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.geode.benchmark.Config.after;
+import static org.apache.geode.benchmark.Config.before;
+import static org.apache.geode.benchmark.Config.role;
+import static org.apache.geode.benchmark.topology.Ports.LOCATOR_PORT;
+import static org.apache.geode.benchmark.topology.Roles.LOCATOR;
+import static org.apache.geode.benchmark.topology.Roles.SERVER;
+
+import org.apache.geode.benchmark.tasks.Sleep;
+import org.apache.geode.benchmark.tasks.StartLocator;
+import org.apache.geode.benchmark.tasks.StartServer;
+import org.apache.geode.benchmark.tasks.StopLocator;
+import org.apache.geode.benchmark.tasks.StopServer;
+import org.apache.geode.perftest.TestConfig;
+
+public class P2pTopology extends Topology {
+  private static final int NUM_LOCATORS = 1;
+  private static final int NUM_SERVERS = 3;
+
+  public static void configure(TestConfig config) {
+    role(config, LOCATOR, NUM_LOCATORS);
+    role(config, SERVER, NUM_SERVERS);
+
+    configureCommon(config);
+
+    before(config, new StartLocator(LOCATOR_PORT), LOCATOR);
+    before(config, new StartServer(LOCATOR_PORT), SERVER);
+
+    after(config, new Sleep(10, SECONDS), SERVER);
+    after(config, new StopServer(), SERVER);
+    after(config, new StopLocator(), LOCATOR);
+  }
+
+}
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/topology/Topology.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/topology/Topology.java
new file mode 100644
index 0000000..7b17111
--- /dev/null
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/topology/Topology.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License. You may obtain a
+ * copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package org.apache.geode.benchmark.topology;
+
+import static org.apache.geode.benchmark.parameters.Utils.addToTestConfig;
+
+import org.apache.geode.benchmark.parameters.GcLoggingParameters;
+import org.apache.geode.benchmark.parameters.GcParameters;
+import org.apache.geode.benchmark.parameters.HeapParameters;
+import org.apache.geode.benchmark.parameters.JvmParameters;
+import org.apache.geode.benchmark.parameters.ProfilerParameters;
+import org.apache.geode.perftest.TestConfig;
+
+public abstract class Topology {
+  public static final String WITH_SSL_PROPERTY = "withSsl";
+  static final String WITH_SSL_ARGUMENT = "-DwithSsl=true";
+
+  public static final String WITH_SSL_PROTOCOLS_PROPERTY = "withSslProtocols";
+  public static final String WITH_SSL_CIPHERS_PROPERTY = "withSslCiphers";
+
+  public static final String WITH_SECURITY_MANAGER_PROPERTY = "withSecurityManager";
+  static final String WITH_SECURITY_MANAGER_ARGUMENT = "-DwithSecurityManager=true";
+
+  static void configureCommon(TestConfig config) {
+    JvmParameters.configure(config);
+    HeapParameters.configure(config);
+    GcLoggingParameters.configure(config);
+    GcParameters.configure(config);
+    ProfilerParameters.configure(config);
+
+    addToTestConfig(config, WITH_SSL_PROPERTY, WITH_SSL_ARGUMENT);
+    addToTestConfig(config, WITH_SSL_PROTOCOLS_PROPERTY);
+    addToTestConfig(config, WITH_SSL_CIPHERS_PROPERTY);
+    addToTestConfig(config, WITH_SECURITY_MANAGER_PROPERTY, WITH_SECURITY_MANAGER_ARGUMENT);
+  }
+
+}
diff --git a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/GeodeBenchmarkTest.java b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/GeodeBenchmarkTest.java
index 6beb78c..84337f4 100644
--- a/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/GeodeBenchmarkTest.java
+++ b/geode-benchmarks/src/test/java/org/apache/geode/benchmark/tests/GeodeBenchmarkTest.java
@@ -53,28 +53,28 @@
   @Test
   public void withoutSniProxy() {
     System.clearProperty("withSniProxy");
-    config = GeodeBenchmark.createConfig();
+    config = ClientServerBenchmark.createConfig();
     assertThat(config.getBefore()).doesNotContain(startProxyStep);
   }
 
   @Test
   public void withSniProxyFalse() {
     System.setProperty("withSniProxy", "false");
-    config = GeodeBenchmark.createConfig();
+    config = ClientServerBenchmark.createConfig();
     assertThat(config.getBefore()).doesNotContain(startProxyStep);
   }
 
   @Test
   public void withSniProxyTrue() {
     System.setProperty("withSniProxy", "true");
-    config = GeodeBenchmark.createConfig();
+    config = ClientServerBenchmark.createConfig();
     assertThat(config.getBefore()).contains(startProxyStep);
   }
 
   @Test
   public void withSniProxyNotLowercaseFalse() {
     System.setProperty("withSniProxy", "AnythING");
-    config = GeodeBenchmark.createConfig();
+    config = ClientServerBenchmark.createConfig();
     assertThat(config.getBefore()).contains(startProxyStep);
   }
 
diff --git a/gradle.properties b/gradle.properties
index c4af9d7..97c0a1a 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -14,7 +14,7 @@
 # limitations under the License.
 
 # The versionNumber follows semantic versioning conventions.
-versionNumber = 1.9.0
+versionNumber = 1.13.0
 
 # The releaseQualifier uses the following conventions:
 #   .M?       - milestone release
@@ -41,4 +41,4 @@
 productName = Apache Geode
 productOrg = Apache Software Foundation (ASF)
 
-minimumGradleVersion = 5.0
\ No newline at end of file
+minimumGradleVersion = 6.6.1
\ No newline at end of file
diff --git a/gradle/rat.gradle b/gradle/rat.gradle
index e78d996..894eb3c 100644
--- a/gradle/rat.gradle
+++ b/gradle/rat.gradle
@@ -15,22 +15,37 @@
  * limitations under the License.
  */
 
-apply plugin: "org.nosphere.apache.rat"
+repositories {
+  mavenCentral()
+}
 
 rat {
+  inputDir = rootDir
+
   excludes = [
-    '.travis.yml',
+    // git
     '.git/**',
-    '**/output/**',
-    '**/output-*/**',
+    '**/.gitignore',
+    '**/.gitkeep',
+    // gradle
+    '**/.gradle/**',
+    'gradlew',
+    'gradlew.bat',
+    'gradle/wrapper/gradle-wrapper.properties',
+    'caches/**',
+    'daemon/**',
+    'native/**',
+    'wrapper/**',
     '**/build/**',
-    '**/out/**',
-    'README.md',
+    '**/build-*/**',
+    '.buildinfo',
+    '**/release-features.rendered',
+    // just for jenkins
+
     // IDE
     'etc/eclipse-java-google-style.xml',
     'etc/intellij-java-modified-google-style.xml',
     'etc/eclipseOrganizeImports.importorder',
-    'etc/greclipse.properties',
     '**/.project',
     '**/.classpath',
     '**/.settings/**',
@@ -41,19 +56,6 @@
     '.idea/**',
     '**/tags',
     '**/out/**',
-    // gradle
-    '**/.gradle/**',
-    '.gradle/**',
-    'gradlew*',
-    'gradle/**',
-    'gradle/wrapper/gradle-wrapper.properties',
-    'caches/**',
-    'daemon/**',
-    'native/**',
-    'wrapper/**',
-    '**/build/**',
-    '**/build-*/**',
-    '.buildinfo',
     // text files
     '**/*.fig',
     '**/*.txt',
@@ -67,6 +69,33 @@
     '**/*.rej',
     '**/*.orig',
     '**/*.MF',
-    '**/*.cfg',
+    '**/cargo_logs/**',
+    '**/META-INF/**',
+    'jpf.properties',
+    // binary files
+    '**/*.cer',
+    '**/*.dia',
+    '**/*.gfs',
+    '**/*.gif',
+    '**/*.ico',
+    '**/*.jpg',
+    '**/*.keystore',
+    '**/*.pdf',
+    '**/*.png',
+    '**/*.ser',
+    '**/*.svg',
+    '**/*.truststore',
+    '**/*.xls',
+    '**/publickeyfile',
+    '**/*.dat',
+    // other text files
+    '**/log4j*.xml',
+    // file created by `jenv local`
+    '.java-version',
+    // benchmark outputs
+    'infrastructure/scripts/**/output-*',
+    'infrastructure/scripts/**/failedTests',
   ]
 }
+
+check.dependsOn rat
diff --git a/gradle/spotless.gradle b/gradle/spotless.gradle
index b06b631..af57aa1 100644
--- a/gradle/spotless.gradle
+++ b/gradle/spotless.gradle
@@ -16,7 +16,7 @@
  */
 
 allprojects {
-  apply plugin: "com.diffplug.gradle.spotless"
+  apply plugin: "com.diffplug.spotless"
   spotless {
     lineEndings = 'unix'
     java {
@@ -125,7 +125,6 @@
       }
 
       greclipse().configFile "${rootProject.projectDir}/etc/greclipse.properties"
-      paddedCell()
       indentWithSpaces(2)
     }
     groovy {
@@ -135,7 +134,6 @@
       }
       greclipse().configFile "${rootProject.projectDir}/etc/greclipse.properties"
       indentWithSpaces(2)
-      paddedCell()
     }
   }
 
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 51d5ca2..ef88891 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.4-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-all.zip
diff --git a/harness/build.gradle b/harness/build.gradle
index e8096d3..ba1c3d9 100644
--- a/harness/build.gradle
+++ b/harness/build.gradle
@@ -61,7 +61,8 @@
 compileJava {
   options.fork = true
   options.forkOptions.executable = 'javac'
-  options.compilerArgs << '-XDignore.symbol.file'
+  options.compilerArgs << '-XDignore.symbol.file' << '-Xlint:unchecked' << "-Werror"
+  options.deprecation = true
 }
 
 test{ useJUnitPlatform() }
diff --git a/harness/src/main/java/org/apache/geode/perftest/analysis/Analyzer.java b/harness/src/main/java/org/apache/geode/perftest/analysis/Analyzer.java
index 9d69c75..d5bd611 100644
--- a/harness/src/main/java/org/apache/geode/perftest/analysis/Analyzer.java
+++ b/harness/src/main/java/org/apache/geode/perftest/analysis/Analyzer.java
@@ -56,7 +56,7 @@
       return;
     }
 
-    boolean isCI = System.getProperty("TEST_CI").equals("1");
+    boolean isCI = System.getProperty("TEST_CI", "0").equals("1");
 
     System.out.println("Running analyzer");
     System.out.println(
diff --git a/harness/src/main/java/org/apache/geode/perftest/yardstick/analysis/YardstickHdrHistogramParser.java b/harness/src/main/java/org/apache/geode/perftest/yardstick/analysis/YardstickHdrHistogramParser.java
index a52ba4a..0d861ae 100644
--- a/harness/src/main/java/org/apache/geode/perftest/yardstick/analysis/YardstickHdrHistogramParser.java
+++ b/harness/src/main/java/org/apache/geode/perftest/yardstick/analysis/YardstickHdrHistogramParser.java
@@ -66,7 +66,8 @@
     results.add(new ResultData("latency standard deviation", histogram.getStdDeviation()));
     results.add(new ResultData("latency standard error",
         histogram.getStdDeviation() / Math.sqrt(histogram.getTotalCount())));
-
+    results.add(new ResultData("average ops/second", ((double) histogram.getTotalCount())
+        / (histogram.getEndTimeStamp() - histogram.getStartTimeStamp()) * 1000));
     return results;
   }
 }
diff --git a/harness/src/main/java/org/apache/geode/perftest/yardstick/hdrhistogram/HdrHistogramProbe.java b/harness/src/main/java/org/apache/geode/perftest/yardstick/hdrhistogram/HdrHistogramProbe.java
index 5579d0d..d841f67 100644
--- a/harness/src/main/java/org/apache/geode/perftest/yardstick/hdrhistogram/HdrHistogramProbe.java
+++ b/harness/src/main/java/org/apache/geode/perftest/yardstick/hdrhistogram/HdrHistogramProbe.java
@@ -18,6 +18,8 @@
 package org.apache.geode.perftest.yardstick.hdrhistogram;
 
 
+import static java.util.concurrent.TimeUnit.SECONDS;
+
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -25,6 +27,8 @@
 import java.util.function.Consumer;
 
 import org.HdrHistogram.Histogram;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.yardstickframework.BenchmarkConfiguration;
 import org.yardstickframework.BenchmarkDriver;
 import org.yardstickframework.BenchmarkExecutionAwareProbe;
@@ -43,9 +47,10 @@
  * TODO consider writing per interval histograms using HistogramLogWriter
  */
 public class HdrHistogramProbe implements BenchmarkExecutionAwareProbe, BenchmarkTotalsOnlyProbe {
+  private static final Logger logger = LoggerFactory.getLogger(HdrHistogramProbe.class);
 
   private final int lower;
-  private final long upper;
+  private long upper;
   private final int numDigits;
   private final Clock clock;
   private final Consumer<Histogram> histogramConsumer;
@@ -77,7 +82,8 @@
 
   @Override
   public void start(BenchmarkDriver drv, BenchmarkConfiguration cfg) throws Exception {
-    int threads = cfg.threads();
+    final int threads = cfg.threads();
+    upper = SECONDS.toNanos(cfg.duration());
     start(threads);
 
   }
@@ -90,13 +96,17 @@
   }
 
   private void reset() {
+    final long timeStampMsec = System.currentTimeMillis();
     for (int i = 0; i < histograms.length; i++) {
       histograms[i] = new Histogram(lower, upper, numDigits);
+      histograms[i].setStartTimeStamp(timeStampMsec);
     }
   }
 
   @Override
-  public void stop() {}
+  public void stop() {
+    logger.info("Stopped");
+  }
 
   @Override
   public Collection<String> metaInfo() {
@@ -105,16 +115,29 @@
 
   @Override
   public Collection<BenchmarkProbePoint> points() {
-    Histogram aggregate = getHistogram();
+    final Histogram aggregate = getHistogram();
     reset();
 
-    double percentile50 = aggregate.getMean();
-    long percentile99 = aggregate.getValueAtPercentile(99);
+    final double mean = aggregate.getMean();
+    final long percentile99 = aggregate.getValueAtPercentile(99);
 
-    BenchmarkProbePoint point =
-        new BenchmarkProbePoint(0, new double[] {percentile50, percentile99});
+    final BenchmarkProbePoint point =
+        new BenchmarkProbePoint(aggregate.getEndTimeStamp(), new double[] {mean, percentile99});
 
-    histogramConsumer.accept(aggregate);
+    for (int r = 0; r < 5; ++r) {
+      try {
+        logger.info("Saving histogram. r={}", r);
+        histogramConsumer.accept(aggregate);
+      } catch (Exception e) {
+        logger.error("Failed to save histogram. aggregate={}", aggregate.getTag(), e);
+        try {
+          Thread.sleep(SECONDS.toMillis(1));
+        } catch (InterruptedException ignored) {
+        }
+        continue;
+      }
+      break;
+    }
     return Collections.singleton(point);
   }
 
@@ -123,13 +146,12 @@
 
   }
 
-
-
-  public Histogram getHistogram() {
-    Histogram aggregate = new Histogram(lower, upper, numDigits);
-    for (Histogram histogram : histograms) {
+  Histogram getHistogram() {
+    final Histogram aggregate = new Histogram(lower, upper, numDigits);
+    for (final Histogram histogram : histograms) {
       aggregate.add(histogram);
     }
+    aggregate.setEndTimeStamp(System.currentTimeMillis());
     return aggregate;
   }
 }
diff --git a/harness/src/test/java/org/apache/geode/perftest/yardstick/hdrhistogram/HdrHistogramProbeTest.java b/harness/src/test/java/org/apache/geode/perftest/yardstick/hdrhistogram/HdrHistogramProbeTest.java
index 80ba7f3..356577e 100644
--- a/harness/src/test/java/org/apache/geode/perftest/yardstick/hdrhistogram/HdrHistogramProbeTest.java
+++ b/harness/src/test/java/org/apache/geode/perftest/yardstick/hdrhistogram/HdrHistogramProbeTest.java
@@ -34,17 +34,17 @@
 
   private HdrHistogramProbe probe;
   private Clock clock;
-  private Consumer consumer;
 
   @BeforeEach
   public void setUp() {
     clock = mock(Clock.class);
-    consumer = mock(Consumer.class);
+    @SuppressWarnings("unchecked")
+    final Consumer<Histogram> consumer = mock(Consumer.class);
     probe = new HdrHistogramProbe(1, 3_600_000, 3, clock, consumer);
   }
 
   @Test
-  public void recordsASingleValue() throws InterruptedException {
+  public void recordsASingleValue() {
     probe.start(8);
     when(clock.currentTimeNanos()).thenReturn(0L);
     probe.beforeExecute(1);
@@ -83,7 +83,7 @@
   }
 
   @Test
-  public void generatesASummaryBenchmarkPoint() throws Exception {
+  public void generatesASummaryBenchmarkPoint() {
     probe.start(1);
     when(clock.currentTimeNanos()).thenReturn(0L);
     probe.beforeExecute(0);
@@ -100,7 +100,7 @@
     assertEquals(1, points.size());
     BenchmarkProbePoint point = points.iterator().next();
 
-    assertEquals(0, point.time());
+    assertEquals(probe.getHistogram().getStartTimeStamp(), point.time());
     Assertions.assertThat(point.values()).containsExactly(3.0, 4.0);
   }
 }
diff --git a/infrastructure/build.gradle b/infrastructure/build.gradle
index 41f3a71..a9b9a8b 100644
--- a/infrastructure/build.gradle
+++ b/infrastructure/build.gradle
@@ -36,6 +36,11 @@
   imports { mavenBom 'software.amazon.awssdk:bom:' + project.'software-amazon-awssdk.version' }
 }
 
+compileJava {
+  options.compilerArgs << '-Xlint:unchecked' << "-Werror"
+  options.deprecation = true
+}
+
 task(launchCluster, dependsOn: 'classes', type: JavaExec) {
   main = 'org.apache.geode.infrastructure.aws.LaunchCluster'
   workingDir = rootDir
@@ -43,7 +48,6 @@
 
   systemProperty 'TEST_CI', project.findProperty('ci')
   systemProperty 'PURPOSE', project.findProperty('purpose')
-
 }
 
 task(destroyCluster, dependsOn: 'classes', type: JavaExec) {
diff --git a/infrastructure/scripts/aws/image/files/defaults.cfg b/infrastructure/scripts/aws/image/files/defaults.cfg
index 9969787..9861fb5 100644
--- a/infrastructure/scripts/aws/image/files/defaults.cfg
+++ b/infrastructure/scripts/aws/image/files/defaults.cfg
@@ -1,3 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
 #cloud-config
 system_info:
   default_user:
diff --git a/infrastructure/scripts/aws/run_against_baseline.sh b/infrastructure/scripts/aws/run_against_baseline.sh
index e24584d..65a6fe9 100755
--- a/infrastructure/scripts/aws/run_against_baseline.sh
+++ b/infrastructure/scripts/aws/run_against_baseline.sh
@@ -33,7 +33,7 @@
 DEFAULT_BASELINE_REPO='apache/geode'
 DEFAULT_BASELINE_REPO_URL="https://github.com/${DEFAULT_BASELINE_REPO}"
 BASELINE_REPO=${DEFAULT_BASELINE_REPO}
-DEFAULT_BASELINE_VERSION=1.8.0
+DEFAULT_BASELINE_VERSION=1.13.0
 BASELINE_VERSION=${DEFAULT_BASELINE_VERSION}
 
 TAG=
@@ -153,11 +153,7 @@
   exit 1
 fi
 
-if [ ! -z "${OUTPUT}" ]; then
-  OUTPUT="${OUTPUT}-"
-fi
-
-OUTPUT="${OUTPUT}output-${DATE}-${TAG}"
+OUTPUT="${OUTPUT:-output-${DATE}-${TAG}}"
 
 set -x
 if ! [[ "$OUTPUT" = /* ]]; then
diff --git a/settings.gradle b/settings.gradle
index 69d363e..458e71c 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -20,4 +20,4 @@
 include 'harness'
 include 'geode-benchmarks'
 include 'infrastructure'
-
+include 'cryptoinfo'