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

[geode] branch feature/Micrometer updated: More stats fixes

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

udo pushed a commit to branch feature/Micrometer
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/feature/Micrometer by this push:
     new 714c460  More stats fixes
714c460 is described below

commit 714c460e29b7975ed64535aaceb408294696a558
Author: Udo Kohlmeyer <uk...@pivotal.io>
AuthorDate: Tue Sep 11 15:54:53 2018 -0700

    More stats fixes
---
 .../statistics/StatisticsDistributedTest.java      |   9 +-
 .../AutoConnectionSourceImplJUnitTest.java         |   3 +-
 .../internal/cache/DiskInitFileJUnitTest.java      |  20 +-
 .../GemFireStatSamplerIntegrationTest.java         |   2 +-
 .../SimpleStatSamplerIntegrationTest.java          |   2 +-
 .../management/bean/stats/DiskStatsJUnitTest.java  |   2 +-
 .../bean/stats/GatewayMBeanBridgeJUnitTest.java    |   3 +-
 .../bean/stats/GatewayReceiverStatsJUnitTest.java  |   2 +-
 .../bean/stats/MemberLevelStatsJUnitTest.java      |  14 +-
 .../bean/stats/RegionStatsJUnitTest.java           |   6 +-
 .../internal/beans/ManagementAdapterTest.java      |   3 +-
 .../cache/client/internal/EndpointManagerImpl.java |   8 +-
 .../geode/cache/client/internal/PoolImpl.java      |  18 +-
 .../internal/ClusterDistributionManager.java       |   2 +-
 .../internal/InternalDistributedSystem.java        |  10 +-
 .../distributed/internal/InternalLocator.java      |   2 +-
 .../distributed/internal/locks/DLockService.java   |   4 +-
 .../geode/internal/cache/DirectoryHolder.java      |   9 +-
 .../apache/geode/internal/cache/DiskStoreImpl.java |   5 +-
 .../geode/internal/cache/GemFireCacheImpl.java     |   2 +-
 .../apache/geode/internal/cache/LocalRegion.java   |   2 -
 .../cache/OfflineCompactionDiskRegion.java         |   3 +-
 .../geode/internal/cache/PartitionedRegion.java    |   5 +-
 .../internal/cache/PartitionedRegionDataStore.java |   1 -
 .../internal/cache/PartitionedRegionHelper.java    |   3 +-
 .../geode/internal/cache/ValidatingDiskRegion.java |   4 +-
 .../cache/control/InternalResourceManager.java     |   3 +-
 .../cache/eviction/AbstractEvictionController.java |   6 +-
 .../geode/internal/cache/ha/HARegionQueue.java     |   5 +-
 .../internal/cache/tier/sockets/AcceptorImpl.java  | 409 +++++++++------------
 .../cache/tier/sockets/CacheClientUpdater.java     |   3 +-
 .../internal/cache/wan/AbstractGatewaySender.java  |   6 +-
 .../geode/internal/offheap/OffHeapStorage.java     |  15 +-
 .../geode/internal/statistics/CallbackSampler.java |   4 +-
 .../statistics/DummyStatisticsFactory.java         |  23 +-
 .../statistics/GFSStatisticsFactoryImpl.java       |  19 +-
 .../internal/statistics/GemFireStatSampler.java    |  69 ++--
 .../geode/internal/statistics/HostStatSampler.java |  12 +-
 .../statistics/InternalDistributedSystemStats.java |  47 ++-
 .../internal/statistics/SimpleStatSampler.java     |   2 +-
 ...SamplerStats.java => StatSamplerStatsImpl.java} |  44 ++-
 .../statistics/VMStatsContractFactory.java         |  15 +-
 .../statistics/{VMStats.java => VMStatsImpl.java}  |   9 +-
 .../apache/geode/internal/stats50/VMStats50.java   |   7 +-
 .../management/internal/FederatingManager.java     |   4 +-
 .../geode/management/internal/LocalManager.java    |   3 +-
 .../internal/beans/MemberMBeanBridge.java          |   8 +-
 .../ParallelQueueRemovalMessageJUnitTest.java      |   6 +-
 .../internal/offheap/OffHeapStorageJUnitTest.java  |  16 +-
 .../internal/statistics/CallbackSamplerTest.java   |   2 +-
 .../geode/cache/query/internal/cq/CqQueryImpl.java |   7 +-
 .../cache/query/internal/cq/CqServiceImpl.java     |   4 +-
 .../cache/query/internal/cq/CqStatisticsImpl.java  |   3 +-
 .../java/org/apache/geode/test/fake/Fakes.java     |  10 +-
 .../statistics/MicrometerStatSamplerStatsImpl.kt   |  90 +++++
 .../micrometer/MicrometerStatisticsFactoryImpl.kt  |   8 +
 .../MicrometerResourceManagerStats.kt              |   2 +-
 .../geode/internal/statistics/StatSampleStats.java |  23 ++
 .../apache/geode/internal/statistics/VMStats.java  |   6 +-
 .../stats/common/statistics/StatisticsFactory.java |  83 +++--
 .../common/statistics/factory/StatsFactory.java    |   9 +-
 61 files changed, 606 insertions(+), 520 deletions(-)

diff --git a/geode-core/src/distributedTest/java/org/apache/geode/internal/statistics/StatisticsDistributedTest.java b/geode-core/src/distributedTest/java/org/apache/geode/internal/statistics/StatisticsDistributedTest.java
index c231890..7a91c18 100755
--- a/geode-core/src/distributedTest/java/org/apache/geode/internal/statistics/StatisticsDistributedTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/internal/statistics/StatisticsDistributedTest.java
@@ -287,10 +287,10 @@ public class StatisticsDistributedTest extends JUnit4CacheTestCase {
               assertEquals(1, statsArray.length);
 
               Statistics statSamplerStats = statsArray[0];
-              int initialSampleCount = statSamplerStats.getInt(StatSamplerStats.SAMPLE_COUNT);
+              int initialSampleCount = statSamplerStats.getInt(StatSamplerStatsImpl.SAMPLE_COUNT);
 
               await("awaiting sampleCount >= 2").atMost(30, SECONDS).until(() -> statSamplerStats
-                  .getInt(StatSamplerStats.SAMPLE_COUNT) >= initialSampleCount + 2);
+                  .getInt(StatSamplerStatsImpl.SAMPLE_COUNT) >= initialSampleCount + 2);
             });
       }
 
@@ -311,10 +311,11 @@ public class StatisticsDistributedTest extends JUnit4CacheTestCase {
       assertEquals(1, statsArray.length);
 
       Statistics statSamplerStats = statsArray[0];
-      int initialSampleCount = statSamplerStats.getInt(StatSamplerStats.SAMPLE_COUNT);
+      int initialSampleCount = statSamplerStats.getInt(StatSamplerStatsImpl.SAMPLE_COUNT);
 
       await("awaiting sampleCount >= 2").atMost(30, SECONDS).until(
-          () -> statSamplerStats.getInt(StatSamplerStats.SAMPLE_COUNT) >= initialSampleCount + 2);
+          () -> statSamplerStats.getInt(StatSamplerStatsImpl.SAMPLE_COUNT) >= initialSampleCount
+              + 2);
 
       // now post total updateEvents to static
       PubSubStats statistics = subStatsRef.get();
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImplJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImplJUnitTest.java
index 4c12d4a..0033078 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImplJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/cache/client/internal/AutoConnectionSourceImplJUnitTest.java
@@ -111,8 +111,7 @@ public class AutoConnectionSourceImplJUnitTest {
     DistributedSystem distributedSystem = DistributedSystem.connect(props);
     cache = CacheFactory.create(distributedSystem);
     poolStats =
-        StatsFactory.createStatsImpl(PoolStats.class, distributedSystem.getStatisticsFactory(),
-            "pool");
+        StatsFactory.createStatsImpl(PoolStats.class, "pool");
     port = AvailablePortHelper.getRandomAvailableTCPPort();
 
     handler = new FakeHandler();
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/DiskInitFileJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/DiskInitFileJUnitTest.java
index 6e8b942..39b3244 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/DiskInitFileJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/cache/DiskInitFileJUnitTest.java
@@ -31,7 +31,6 @@ import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 
 import org.apache.geode.internal.cache.persistence.DiskRegionView;
-import org.apache.geode.stats.common.statistics.StatisticsFactory;
 
 public class DiskInitFileJUnitTest {
 
@@ -56,21 +55,13 @@ public class DiskInitFileJUnitTest {
    */
   @Test
   public void testCanonicalIds() {
-    // create a mock statistics factory for creating directory holders
-    final StatisticsFactory sf = context.mock(StatisticsFactory.class);
-    context.checking(new Expectations() {
-      {
-        ignoring(sf);
-      }
-    });
-
     // Create a mock disk store impl. All we need to do is return
     // this init file directory.
     final DiskStoreImpl parent = context.mock(DiskStoreImpl.class);
     context.checking(new Expectations() {
       {
         allowing(parent).getInfoFileDir();
-        will(returnValue(new DirectoryHolder(sf, testDirectory, 0, 0)));
+        will(returnValue(new DirectoryHolder(testDirectory, 0, 0)));
         ignoring(parent);
       }
     });
@@ -120,13 +111,6 @@ public class DiskInitFileJUnitTest {
 
   @Test
   public void testKrfIds() {
-    // create a mock statistics factory for creating directory holders
-    final StatisticsFactory sf = context.mock(StatisticsFactory.class);
-    context.checking(new Expectations() {
-      {
-        ignoring(sf);
-      }
-    });
     // Add a mock region to the init file so it doesn't
     // delete the file when the init file is closed
     final DiskRegionView drv = context.mock(DiskRegionView.class);
@@ -141,7 +125,7 @@ public class DiskInitFileJUnitTest {
     context.checking(new Expectations() {
       {
         allowing(parent).getInfoFileDir();
-        will(returnValue(new DirectoryHolder(sf, testDirectory, 0, 0)));
+        will(returnValue(new DirectoryHolder(testDirectory, 0, 0)));
         ignoring(parent);
       }
     });
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/statistics/GemFireStatSamplerIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/statistics/GemFireStatSamplerIntegrationTest.java
index de3f409..491030f 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/statistics/GemFireStatSamplerIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/statistics/GemFireStatSamplerIntegrationTest.java
@@ -128,7 +128,7 @@ public class GemFireStatSamplerIntegrationTest extends StatSamplerTestCase {
     Assert.assertEquals(SocketCreator.getHostName(SocketCreator.getLocalHost()),
         statSampler.getSystemDirectoryPath());
 
-    VMStatsContract vmStats = statSampler.getVMStats();
+    VMStats vmStats = statSampler.getVMStats();
     assertNotNull(vmStats);
     assertTrue(vmStats instanceof VMStats50);
     /*
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/internal/statistics/SimpleStatSamplerIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/internal/statistics/SimpleStatSamplerIntegrationTest.java
index 951e015..8f2326b 100755
--- a/geode-core/src/integrationTest/java/org/apache/geode/internal/statistics/SimpleStatSamplerIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/internal/statistics/SimpleStatSamplerIntegrationTest.java
@@ -104,7 +104,7 @@ public class SimpleStatSamplerIntegrationTest extends StatSamplerTestCase {
     assertEquals(SocketCreator.getHostName(SocketCreator.getLocalHost()),
         statSampler.getSystemDirectoryPath());
 
-    VMStatsContract vmStats = statSampler.getVMStats();
+    VMStats vmStats = statSampler.getVMStats();
     assertNotNull(vmStats);
     assertTrue(vmStats instanceof VMStats50);
     /*
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/DiskStatsJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/DiskStatsJUnitTest.java
index 8c5f384..b7bea98 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/DiskStatsJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/DiskStatsJUnitTest.java
@@ -38,7 +38,7 @@ public class DiskStatsJUnitTest extends MBeanStatsTestCase {
 
   public void init() {
     diskStoreStats =
-        StatsFactory.createStatsImpl(DiskStoreStats.class, system.getStatisticsFactory(), "test");
+        StatsFactory.createStatsImpl(DiskStoreStats.class, "test");
 
     bridge = new DiskStoreMBeanBridge();
     bridge.addDiskStoreStats(diskStoreStats);
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/GatewayMBeanBridgeJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/GatewayMBeanBridgeJUnitTest.java
index c72b40d..f15d996 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/GatewayMBeanBridgeJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/GatewayMBeanBridgeJUnitTest.java
@@ -40,8 +40,7 @@ public class GatewayMBeanBridgeJUnitTest extends MBeanStatsTestCase {
   private AbstractGatewaySender sender;
 
   public void init() {
-    senderStats = StatsFactory.createStatsImpl(GatewaySenderStats.class,
-        system.getStatisticsFactory(), "test");
+    senderStats = StatsFactory.createStatsImpl(GatewaySenderStats.class, "test");
 
     sender = Mockito.mock(AbstractGatewaySender.class);
     Mockito.when(sender.getStatistics()).thenReturn(senderStats);
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/GatewayReceiverStatsJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/GatewayReceiverStatsJUnitTest.java
index eeb69a6..4327d37 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/GatewayReceiverStatsJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/GatewayReceiverStatsJUnitTest.java
@@ -35,7 +35,7 @@ public class GatewayReceiverStatsJUnitTest extends MBeanStatsTestCase {
 
   public void init() {
     receiverStats =
-        StatsFactory.createStatsImpl(GatewayReceiverStats.class, null, "Test Sock Name");
+        StatsFactory.createStatsImpl(GatewayReceiverStats.class, "Test Sock Name");
 
     bridge = new GatewayReceiverMBeanBridge();
     bridge.addGatewayReceiverStats(receiverStats);
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/MemberLevelStatsJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/MemberLevelStatsJUnitTest.java
index f42d006..aca5709 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/MemberLevelStatsJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/MemberLevelStatsJUnitTest.java
@@ -31,7 +31,7 @@ import org.apache.geode.internal.NanoTimer;
 import org.apache.geode.internal.OSProcess;
 import org.apache.geode.internal.cache.GemFireCacheImpl;
 import org.apache.geode.internal.cache.execute.FunctionServiceStats;
-import org.apache.geode.internal.statistics.VMStatsContract;
+import org.apache.geode.internal.statistics.VMStats;
 import org.apache.geode.internal.stats50.VMStats50;
 import org.apache.geode.management.ManagementService;
 import org.apache.geode.management.internal.beans.MemberMBeanBridge;
@@ -68,14 +68,14 @@ public class MemberLevelStatsJUnitTest extends MBeanStatsTestCase {
 
   public void init() {
     cachePerfStats =
-        StatsFactory.createStatsImpl(CachePerfStats.class, system.getStatisticsFactory(), null);
+        StatsFactory.createStatsImpl(CachePerfStats.class, null);
     funcServiceStats = new FunctionServiceStats(system.getStatisticsFactory(), "FunctionExecution");
     long statId = OSProcess.getId();
     distributionStats =
-        StatsFactory.createStatsImpl(DistributionStats.class, system.getStatisticsFactory(),
+        StatsFactory.createStatsImpl(DistributionStats.class,
             String.valueOf(statId));
     DistributionStatsImpl.enableClockStats = true;
-    dlockStats = StatsFactory.createStatsImpl(DLockStats.class, system.getStatisticsFactory(),
+    dlockStats = StatsFactory.createStatsImpl(DLockStats.class,
         String.valueOf(statId));
 
     bridge = new MemberMBeanBridge();
@@ -85,7 +85,7 @@ public class MemberLevelStatsJUnitTest extends MBeanStatsTestCase {
     bridge.addLockServiceStats(dlockStats);
 
 
-    VMStatsContract vmstats =
+    VMStats vmstats =
         system.getInternalDistributedSystemStats().getStatSampler().getVMStats();
     assertTrue(vmstats instanceof VMStats50);
 
@@ -94,7 +94,7 @@ public class MemberLevelStatsJUnitTest extends MBeanStatsTestCase {
 
     for (int i = 0; i < 4; i++) {
       DiskStoreStats stats =
-          StatsFactory.createStatsImpl(DiskStoreStats.class, system.getStatisticsFactory(),
+          StatsFactory.createStatsImpl(DiskStoreStats.class,
               name.getMethodName() + i);
       diskStatsList.add(stats);
       bridge.addDiskStoreStats(stats);
@@ -102,7 +102,7 @@ public class MemberLevelStatsJUnitTest extends MBeanStatsTestCase {
 
     for (int i = 0; i < 4; i++) {
       PartitionedRegionStats stats = StatsFactory.createStatsImpl(PartitionedRegionStats.class,
-          system.getStatisticsFactory(), name.getMethodName() + i);
+          name.getMethodName() + i);
       parRegionStatsList.add(stats);
       bridge.addPartionRegionStats(stats);
     }
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/RegionStatsJUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/RegionStatsJUnitTest.java
index 2e25835..859d149 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/RegionStatsJUnitTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/management/bean/stats/RegionStatsJUnitTest.java
@@ -48,13 +48,13 @@ public class RegionStatsJUnitTest extends MBeanStatsTestCase {
   private DiskRegionStats diskRegionStats;
 
   protected void init() {
-    cachePerfStats = StatsFactory.createCachePerfStatsImpl(system.getStatisticsFactory(), null);
+    cachePerfStats = StatsFactory.createCachePerfStatsImpl(null);
     partitionedRegionStats =
         StatsFactory
-            .createStatsImpl(PartitionedRegionStats.class, system.getStatisticsFactory(), "/tests");
+            .createStatsImpl(PartitionedRegionStats.class, "/tests");
     diskRegionStats =
         StatsFactory
-            .createStatsImpl(DiskRegionStats.class, system.getStatisticsFactory(), "test-disk");
+            .createStatsImpl(DiskRegionStats.class, "test-disk");
 
     bridge = new RegionMBeanBridge(cachePerfStats);
     parBridge = new PartitionedRegionBridge(partitionedRegionStats);
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/management/internal/beans/ManagementAdapterTest.java b/geode-core/src/integrationTest/java/org/apache/geode/management/internal/beans/ManagementAdapterTest.java
index 5dac407..970015b 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/management/internal/beans/ManagementAdapterTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/management/internal/beans/ManagementAdapterTest.java
@@ -53,8 +53,7 @@ public class ManagementAdapterTest {
   @Before
   public void before() {
     cache = serverRule.getCache();
-    doReturn(StatsFactory.createStatsImpl(DiskStoreStats.class,
-        cache.getInternalDistributedSystem().getStatisticsFactory(), "disk-stats")).when(diskStore)
+    doReturn(StatsFactory.createStatsImpl(DiskStoreStats.class, "disk-stats")).when(diskStore)
             .getStats();
     doReturn(new File[] {}).when(diskStore).getDiskDirs();
   }
diff --git a/geode-core/src/main/java/org/apache/geode/cache/client/internal/EndpointManagerImpl.java b/geode-core/src/main/java/org/apache/geode/cache/client/internal/EndpointManagerImpl.java
index 4886ca5..1ab6b0f 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/client/internal/EndpointManagerImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/client/internal/EndpointManagerImpl.java
@@ -32,7 +32,6 @@ import org.apache.geode.distributed.DistributedSystem;
 import org.apache.geode.distributed.internal.ServerLocation;
 import org.apache.geode.internal.cache.tier.InternalClientMembership;
 import org.apache.geode.internal.logging.LogService;
-import org.apache.geode.internal.statistics.DummyStatisticsFactory;
 import org.apache.geode.stats.common.cache.client.internal.ConnectionStats;
 import org.apache.geode.stats.common.internal.cache.PoolStats;
 import org.apache.geode.stats.common.statistics.factory.StatsFactory;
@@ -222,14 +221,11 @@ public class EndpointManagerImpl implements EndpointManager {
       PoolImpl pool = (PoolImpl) PoolManager.find(this.poolName);
       if (pool != null) {
         if (pool.getGatewaySender() != null) {
-          stats = StatsFactory.createConnectionStatsImpl(
-              new DummyStatisticsFactory(distributedSystem.getStatisticsFactory()), statName,
-              this.poolStats);
+          stats = StatsFactory.createConnectionStatsImpl(statName, this.poolStats);
         }
       }
       if (stats == null) {
-        stats = StatsFactory.createConnectionStatsImpl(distributedSystem.getStatisticsFactory(),
-            statName, this.poolStats);
+        stats = StatsFactory.createConnectionStatsImpl(statName, this.poolStats);
       }
       statMap.put(location, stats);
     }
diff --git a/geode-core/src/main/java/org/apache/geode/cache/client/internal/PoolImpl.java b/geode-core/src/main/java/org/apache/geode/cache/client/internal/PoolImpl.java
index 246097a..534099d 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/client/internal/PoolImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/client/internal/PoolImpl.java
@@ -65,9 +65,7 @@ import org.apache.geode.internal.logging.InternalLogWriter;
 import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.internal.logging.log4j.LocalizedMessage;
 import org.apache.geode.internal.monitoring.ThreadsMonitoring;
-import org.apache.geode.internal.statistics.DummyStatisticsFactory;
 import org.apache.geode.stats.common.internal.cache.PoolStats;
-import org.apache.geode.stats.common.statistics.StatisticsFactory;
 import org.apache.geode.stats.common.statistics.factory.StatsFactory;
 
 /**
@@ -243,16 +241,16 @@ public class PoolImpl implements InternalPool {
     } else {
       this.proxyId = ClientProxyMembershipID.getNewProxyMembership(this.internalDistributedSystem);
     }
-    StatisticsFactory statFactory = null;
-    if (this.gatewaySender != null) {
-      statFactory =
-          new DummyStatisticsFactory(this.internalDistributedSystem.getStatisticsFactory());
-    } else {
-      statFactory = this.internalDistributedSystem.getInternalDistributedSystemStats();
-    }
+    // StatisticsFactory statFactory = null;
+    // if (this.gatewaySender != null) {
+    // statFactory =
+    // new DummyStatisticsFactory(this.internalDistributedSystem.getStatisticsFactory());
+    // } else {
+    // statFactory = this.internalDistributedSystem.getInternalDistributedSystemStats();
+    // }
     this.stats =
         this.startDisabled ? null
-            : StatsFactory.createStatsImpl(PoolStats.class, statFactory, getName() + "->"
+            : StatsFactory.createStatsImpl(PoolStats.class, getName() + "->"
                 + (isEmpty(serverGroup) ? "[any servers]" : "[" + getServerGroup() + "]"));
 
     source = getSourceImpl(((PoolFactoryImpl.PoolAttributes) attributes).locatorCallback);
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/ClusterDistributionManager.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/ClusterDistributionManager.java
index 41e25da..30e7472 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/ClusterDistributionManager.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/ClusterDistributionManager.java
@@ -711,7 +711,7 @@ public class ClusterDistributionManager implements DistributionManager {
 
     long statId = OSProcess.getId();
     this.stats = StatsFactory
-        .createStatsImpl(DistributionStats.class, system.getStatisticsFactory(),
+        .createStatsImpl(DistributionStats.class,
             String.valueOf(statId));
     DistributionStatsImpl.enableClockStats = system.getConfig().getEnableTimeStatistics();
 
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java
index 00ff36d..e99bc2a 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalDistributedSystem.java
@@ -102,7 +102,6 @@ import org.apache.geode.management.ManagementException;
 import org.apache.geode.security.GemFireSecurityException;
 import org.apache.geode.security.PostProcessor;
 import org.apache.geode.security.SecurityManager;
-import org.apache.geode.statistics.micrometer.MicrometerStatisticsFactoryImpl;
 import org.apache.geode.stats.common.distributed.internal.DMStats;
 import org.apache.geode.stats.common.statistics.Statistics;
 import org.apache.geode.stats.common.statistics.StatisticsFactory;
@@ -613,9 +612,7 @@ public class InternalDistributedSystem extends DistributedSystem {
 
   private void initializeStats() {
     this.internalDistributedSystemStats =
-        InternalDistributedSystemStats.createInstance(this.statsDisabled, this.getConfig(),
-            // this,new StatisticsTypeFactoryImpl());
-            this, new MicrometerStatisticsFactoryImpl());
+        InternalDistributedSystemStats.createInstance(this.statsDisabled, this.getConfig(), this);
   }
 
 
@@ -723,8 +720,7 @@ public class InternalDistributedSystem extends DistributedSystem {
 
       this.offHeapStore =
           OffHeapStorage
-              .createOffHeapStorage(this.getInternalDistributedSystemStats(), offHeapMemorySize,
-                  this);
+              .createOffHeapStorage(offHeapMemorySize, this);
 
       // Note: this can only happen on a linux system
       if (getConfig().getLockMemory()) {
@@ -2788,7 +2784,7 @@ public class InternalDistributedSystem extends DistributedSystem {
 
   @Override
   public StatisticsFactory getStatisticsFactory() {
-    return getInternalDistributedSystemStats();
+    return getInternalDistributedSystemStats().getStatisticsFactory();
   }
 
   @Override
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java
index cc84b67..96434ae 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/InternalLocator.java
@@ -485,7 +485,7 @@ public class InternalLocator extends Locator implements ConnectListener {
 
     ThreadGroup group = LoggingThreadGroup.createThreadGroup("Distribution locators", logger);
     this.stats =
-        StatsFactory.createStatsImpl(LocatorStats.class, null, (hostnameForClients + port));
+        StatsFactory.createStatsImpl(LocatorStats.class, (hostnameForClients + port));
 
     this.server = new TcpServerFactory().makeTcpServer(port, this.bindAddress, null, this.config,
         this.handler, new DelayedPoolStatHelper(), group, this.toString(), this);
diff --git a/geode-core/src/main/java/org/apache/geode/distributed/internal/locks/DLockService.java b/geode-core/src/main/java/org/apache/geode/distributed/internal/locks/DLockService.java
index d0f1c2b..d4c9cf9 100644
--- a/geode-core/src/main/java/org/apache/geode/distributed/internal/locks/DLockService.java
+++ b/geode-core/src/main/java/org/apache/geode/distributed/internal/locks/DLockService.java
@@ -62,7 +62,6 @@ import org.apache.geode.internal.logging.log4j.LogMarker;
 import org.apache.geode.internal.util.StopWatch;
 import org.apache.geode.internal.util.concurrent.FutureResult;
 import org.apache.geode.stats.common.distributed.internal.locks.DLockStats;
-import org.apache.geode.stats.common.statistics.StatisticsFactory;
 import org.apache.geode.stats.common.statistics.factory.StatsFactory;
 
 /**
@@ -2909,9 +2908,8 @@ public class DLockService extends DistributedLockService {
       DistributedSystem distributedSystem) {
     if (stats == DUMMY_STATS) {
       Assert.assertTrue(distributedSystem != null, "Need an instance of InternalDistributedSystem");
-      StatisticsFactory statFactory = distributedSystem.getStatisticsFactory();
       long statId = OSProcess.getId();
-      stats = StatsFactory.createStatsImpl(DLockStats.class, statFactory, String.valueOf(statId));
+      stats = StatsFactory.createStatsImpl(DLockStats.class, String.valueOf(statId));
     }
     return stats;
   }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/DirectoryHolder.java b/geode-core/src/main/java/org/apache/geode/internal/cache/DirectoryHolder.java
index 59e6336..21ed635 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/DirectoryHolder.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/DirectoryHolder.java
@@ -18,7 +18,6 @@ import java.io.File;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.geode.stats.common.internal.cache.DiskDirectoryStats;
-import org.apache.geode.stats.common.statistics.StatisticsFactory;
 import org.apache.geode.stats.common.statistics.factory.StatsFactory;
 
 /**
@@ -46,11 +45,11 @@ public class DirectoryHolder {
   /** For testing purposes we can set the disk directory size in bytes **/
   static boolean SET_DIRECTORY_SIZE_IN_BYTES_FOR_TESTING_PURPOSES = false;
 
-  DirectoryHolder(StatisticsFactory factory, File dir, long space, int index) {
-    this(dir.getPath(), factory, dir, space, index);
+  DirectoryHolder(File dir, long space, int index) {
+    this(dir.getPath(), dir, space, index);
   }
 
-  DirectoryHolder(String ownersName, StatisticsFactory factory, File dir, long space, int index) {
+  DirectoryHolder(String ownersName, File dir, long space, int index) {
     this.dir = dir;
     if (SET_DIRECTORY_SIZE_IN_BYTES_FOR_TESTING_PURPOSES) {
       this.capacity = space;
@@ -59,7 +58,7 @@ public class DirectoryHolder {
       this.capacity = space * 1024 * 1024;
     }
     this.index = index;
-    this.dirStats = StatsFactory.createStatsImpl(DiskDirectoryStats.class, factory, ownersName);
+    this.dirStats = StatsFactory.createStatsImpl(DiskDirectoryStats.class, ownersName);
     this.dirStats.setMaxSpace(this.capacity);
   }
 
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/DiskStoreImpl.java b/geode-core/src/main/java/org/apache/geode/internal/cache/DiskStoreImpl.java
index 5208de9..6f20c2d 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/DiskStoreImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/DiskStoreImpl.java
@@ -421,8 +421,7 @@ public class DiskStoreImpl implements DiskStore {
     this.criticalPercent = props.getDiskUsageCriticalPercentage();
 
     this.cache = cache;
-    StatisticsFactory factory = cache.getDistributedSystem().getStatisticsFactory();
-    this.stats = StatsFactory.createStatsImpl(DiskStoreStats.class, factory, getName());
+    this.stats = StatsFactory.createStatsImpl(DiskStoreStats.class, getName());
 
     // start simple init
 
@@ -457,7 +456,7 @@ public class DiskStoreImpl implements DiskStore {
     long tempMaxDirSize = 0;
     for (int i = 0; i < length; i++) {
       directories[i] =
-          new DirectoryHolder(getName() + "_DIR#" + i, factory, dirs[i], dirSizes[i], i);
+          new DirectoryHolder(getName() + "_DIR#" + i, dirs[i], dirSizes[i], i);
 
       if (tempMaxDirSize < dirSizes[i]) {
         tempMaxDirSize = dirSizes[i];
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java b/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java
index 1e79af1..3215b76 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/GemFireCacheImpl.java
@@ -932,7 +932,7 @@ public class GemFireCacheImpl implements InternalCache, InternalClientCache, Has
 
       // Create the CacheStatistics
       this.cachePerfStats =
-          StatsFactory.createStatsImpl(CachePerfStats.class, system.getStatisticsFactory(), null);
+          StatsFactory.createStatsImpl(CachePerfStats.class, null);
       CachePerfStatsImpl.enableClockStats = this.system.getConfig().getEnableTimeStatistics();
 
       this.transactionManager = new TXManagerImpl(this.cachePerfStats, this);
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java
index 2e2a9d2..fb1c6be 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java
@@ -656,7 +656,6 @@ public class LocalRegion extends AbstractRegion implements LoaderHelperFactory,
         this.hasOwnStats = true;
         this.cachePerfStats =
             StatsFactory.createRegionPerfStatsImplFromClass(RegionPerfStats.class,
-                cache.getInternalDistributedSystem().getStatisticsFactory(),
                 cache.getCachePerfStats(), regionName);
       }
     }
@@ -7730,7 +7729,6 @@ public class LocalRegion extends AbstractRegion implements LoaderHelperFactory,
       stats =
           StatsFactory
               .createStatsImpl(DiskRegionStats.class,
-                  getCache().getDistributedSystem().getStatisticsFactory(),
                   getFullPath());
     }
 
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/OfflineCompactionDiskRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/OfflineCompactionDiskRegion.java
index 9f6f944..1cf8c1f 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/OfflineCompactionDiskRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/OfflineCompactionDiskRegion.java
@@ -29,8 +29,7 @@ import org.apache.geode.stats.common.statistics.factory.StatsFactory;
 public class OfflineCompactionDiskRegion extends DiskRegion implements DiskRecoveryStore {
   private OfflineCompactionDiskRegion(DiskStoreImpl ds, DiskRegionView drv) {
     super(ds, drv.getName(), drv.isBucket(), true, false, true,
-        StatsFactory.createStatsImpl(DiskRegionStats.class,
-            ds.getCache().getDistributedSystem().getStatisticsFactory(), drv.getName()),
+        StatsFactory.createStatsImpl(DiskRegionStats.class, drv.getName()),
         new DummyCancelCriterion(), new DummyDiskExceptionHandler(), null, drv.getFlags(),
         drv.getPartitionName(), drv.getStartingBucketId(), drv.getCompressorClassName(),
         drv.getOffHeap());
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
index c9e4a11..c354b41 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegion.java
@@ -758,8 +758,7 @@ public class PartitionedRegion extends LocalRegion
     super(regionName, regionAttributes, parentRegion, cache, internalRegionArgs);
 
     this.node = initializeNode();
-    this.prStats = StatsFactory.createStatsImpl(PartitionedRegionStats.class,
-        cache.getDistributedSystem().getStatisticsFactory(), getFullPath());
+    this.prStats = StatsFactory.createStatsImpl(PartitionedRegionStats.class, getFullPath());
     this.regionIdentifier = getFullPath().replace('/', '#');
 
     if (logger.isDebugEnabled()) {
@@ -853,7 +852,7 @@ public class PartitionedRegion extends LocalRegion
       StatisticsFactory statisticsFactory =
           this.getCache().getDistributedSystem().getStatisticsFactory();
       this.diskRegionStats =
-          StatsFactory.createStatsImpl(DiskRegionStats.class, statisticsFactory, getFullPath());
+          StatsFactory.createStatsImpl(DiskRegionStats.class, getFullPath());
     } else {
       this.diskRegionStats = null;
     }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionDataStore.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionDataStore.java
index 24f83af..3a2501e 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionDataStore.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionDataStore.java
@@ -212,7 +212,6 @@ public class PartitionedRegionDataStore implements HasCachePerfStats {
     // this.bucketStats = new CachePerfStats(pr.getSystem(), "partition-" + pr.getName());
     this.bucketStats =
         StatsFactory.createRegionPerfStatsImplFromClass(RegionPerfStats.class,
-            pr.getCache().getInternalDistributedSystem().getStatisticsFactory(),
             pr.getCachePerfStats(), "dataStorRegion-" + pr.getName());
     this.keysOfInterest = new ConcurrentHashMap();
   }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionHelper.java b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionHelper.java
index e80d146..49de9b4 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionHelper.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/PartitionedRegionHelper.java
@@ -262,8 +262,7 @@ public class PartitionedRegionHelper {
       RegionAttributes ra = factory.create();
       // Create anonymous stats holder for Partitioned Region meta data
       final HasCachePerfStats prMetaStatsHolder =
-          () -> StatsFactory.createStatsImpl(CachePerfStats.class,
-              cache.getDistributedSystem().getStatisticsFactory(), "partitionMetaData");
+          () -> StatsFactory.createStatsImpl(CachePerfStats.class, "partitionMetaData");
 
       try {
         root = (DistributedRegion) cache.createVMRegion(PR_ROOT_REGION_NAME, ra,
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/ValidatingDiskRegion.java b/geode-core/src/main/java/org/apache/geode/internal/cache/ValidatingDiskRegion.java
index 9aa1d15..a443771 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/ValidatingDiskRegion.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/ValidatingDiskRegion.java
@@ -51,9 +51,7 @@ import org.apache.geode.stats.common.statistics.factory.StatsFactory;
 public class ValidatingDiskRegion extends DiskRegion implements DiskRecoveryStore {
   protected ValidatingDiskRegion(DiskStoreImpl diskStore, DiskRegionView diskRegionView) {
     super(diskStore, diskRegionView.getName(), diskRegionView.isBucket(), true, false, true,
-        StatsFactory.createStatsImpl(DiskRegionStats.class,
-            diskStore.getCache().getDistributedSystem().getStatisticsFactory(),
-            diskRegionView.getName()),
+        StatsFactory.createStatsImpl(DiskRegionStats.class, diskRegionView.getName()),
         new DummyCancelCriterion(), new DummyDiskExceptionHandler(), null,
         diskRegionView.getFlags(),
         diskRegionView.getPartitionName(), diskRegionView.getStartingBucketId(),
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/control/InternalResourceManager.java b/geode-core/src/main/java/org/apache/geode/internal/cache/control/InternalResourceManager.java
index 116de8c..a3af5dd 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/control/InternalResourceManager.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/control/InternalResourceManager.java
@@ -117,8 +117,7 @@ public class InternalResourceManager implements ResourceManager {
     this.cache = cache;
     this.resourceAdvisor = (ResourceAdvisor) cache.getDistributionAdvisor();
     this.stats = StatsFactory
-        .createStatsImpl(ResourceManagerStats.class,
-            cache.getDistributedSystem().getStatisticsFactory(), "ResourceManager");
+        .createStatsImpl(ResourceManagerStats.class, "ResourceManager");
 
     // Create a new executor that other classes may use for handling resource
     // related tasks
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/eviction/AbstractEvictionController.java b/geode-core/src/main/java/org/apache/geode/internal/cache/eviction/AbstractEvictionController.java
index ec5d290..699497c 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/eviction/AbstractEvictionController.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/eviction/AbstractEvictionController.java
@@ -71,20 +71,20 @@ public abstract class AbstractEvictionController implements EvictionController {
     EvictionCounters evictionCounters;
     if (algorithm == EvictionAlgorithm.LRU_HEAP) {
       evictionStats =
-          StatsFactory.createStatsImpl(HeapLRUEvictionStats.class, statsFactory, statsName);
+          StatsFactory.createStatsImpl(HeapLRUEvictionStats.class, statsName);
       evictionCounters = new EvictionCountersImpl(evictionStats);
       return new HeapLRUController(evictionCounters, action, sizer, algorithm);
     }
     if (algorithm == EvictionAlgorithm.LRU_MEMORY || algorithm == EvictionAlgorithm.LIFO_MEMORY) {
       evictionStats =
-          StatsFactory.createStatsImpl(CountLRUEvictionStats.class, statsFactory, statsName);
+          StatsFactory.createStatsImpl(CountLRUEvictionStats.class, statsName);
       evictionCounters = new EvictionCountersImpl(evictionStats);
       return new MemoryLRUController(evictionCounters, maximum, sizer, action, isOffHeap,
           algorithm);
     }
     if (algorithm == EvictionAlgorithm.LRU_ENTRY || algorithm == EvictionAlgorithm.LIFO_ENTRY) {
       evictionStats =
-          StatsFactory.createStatsImpl(MemoryLRUEvictionStats.class, statsFactory, statsName);
+          StatsFactory.createStatsImpl(MemoryLRUEvictionStats.class, statsName);
       evictionCounters = new EvictionCountersImpl(evictionStats);
       return new CountLRUEviction(evictionCounters, maximum, action, algorithm);
     }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/ha/HARegionQueue.java b/geode-core/src/main/java/org/apache/geode/internal/cache/ha/HARegionQueue.java
index bfe6acd..b21a8fb 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/ha/HARegionQueue.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/ha/HARegionQueue.java
@@ -103,7 +103,6 @@ import org.apache.geode.internal.util.concurrent.StoppableReentrantReadWriteLock
 import org.apache.geode.internal.util.concurrent.StoppableReentrantReadWriteLock.StoppableWriteLock;
 import org.apache.geode.stats.common.cache.query.internal.CqQueryVsdStats;
 import org.apache.geode.stats.common.internal.cache.ha.HARegionQueueStats;
-import org.apache.geode.stats.common.statistics.StatisticsFactory;
 import org.apache.geode.stats.common.statistics.factory.StatsFactory;
 
 /**
@@ -370,13 +369,11 @@ public class HARegionQueue implements RegionQueue {
 
     String processedRegionName = createRegionName(regionName);
 
-    // Initialize the statistics
-    StatisticsFactory factory = cache.getDistributedSystem().getStatisticsFactory();
     createHARegion(processedRegionName, cache);
 
     initializeHARegionQueue(processedRegionName, this.region, haContainer, clientProxyId,
         clientConflation, isPrimary,
-        StatsFactory.createStatsImpl(HARegionQueueStats.class, factory, processedRegionName),
+        StatsFactory.createStatsImpl(HARegionQueueStats.class, processedRegionName),
         new StoppableReentrantReadWriteLock(cache.getCancelCriterion()),
         new StoppableReentrantReadWriteLock(region.getCancelCriterion()),
         this.region.getCancelCriterion(), true);
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/AcceptorImpl.java b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/AcceptorImpl.java
index d0ae814..15e0674 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/AcceptorImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/AcceptorImpl.java
@@ -109,57 +109,100 @@ import org.apache.geode.stats.common.statistics.factory.StatsFactory;
  */
 @SuppressWarnings("deprecation")
 public class AcceptorImpl implements Acceptor, Runnable, CommBufferPool {
+  public static final int CLIENT_QUEUE_INITIALIZATION_POOL_SIZE = 16;
+  /**
+   * The name of a system property that sets the hand shake timeout (in milliseconds). This is how
+   * long a client will wait to hear back from a server.
+   */
+  public static final String HANDSHAKE_TIMEOUT_PROPERTY_NAME = "BridgeServer.handShakeTimeout";
+  /**
+   * The default value of the {@link #HANDSHAKE_TIMEOUT_PROPERTY_NAME} system property.
+   */
+  public static final int DEFAULT_HANDSHAKE_TIMEOUT_MS = 59000;
+  /**
+   * The name of a system property that sets the accept timeout (in milliseconds). This is how long
+   * a server will wait to get its first byte from a client it has just accepted.
+   */
+  public static final String ACCEPT_TIMEOUT_PROPERTY_NAME = "BridgeServer.acceptTimeout";
+  /**
+   * The default value of the {@link #ACCEPT_TIMEOUT_PROPERTY_NAME} system property.
+   */
+  public static final int DEFAULT_ACCEPT_TIMEOUT_MS = 9900;
+  /**
+   * The mininum value of max-connections
+   */
+  public static final int MINIMUM_MAX_CONNECTIONS = 16;
+  /**
+   * The system property name for setting the {@link ServerSocket}backlog
+   */
+  public static final String BACKLOG_PROPERTY_NAME = "BridgeServer.backlog";
+  /**
+   * Test value for handshake timeout
+   */
+  protected static final int handshakeTimeout =
+      Integer.getInteger(HANDSHAKE_TIMEOUT_PROPERTY_NAME, DEFAULT_HANDSHAKE_TIMEOUT_MS).intValue();
+  static final byte REPLY_REFUSED = (byte) 60;
+  static final byte REPLY_INVALID = (byte) 61;
   private static final Logger logger = LogService.getLogger();
-
   private static final boolean isJRockit = System.getProperty("java.vm.name").contains("JRockit");
   private static final int HANDSHAKER_DEFAULT_POOL_SIZE = 4;
-  public static final int CLIENT_QUEUE_INITIALIZATION_POOL_SIZE = 16;
-
+  /**
+   * The default value of the {@link ServerSocket} {@link #BACKLOG_PROPERTY_NAME}system property
+   */
+  private static final int DEFAULT_BACKLOG = 1000;
+  /**
+   * This system property is only used if max-threads == 0. This is for 5.0.2 backwards
+   * compatibility.
+   *
+   * @deprecated since 5.1 use cache-server max-threads instead
+   */
+  @Deprecated
+  private static final boolean DEPRECATED_SELECTOR = Boolean.getBoolean("BridgeServer.SELECTOR");
+  private static final boolean WORKAROUND_SELECTOR_BUG =
+      Boolean.getBoolean("CacheServer.NIO_SELECTOR_WORKAROUND");
+  // private final Selector tmpSel;
+  private static boolean isAuthenticationRequired;
+  private static boolean isPostAuthzCallbackPresent;
+  /**
+   * break any potential circularity in {@link #loadEmergencyClasses()}
+   */
+  private static volatile boolean emergencyClassesLoaded = false;
+  /**
+   * Current number of ServerConnection instances that are CLIENT_TO_SERVER cons.
+   */
+  public final AtomicInteger clientServerCnxCount = new AtomicInteger();
   protected final CacheServerStats stats;
+  /**
+   * The GemFire cache served up by this acceptor
+   */
+  protected final InternalCache cache;
   private final int maxConnections;
   private final int maxThreads;
-
   private final ThreadPoolExecutor pool;
   /**
    * A pool used to process handshakes.
    */
   private final ThreadPoolExecutor hsPool;
-
   /**
    * A pool used to process client-queue-initializations.
    */
   private final ThreadPoolExecutor clientQueueInitPool;
-
   /**
    * The port on which this acceptor listens for client connections
    */
   private final int localPort;
-
-  /**
-   * The server socket that handles requests for connections
-   */
-  private ServerSocket serverSock = null;
-
-  /**
-   * The GemFire cache served up by this acceptor
-   */
-  protected final InternalCache cache;
-
   /**
    * Caches region information
    */
   private final CachedRegionHelper crHelper;
-
   /**
    * A lock to prevent close from occurring while creating a ServerConnection
    */
   private final Object syncLock = new Object();
-
   /**
    * THE selector for the bridge server; null if no selector.
    */
   private final Selector selector;
-  // private final Selector tmpSel;
   /**
    * Used for managing direct byte buffer for client comms; null if no selector.
    */
@@ -180,91 +223,19 @@ public class AcceptorImpl implements Acceptor, Runnable, CommBufferPool {
    * tcpNoDelay setting for outgoing sockets
    */
   private final boolean tcpNoDelay;
-
-  /**
-   * The name of a system property that sets the hand shake timeout (in milliseconds). This is how
-   * long a client will wait to hear back from a server.
-   */
-  public static final String HANDSHAKE_TIMEOUT_PROPERTY_NAME = "BridgeServer.handShakeTimeout";
-
-  /**
-   * The default value of the {@link #HANDSHAKE_TIMEOUT_PROPERTY_NAME} system property.
-   */
-  public static final int DEFAULT_HANDSHAKE_TIMEOUT_MS = 59000;
-
-  /**
-   * Test value for handshake timeout
-   */
-  protected static final int handshakeTimeout =
-      Integer.getInteger(HANDSHAKE_TIMEOUT_PROPERTY_NAME, DEFAULT_HANDSHAKE_TIMEOUT_MS).intValue();
-
-  /**
-   * The name of a system property that sets the accept timeout (in milliseconds). This is how long
-   * a server will wait to get its first byte from a client it has just accepted.
-   */
-  public static final String ACCEPT_TIMEOUT_PROPERTY_NAME = "BridgeServer.acceptTimeout";
-
-  /**
-   * The default value of the {@link #ACCEPT_TIMEOUT_PROPERTY_NAME} system property.
-   */
-  public static final int DEFAULT_ACCEPT_TIMEOUT_MS = 9900;
-
   /**
    * Test value for accept timeout
    */
   private final int acceptTimeout =
       Integer.getInteger(ACCEPT_TIMEOUT_PROPERTY_NAME, DEFAULT_ACCEPT_TIMEOUT_MS).intValue();
-
-  /**
-   * The mininum value of max-connections
-   */
-  public static final int MINIMUM_MAX_CONNECTIONS = 16;
-
   /**
    * The buffer size for server-side sockets.
    */
   private final int socketBufferSize;
-
-  /**
-   * Notifies clients of updates
-   */
-  private CacheClientNotifier clientNotifier;
-
-  /**
-   * The default value of the {@link ServerSocket} {@link #BACKLOG_PROPERTY_NAME}system property
-   */
-  private static final int DEFAULT_BACKLOG = 1000;
-
-  /**
-   * The system property name for setting the {@link ServerSocket}backlog
-   */
-  public static final String BACKLOG_PROPERTY_NAME = "BridgeServer.backlog";
-
-  /**
-   * Current number of ServerConnection instances that are CLIENT_TO_SERVER cons.
-   */
-  public final AtomicInteger clientServerCnxCount = new AtomicInteger();
-
-  /**
-   * Has this acceptor been shut down
-   */
-  private volatile boolean shutdownStarted = false;
-
-  /**
-   * The thread that runs the acceptor
-   */
-  private Thread thread = null;
-
-  /**
-   * The thread that runs the selector loop if any
-   */
-  private Thread selectorThread = null;
-
   /**
    * Controls updates to {@link #allSCs}
    */
   private final Object allSCsLock = new Object();
-
   /**
    * List of ServerConnection.
    *
@@ -273,14 +244,6 @@ public class AcceptorImpl implements Acceptor, Runnable, CommBufferPool {
    * guarded.By {@link #allSCsLock}
    */
   private final HashSet allSCs = new HashSet();
-
-  /**
-   * List of ServerConnections, for {@link #emergencyClose()}
-   *
-   * guarded.By {@link #allSCsLock}
-   */
-  private volatile ServerConnection allSCList[] = new ServerConnection[0];
-
   /**
    * The ip address or host name this acceptor is to bind to; <code>null</code> or "" indicates it
    * will listen on all local addresses.
@@ -288,38 +251,67 @@ public class AcceptorImpl implements Acceptor, Runnable, CommBufferPool {
    * @since GemFire 5.7
    */
   private final String bindHostName;
-
   /**
    * A listener for connect/disconnect events
    */
   private final ConnectionListener connectionListener;
-
   /**
    * The client health monitor tracking connections for this acceptor
    */
   private final ClientHealthMonitor healthMonitor;
-
   /**
    * bridge's setting of notifyBySubscription
    */
   private final boolean notifyBySubscription;
-
+  private final SocketCreator socketCreator;
+  private final SecurityService securityService;
+  private final ServerConnectionFactory serverConnectionFactory;
+  /**
+   * This system property is only used if max-threads == 0. This is for 5.0.2 backwards
+   * compatibility.
+   *
+   * @deprecated since 5.1 use cache-server max-threads instead
+   */
+  @Deprecated
+  private final int DEPRECATED_SELECTOR_POOL_SIZE =
+      Integer.getInteger("BridgeServer.SELECTOR_POOL_SIZE", 16).intValue();
+  private final int HANDSHAKE_POOL_SIZE = Integer
+      .getInteger("BridgeServer.HANDSHAKE_POOL_SIZE", HANDSHAKER_DEFAULT_POOL_SIZE).intValue();
+  protected boolean loggedAcceptError = false;
+  /**
+   * The server socket that handles requests for connections
+   */
+  private ServerSocket serverSock = null;
+  /**
+   * Notifies clients of updates
+   */
+  private CacheClientNotifier clientNotifier;
+  /**
+   * Has this acceptor been shut down
+   */
+  private volatile boolean shutdownStarted = false;
+  /**
+   * The thread that runs the acceptor
+   */
+  private Thread thread = null;
+  /**
+   * The thread that runs the selector loop if any
+   */
+  private Thread selectorThread = null;
+  /**
+   * List of ServerConnections, for {@link #emergencyClose()}
+   *
+   * guarded.By {@link #allSCsLock}
+   */
+  private volatile ServerConnection allSCList[] = new ServerConnection[0];
   /**
    * The AcceptorImpl identifier, used to identify the clients connected to this Acceptor.
    */
   private long acceptorId;
-
-  private static boolean isAuthenticationRequired;
-
-  private static boolean isPostAuthzCallbackPresent;
-
   private boolean isGatewayReceiver;
   private List<GatewayTransportFilter> gatewayTransportFilters;
-  private final SocketCreator socketCreator;
-
-  private final SecurityService securityService;
-
-  private final ServerConnectionFactory serverConnectionFactory;
+  private Selector tmpSel;
+  private int registeredKeys = 0;
 
   /**
    * Initializes this acceptor thread to listen for connections on the given port.
@@ -535,11 +527,9 @@ public class AcceptorImpl implements Acceptor, Runnable, CommBufferPool {
           LocalizedStrings.AcceptorImpl_CACHE_SERVER_CONNECTION_LISTENER_BOUND_TO_ADDRESS_0_WITH_BACKLOG_1,
           new Object[] {sockName, Integer.valueOf(backLog)}));
       if (isGatewayReceiver) {
-        this.stats =
-            (CacheServerStats) StatsFactory
-                .createStatsImpl(GatewayReceiverStats.class, null, sockName);
+        this.stats = StatsFactory.createStatsImpl(GatewayReceiverStats.class, sockName);
       } else {
-        this.stats = StatsFactory.createStatsImpl(CacheServerStats.class, null, sockName);
+        this.stats = StatsFactory.createStatsImpl(CacheServerStats.class, sockName);
       }
 
     }
@@ -568,6 +558,78 @@ public class AcceptorImpl implements Acceptor, Runnable, CommBufferPool {
         (postAuthzFactoryName != null && postAuthzFactoryName.length() > 0) ? true : false;
   }
 
+  /**
+   * Ensure that the CachedRegionHelper and ServerConnection classes get loaded.
+   *
+   * @see SystemFailure#loadEmergencyClasses()
+   */
+  public static void loadEmergencyClasses() {
+    if (emergencyClassesLoaded) {
+      return;
+    }
+    emergencyClassesLoaded = true;
+    CachedRegionHelper.loadEmergencyClasses();
+    ServerConnection.loadEmergencyClasses();
+  }
+
+  protected static void closeSocket(Socket s) {
+    if (s != null) {
+      try {
+        s.close();
+      } catch (IOException ignore) {
+      }
+    }
+  }
+
+  /**
+   * @param bindName the ip address or host name that this acceptor should bind to. If null or ""
+   *        then calculate it.
+   * @return the ip address or host name this acceptor will listen on. An "" if all local addresses
+   *         will be listened to.
+   * @since GemFire 5.7
+   */
+  private static String calcBindHostName(Cache cache, String bindName) {
+    if (bindName != null && !bindName.equals("")) {
+      return bindName;
+    }
+
+    InternalDistributedSystem system = (InternalDistributedSystem) cache.getDistributedSystem();
+    DistributionConfig config = system.getConfig();
+    String hostName = null;
+
+    // Get the server-bind-address. If it is not null, use it.
+    // If it is null, get the bind-address. If it is not null, use it.
+    // Otherwise set default.
+    String serverBindAddress = config.getServerBindAddress();
+    if (serverBindAddress != null && serverBindAddress.length() > 0) {
+      hostName = serverBindAddress;
+    } else {
+      String bindAddress = config.getBindAddress();
+      if (bindAddress != null && bindAddress.length() > 0) {
+        hostName = bindAddress;
+      }
+    }
+    return hostName;
+  }
+
+  // IBM J9 sometimes reports "listen failed" instead of BindException
+  // see bug #40589
+  public static boolean treatAsBindException(SocketException se) {
+    if (se instanceof BindException) {
+      return true;
+    }
+    final String msg = se.getMessage();
+    return (msg != null && msg.contains("Invalid argument: listen failed"));
+  }
+
+  public static boolean isAuthenticationRequired() {
+    return isAuthenticationRequired;
+  }
+
+  public static boolean isPostAuthzCallbackPresent() {
+    return isPostAuthzCallbackPresent;
+  }
+
   private ThreadPoolExecutor initializeHandshakerThreadPool() throws IOException {
     String gName = "Handshaker " + serverSock.getInetAddress() + ":" + this.localPort;
     final ThreadGroup socketThreadGroup = LoggingThreadGroup.createThreadGroup(gName, logger);
@@ -701,27 +763,6 @@ public class AcceptorImpl implements Acceptor, Runnable, CommBufferPool {
     return this.maxThreads > 0;
   }
 
-  /**
-   * This system property is only used if max-threads == 0. This is for 5.0.2 backwards
-   * compatibility.
-   *
-   * @deprecated since 5.1 use cache-server max-threads instead
-   */
-  @Deprecated
-  private static final boolean DEPRECATED_SELECTOR = Boolean.getBoolean("BridgeServer.SELECTOR");
-
-  /**
-   * This system property is only used if max-threads == 0. This is for 5.0.2 backwards
-   * compatibility.
-   *
-   * @deprecated since 5.1 use cache-server max-threads instead
-   */
-  @Deprecated
-  private final int DEPRECATED_SELECTOR_POOL_SIZE =
-      Integer.getInteger("BridgeServer.SELECTOR_POOL_SIZE", 16).intValue();
-  private final int HANDSHAKE_POOL_SIZE = Integer
-      .getInteger("BridgeServer.HANDSHAKE_POOL_SIZE", HANDSHAKER_DEFAULT_POOL_SIZE).intValue();
-
   @Override
   public void start() throws IOException {
     ThreadGroup tg = LoggingThreadGroup.createThreadGroup(
@@ -845,25 +886,6 @@ public class AcceptorImpl implements Acceptor, Runnable, CommBufferPool {
   }
 
   /**
-   * break any potential circularity in {@link #loadEmergencyClasses()}
-   */
-  private static volatile boolean emergencyClassesLoaded = false;
-
-  /**
-   * Ensure that the CachedRegionHelper and ServerConnection classes get loaded.
-   *
-   * @see SystemFailure#loadEmergencyClasses()
-   */
-  public static void loadEmergencyClasses() {
-    if (emergencyClassesLoaded) {
-      return;
-    }
-    emergencyClassesLoaded = true;
-    CachedRegionHelper.loadEmergencyClasses();
-    ServerConnection.loadEmergencyClasses();
-  }
-
-  /**
    * @see SystemFailure#emergencyClose()
    */
   public void emergencyClose() {
@@ -918,11 +940,6 @@ public class AcceptorImpl implements Acceptor, Runnable, CommBufferPool {
     return result;
   }
 
-  private static final boolean WORKAROUND_SELECTOR_BUG =
-      Boolean.getBoolean("CacheServer.NIO_SELECTOR_WORKAROUND");
-
-  private Selector tmpSel;
-
   private void checkForStuckKeys() {
     if (!WORKAROUND_SELECTOR_BUG) {
       return;
@@ -1042,8 +1059,6 @@ public class AcceptorImpl implements Acceptor, Runnable, CommBufferPool {
     }
   }
 
-  private int registeredKeys = 0;
-
   public void runSelectorLoop() {
     // int zeroEventsCount = 0;
     try {
@@ -1206,7 +1221,6 @@ public class AcceptorImpl implements Acceptor, Runnable, CommBufferPool {
     return name;
   }
 
-
   public InetAddress getServerInetAddr() {
     return this.serverSock.getInetAddress();
   }
@@ -1242,17 +1256,6 @@ public class AcceptorImpl implements Acceptor, Runnable, CommBufferPool {
     return this.selectorQueue;
   }
 
-  protected boolean loggedAcceptError = false;
-
-  protected static void closeSocket(Socket s) {
-    if (s != null) {
-      try {
-        s.close();
-      } catch (IOException ignore) {
-      }
-    }
-  }
-
   /**
    * {@linkplain ServerSocket#accept Listens}for a client to connect and then creates a new {@link
    * ServerConnection}to handle messages from that client.
@@ -1520,9 +1523,6 @@ public class AcceptorImpl implements Acceptor, Runnable, CommBufferPool {
     }
   }
 
-  static final byte REPLY_REFUSED = (byte) 60;
-  static final byte REPLY_INVALID = (byte) 61;
-
   void refuseHandshake(OutputStream out, String message, byte exception) throws IOException {
 
     HeapDataOutputStream hdos = new HeapDataOutputStream(32, Version.CURRENT);
@@ -1728,37 +1728,6 @@ public class AcceptorImpl implements Acceptor, Runnable, CommBufferPool {
         && (selector == null || !selector.isOpen()) && (tmpSel == null || !tmpSel.isOpen());
   }
 
-  /**
-   * @param bindName the ip address or host name that this acceptor should bind to. If null or ""
-   *        then calculate it.
-   * @return the ip address or host name this acceptor will listen on. An "" if all local addresses
-   *         will be listened to.
-   * @since GemFire 5.7
-   */
-  private static String calcBindHostName(Cache cache, String bindName) {
-    if (bindName != null && !bindName.equals("")) {
-      return bindName;
-    }
-
-    InternalDistributedSystem system = (InternalDistributedSystem) cache.getDistributedSystem();
-    DistributionConfig config = system.getConfig();
-    String hostName = null;
-
-    // Get the server-bind-address. If it is not null, use it.
-    // If it is null, get the bind-address. If it is not null, use it.
-    // Otherwise set default.
-    String serverBindAddress = config.getServerBindAddress();
-    if (serverBindAddress != null && serverBindAddress.length() > 0) {
-      hostName = serverBindAddress;
-    } else {
-      String bindAddress = config.getBindAddress();
-      if (bindAddress != null && bindAddress.length() > 0) {
-        hostName = bindAddress;
-      }
-    }
-    return hostName;
-  }
-
   private InetAddress getBindAddress() throws IOException {
     if (this.bindHostName == null || "".equals(this.bindHostName)) {
       return null; // pick default local address
@@ -1831,24 +1800,6 @@ public class AcceptorImpl implements Acceptor, Runnable, CommBufferPool {
     return this.gatewayTransportFilters;
   }
 
-  // IBM J9 sometimes reports "listen failed" instead of BindException
-  // see bug #40589
-  public static boolean treatAsBindException(SocketException se) {
-    if (se instanceof BindException) {
-      return true;
-    }
-    final String msg = se.getMessage();
-    return (msg != null && msg.contains("Invalid argument: listen failed"));
-  }
-
-  public static boolean isAuthenticationRequired() {
-    return isAuthenticationRequired;
-  }
-
-  public static boolean isPostAuthzCallbackPresent() {
-    return isPostAuthzCallbackPresent;
-  }
-
   public Set<ServerConnection> getAllServerConnections() {
     return Collections.unmodifiableSet(allSCs);
   }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientUpdater.java b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientUpdater.java
index 8e7a1f2..ec5d255 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientUpdater.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/tier/sockets/CacheClientUpdater.java
@@ -288,8 +288,7 @@ public class CacheClientUpdater extends Thread implements ClientUpdater, Disconn
     // this holds the connection which this threads reads
     this.eManager = eManager;
     this.endpoint = endpoint;
-    this.stats = StatsFactory.createStatsImpl(CCUStats.class, this.system.getStatisticsFactory(),
-        this.location.toString());
+    this.stats = StatsFactory.createStatsImpl(CCUStats.class, this.location.toString());
 
     // Create the connection...
     final boolean isDebugEnabled = logger.isDebugEnabled();
diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySender.java b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySender.java
index 31e1529..4c16b79 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySender.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/wan/AbstractGatewaySender.java
@@ -269,8 +269,7 @@ public abstract class AbstractGatewaySender implements InternalGatewaySender, Di
       this.senderAdvisor = GatewaySenderAdvisor.createGatewaySenderAdvisor(this);
       if (!this.isForInternalUse()) {
         this.statistics = StatsFactory
-            .createStatsImpl(GatewaySenderStats.class,
-                cache.getDistributedSystem().getStatisticsFactory(), id);
+            .createStatsImpl(GatewaySenderStats.class, id);
       }
       initializeEventIdIndex();
     }
@@ -1254,8 +1253,7 @@ public abstract class AbstractGatewaySender implements InternalGatewaySender, Di
       final HasCachePerfStats statsHolder = new HasCachePerfStats() {
         @Override
         public CachePerfStats getCachePerfStats() {
-          return StatsFactory.createStatsImpl(CachePerfStats.class,
-              cache.getDistributedSystem().getStatisticsFactory(), META_DATA_REGION_NAME);
+          return StatsFactory.createStatsImpl(CachePerfStats.class, META_DATA_REGION_NAME);
         }
       };
 
diff --git a/geode-core/src/main/java/org/apache/geode/internal/offheap/OffHeapStorage.java b/geode-core/src/main/java/org/apache/geode/internal/offheap/OffHeapStorage.java
index e6d5fe3..65c2616 100755
--- a/geode-core/src/main/java/org/apache/geode/internal/offheap/OffHeapStorage.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/offheap/OffHeapStorage.java
@@ -24,7 +24,6 @@ import org.apache.geode.distributed.internal.InternalLocator;
 import org.apache.geode.internal.ClassPathLoader;
 import org.apache.geode.internal.i18n.LocalizedStrings;
 import org.apache.geode.stats.common.internal.offheap.OffHeapStorageStats;
-import org.apache.geode.stats.common.statistics.StatisticsFactory;
 import org.apache.geode.stats.common.statistics.factory.StatsFactory;
 
 /**
@@ -39,9 +38,9 @@ public class OffHeapStorage {
 
   private final OffHeapStorageStats stats;
 
-  private OffHeapStorage(StatisticsFactory factory) {
+  private OffHeapStorage() {
     this.stats =
-        StatsFactory.createStatsImpl(OffHeapStorageStats.class, factory, "offHeapMemoryStats");
+        StatsFactory.createStatsImpl(OffHeapStorageStats.class, "offHeapMemoryStats");
   }
 
   public static long parseOffHeapMemorySize(String value) {
@@ -104,7 +103,7 @@ public class OffHeapStorage {
    *
    * @return MemoryAllocator for off-heap storage
    */
-  public static MemoryAllocator createOffHeapStorage(StatisticsFactory sf, long offHeapMemorySize,
+  public static MemoryAllocator createOffHeapStorage(long offHeapMemorySize,
       DistributedSystem system) {
     if (offHeapMemorySize == 0 || Boolean.getBoolean(InternalLocator.FORCE_LOCATOR_DM_TYPE)) {
       // Checking the FORCE_LOCATOR_DM_TYPE is a quick hack to keep our locator from allocating off
@@ -126,15 +125,13 @@ public class OffHeapStorage {
     // ooohml provides the hook for disconnecting and closing cache on OutOfOffHeapMemoryException
     OutOfOffHeapMemoryListener ooohml =
         new DisconnectingOutOfOffHeapMemoryListener((InternalDistributedSystem) system);
-    return basicCreateOffHeapStorage(sf, offHeapMemorySize, ooohml);
+    return basicCreateOffHeapStorage(offHeapMemorySize, ooohml);
   }
 
-  static MemoryAllocator basicCreateOffHeapStorage(StatisticsFactory statisticsFactory,
-      long offHeapMemorySize,
+  static MemoryAllocator basicCreateOffHeapStorage(long offHeapMemorySize,
       OutOfOffHeapMemoryListener ooohml) {
     final OffHeapStorageStats stats =
-        StatsFactory.createStatsImpl(OffHeapStorageStats.class, statisticsFactory,
-            "offHeapStorageStats");
+        StatsFactory.createStatsImpl(OffHeapStorageStats.class, "offHeapStorageStats");
 
     // determine off-heap and slab sizes
     final long maxSlabSize = calcMaxSlabSize(offHeapMemorySize);
diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/CallbackSampler.java b/geode-core/src/main/java/org/apache/geode/internal/statistics/CallbackSampler.java
index 4517e68..37aa5d7 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/statistics/CallbackSampler.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/statistics/CallbackSampler.java
@@ -31,10 +31,10 @@ public class CallbackSampler {
   private final CancelCriterion cancelCriterion;
   private long sampleIntervalNanos;
   private ScheduledExecutorService executor;
-  private final StatSamplerStats statSamplerStats;
+  private final StatSamplerStatsImpl statSamplerStats;
 
   public CallbackSampler(final CancelCriterion cancelCriterion,
-      final StatSamplerStats statSamplerStats) {
+      final StatSamplerStatsImpl statSamplerStats) {
     this.cancelCriterion = cancelCriterion;
     this.statSamplerStats = statSamplerStats;
   }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/DummyStatisticsFactory.java b/geode-core/src/main/java/org/apache/geode/internal/statistics/DummyStatisticsFactory.java
index 3e2becb..72a0449 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/statistics/DummyStatisticsFactory.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/statistics/DummyStatisticsFactory.java
@@ -17,6 +17,7 @@ package org.apache.geode.internal.statistics;
 
 import java.io.IOException;
 import java.io.Reader;
+import java.util.List;
 
 import org.apache.geode.stats.common.statistics.StatisticDescriptor;
 import org.apache.geode.stats.common.statistics.Statistics;
@@ -49,13 +50,11 @@ public class DummyStatisticsFactory implements StatisticsFactory {
     return result;
   }
 
-  // /** for internal use only. Its called by {@link LocalStatisticsImpl#close}. */
-  // public void destroyStatistics(Statistics stats) {
-  // if (statsList.remove(stats)) {
-  // statsListModCount++;
-  // }
-  // }
-  //
+  @Override
+  public Statistics findStatisticsByUniqueId(long uniqueId) {
+    return null;
+  }
+
   public Statistics createAtomicStatistics(StatisticsType type) {
     return createAtomicStatistics(type, null, 1);
   }
@@ -81,6 +80,16 @@ public class DummyStatisticsFactory implements StatisticsFactory {
     return new Statistics[0];
   }
 
+  @Override
+  public String getType() {
+    return null;
+  }
+
+  @Override
+  public List getStatsList() {
+    return null;
+  }
+
   public StatisticsType createType(String name, String description, StatisticDescriptor[] stats) {
     return factory.createType(name, description, stats);
   }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/GFSStatisticsFactoryImpl.java b/geode-core/src/main/java/org/apache/geode/internal/statistics/GFSStatisticsFactoryImpl.java
index fcfaaf4..d6bee4a 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/statistics/GFSStatisticsFactoryImpl.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/statistics/GFSStatisticsFactoryImpl.java
@@ -9,13 +9,15 @@ import java.util.concurrent.atomic.LongAdder;
 
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.internal.i18n.LocalizedStrings;
+import org.apache.geode.internal.statistics.platform.OsStatisticsFactory;
 import org.apache.geode.stats.common.statistics.StatisticDescriptor;
 import org.apache.geode.stats.common.statistics.Statistics;
 import org.apache.geode.stats.common.statistics.StatisticsFactory;
 import org.apache.geode.stats.common.statistics.StatisticsType;
 import org.apache.geode.stats.common.statistics.StatisticsTypeFactory;
 
-public class GFSStatisticsFactoryImpl implements StatisticsFactory, StatisticsManager {
+public class GFSStatisticsFactoryImpl implements StatisticsFactory, StatisticsManager,
+    OsStatisticsFactory {
 
   private final CopyOnWriteArrayList<Statistics> statsList = new CopyOnWriteArrayList<>();
   private int statsListModCount = 0;
@@ -133,37 +135,37 @@ public class GFSStatisticsFactoryImpl implements StatisticsFactory, StatisticsMa
 
   @Override
   public StatisticDescriptor createIntCounter(String name, String description, String units,
-                                              boolean largerBetter) {
+      boolean largerBetter) {
     return statisticsTypeFactory.createIntCounter(name, description, units, largerBetter);
   }
 
   @Override
   public StatisticDescriptor createLongCounter(String name, String description, String units,
-                                               boolean largerBetter) {
+      boolean largerBetter) {
     return statisticsTypeFactory.createLongCounter(name, description, units, largerBetter);
   }
 
   @Override
   public StatisticDescriptor createDoubleCounter(String name, String description, String units,
-                                                 boolean largerBetter) {
+      boolean largerBetter) {
     return statisticsTypeFactory.createDoubleCounter(name, description, units, largerBetter);
   }
 
   @Override
   public StatisticDescriptor createIntGauge(String name, String description, String units,
-                                            boolean largerBetter) {
+      boolean largerBetter) {
     return statisticsTypeFactory.createIntGauge(name, description, units, largerBetter);
   }
 
   @Override
   public StatisticDescriptor createLongGauge(String name, String description, String units,
-                                             boolean largerBetter) {
+      boolean largerBetter) {
     return statisticsTypeFactory.createLongGauge(name, description, units, largerBetter);
   }
 
   @Override
   public StatisticDescriptor createDoubleGauge(String name, String description, String units,
-                                               boolean largerBetter) {
+      boolean largerBetter) {
     return statisticsTypeFactory.createDoubleGauge(name, description, units, largerBetter);
   }
 
@@ -219,6 +221,7 @@ public class GFSStatisticsFactoryImpl implements StatisticsFactory, StatisticsMa
     return hits.toArray(result);
   }
 
+  @Override
   public Statistics findStatisticsByUniqueId(final long uniqueId) {
     for (Statistics statistics : this.statsList) {
       if (uniqueId == statistics.getUniqueId()) {
@@ -242,7 +245,7 @@ public class GFSStatisticsFactoryImpl implements StatisticsFactory, StatisticsMa
 
   @Override
   public Statistics createOsStatistics(StatisticsType type, String textId, long numericId,
-                                       int osStatFlags) {
+      int osStatFlags) {
     statsListUniqueId.increment();
     Statistics result =
         new LocalStatisticsImpl(type, textId, numericId, statsListUniqueId.longValue(), false,
diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/GemFireStatSampler.java b/geode-core/src/main/java/org/apache/geode/internal/statistics/GemFireStatSampler.java
index e4a2031..7e4cf0b 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/statistics/GemFireStatSampler.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/statistics/GemFireStatSampler.java
@@ -42,6 +42,7 @@ import org.apache.geode.internal.statistics.platform.OsStatisticsFactory;
 import org.apache.geode.internal.statistics.platform.ProcessStats;
 import org.apache.geode.stats.common.statistics.Statistics;
 import org.apache.geode.stats.common.statistics.StatisticsFactory;
+import org.apache.geode.stats.common.statistics.factory.StatsFactory;
 
 /**
  * GemFireStatSampler adds listeners and rolling archives to HostStatSampler.
@@ -77,7 +78,7 @@ public class GemFireStatSampler extends HostStatSampler {
       InternalDistributedSystemStats internalDistributedSystemStats,
       DistributionManager distributionManager) {
     super(cancelCriterion,
-        new StatSamplerStats(internalDistributedSystemStats, internalDistributedId));
+        StatsFactory.createStatsImpl(StatSampleStats.class, String.valueOf(internalDistributedId)));
     this.distributionConfig = distributionConfig;
     this.distributionManager = distributionManager;
     this.internalDistributedSystemStats = internalDistributedSystemStats;
@@ -237,16 +238,16 @@ public class GemFireStatSampler extends HostStatSampler {
 
   @Override
   protected StatisticsManager getStatisticsManager() {
-    return this.internalDistributedSystemStats;
+    return this.internalDistributedSystemStats.getStatisticsManager();
   }
 
   @Override
   protected OsStatisticsFactory getOsStatisticsFactory() {
-    return this.internalDistributedSystemStats;
+    return this.internalDistributedSystemStats.getOSStatisticsFactory();
   }
 
   private StatisticsFactory getStatisticsFactory() {
-    return internalDistributedSystemStats;
+    return internalDistributedSystemStats.getStatisticsFactory();
   }
 
   @Override
@@ -343,8 +344,8 @@ public class GemFireStatSampler extends HostStatSampler {
   protected abstract static class StatListenerImpl {
     protected Statistics stats;
     protected StatisticDescriptorImpl stat;
-    boolean oldValueInitialized = false;
     protected long oldValue;
+    boolean oldValueInitialized = false;
 
     public long getStatId() {
       if (this.stats.isClosed()) {
@@ -360,10 +361,6 @@ public class GemFireStatSampler extends HostStatSampler {
   protected abstract static class LocalStatListenerImpl extends StatListenerImpl {
     private LocalStatListener listener;
 
-    public LocalStatListener getListener() {
-      return this.listener;
-    }
-
     static LocalStatListenerImpl create(LocalStatListener l, Statistics stats, String statName) {
       LocalStatListenerImpl result;
       StatisticDescriptorImpl stat = (StatisticDescriptorImpl) stats.nameToDescriptor(statName);
@@ -389,6 +386,10 @@ public class GemFireStatSampler extends HostStatSampler {
       return result;
     }
 
+    public LocalStatListener getListener() {
+      return this.listener;
+    }
+
     /**
      * Checks to see if the value of the stat has changed. If it has then the local listener is
      * fired
@@ -435,31 +436,6 @@ public class GemFireStatSampler extends HostStatSampler {
     private int listenerId;
     private InternalDistributedMember recipient;
 
-    @Override
-    public int hashCode() {
-      return listenerId;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-      if (o == null) {
-        return false;
-      }
-      if (o instanceof RemoteStatListenerImpl) {
-        return listenerId == ((RemoteStatListenerImpl) o).listenerId;
-      } else {
-        return false;
-      }
-    }
-
-    int getListenerId() {
-      return this.listenerId;
-    }
-
-    public InternalDistributedMember getRecipient() {
-      return this.recipient;
-    }
-
     static RemoteStatListenerImpl create(int listenerId, InternalDistributedMember recipient,
         long resourceId, String statName,
         HostStatSampler sampler) {
@@ -491,6 +467,31 @@ public class GemFireStatSampler extends HostStatSampler {
       return result;
     }
 
+    @Override
+    public int hashCode() {
+      return listenerId;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+      if (o == null) {
+        return false;
+      }
+      if (o instanceof RemoteStatListenerImpl) {
+        return listenerId == ((RemoteStatListenerImpl) o).listenerId;
+      } else {
+        return false;
+      }
+    }
+
+    int getListenerId() {
+      return this.listenerId;
+    }
+
+    public InternalDistributedMember getRecipient() {
+      return this.recipient;
+    }
+
     /**
      * Checks to see if the value of the stat has changed. If it has then it adds that change to the
      * specified message.
diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/HostStatSampler.java b/geode-core/src/main/java/org/apache/geode/internal/statistics/HostStatSampler.java
index 3cb4e31..6cdc086 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/statistics/HostStatSampler.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/statistics/HostStatSampler.java
@@ -77,9 +77,9 @@ public abstract class HostStatSampler
 
   private final boolean osStatsDisabled = Boolean.getBoolean(OS_STATS_DISABLED_PROPERTY);
   private final boolean fileSizeLimitInKB;
-  private final StatSamplerStats samplerStats;
+  private final StatSamplerStatsImpl samplerStats;
 
-  private VMStatsContract vmStats;
+  private VMStats vmStats;
   private SampleCollector sampleCollector;
 
   /**
@@ -93,11 +93,11 @@ public abstract class HostStatSampler
 
   private final NanoTimer timer;
 
-  protected HostStatSampler(CancelCriterion stopper, StatSamplerStats samplerStats) {
+  protected HostStatSampler(CancelCriterion stopper, StatSamplerStatsImpl samplerStats) {
     this(stopper, samplerStats, new NanoTimer());
   }
 
-  protected HostStatSampler(CancelCriterion stopper, StatSamplerStats samplerStats,
+  protected HostStatSampler(CancelCriterion stopper, StatSamplerStatsImpl samplerStats,
       NanoTimer timer) {
     this.stopper = stopper;
     this.statSamplerInitializedLatch = new StoppableCountDownLatch(this.stopper, 1);
@@ -107,7 +107,7 @@ public abstract class HostStatSampler
     this.timer = timer;
   }
 
-  public StatSamplerStats getStatSamplerStats() {
+  public StatSamplerStatsImpl getStatSamplerStats() {
     return this.samplerStats;
   }
 
@@ -400,7 +400,7 @@ public abstract class HostStatSampler
    *
    * @since GemFire 3.5
    */
-  public VMStatsContract getVMStats() {
+  public VMStats getVMStats() {
     return this.vmStats;
   }
 
diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/InternalDistributedSystemStats.java b/geode-core/src/main/java/org/apache/geode/internal/statistics/InternalDistributedSystemStats.java
index 62a5031..508d79c 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/statistics/InternalDistributedSystemStats.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/statistics/InternalDistributedSystemStats.java
@@ -14,15 +14,18 @@
  */
 package org.apache.geode.internal.statistics;
 
+import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.internal.cache.execute.FunctionServiceStats;
-import org.apache.geode.statistics.micrometer.MicrometerStatisticsFactoryImpl;
+import org.apache.geode.internal.statistics.platform.OsStatisticsFactory;
 import org.apache.geode.stats.common.internal.cache.execute.FunctionStats;
+import org.apache.geode.stats.common.statistics.Statistics;
 import org.apache.geode.stats.common.statistics.StatisticsFactory;
+import org.apache.geode.stats.common.statistics.StatisticsType;
 import org.apache.geode.stats.common.statistics.factory.StatsFactory;
 
 public class InternalDistributedSystemStats {
@@ -123,4 +126,46 @@ public class InternalDistributedSystemStats {
   public GemFireStatSampler getStatSampler() {
     return this.sampler;
   }
+
+  /**
+   * For every registered statistic instance call the specified visitor. This method was added to
+   * fix bug 40358
+   */
+  public void visitStatistics(InternalDistributedSystem.StatisticsVisitor visitor) {
+    for (Statistics s : getStatsList()) {
+      visitor.visit(s);
+    }
+  }
+
+  public StatisticsFactory getStatisticsFactory() {
+    return statisticsFactory;
+  }
+
+  public List<Statistics> getStatsList() {
+    return statisticsFactory.getStatsList();
+  }
+
+  public Statistics[] findStatisticsByType(StatisticsType gcType) {
+    return statisticsFactory.findStatisticsByType(gcType);
+  }
+
+  public Statistics findStatisticsByUniqueId(long rsrcUniqueId) {
+    return statisticsFactory.findStatisticsByUniqueId(rsrcUniqueId);
+  }
+
+  public StatisticsType findType(String cachePerfStats) {
+    return statisticsFactory.findType(cachePerfStats);
+  }
+
+  public Statistics[] findStatisticsByTextId(String textId) {
+    return statisticsFactory.findStatisticsByTextId(textId);
+  }
+
+  public StatisticsManager getStatisticsManager() {
+    return (StatisticsManager) statisticsFactory;
+  }
+
+  public OsStatisticsFactory getOSStatisticsFactory() {
+    return (OsStatisticsFactory) statisticsFactory;
+  }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/SimpleStatSampler.java b/geode-core/src/main/java/org/apache/geode/internal/statistics/SimpleStatSampler.java
index d56474a..fe9a520 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/statistics/SimpleStatSampler.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/statistics/SimpleStatSampler.java
@@ -63,7 +63,7 @@ public class SimpleStatSampler extends HostStatSampler {
   }
 
   public SimpleStatSampler(CancelCriterion stopper, StatisticsManager sm, NanoTimer timer) {
-    super(stopper, new StatSamplerStats(sm, sm.getId()), timer);
+    super(stopper, new StatSamplerStatsImpl(sm, sm.getId()), timer);
     this.sm = sm;
     logger.info(LogMarker.STATISTICS_MARKER, LocalizedMessage
         .create(LocalizedStrings.SimpleStatSampler_STATSSAMPLERATE_0, getSampleRate()));
diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/StatSamplerStats.java b/geode-core/src/main/java/org/apache/geode/internal/statistics/StatSamplerStatsImpl.java
similarity index 85%
rename from geode-core/src/main/java/org/apache/geode/internal/statistics/StatSamplerStats.java
rename to geode-core/src/main/java/org/apache/geode/internal/statistics/StatSamplerStatsImpl.java
index 0a8f7af..580be9c 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/statistics/StatSamplerStats.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/statistics/StatSamplerStatsImpl.java
@@ -14,6 +14,7 @@
  */
 package org.apache.geode.internal.statistics;
 
+import org.apache.geode.stats.common.statistics.GFSStatsImplementer;
 import org.apache.geode.stats.common.statistics.StatisticDescriptor;
 import org.apache.geode.stats.common.statistics.Statistics;
 import org.apache.geode.stats.common.statistics.StatisticsFactory;
@@ -22,16 +23,16 @@ import org.apache.geode.stats.common.statistics.StatisticsType;
 /**
  * Statistics related to the statistic sampler.
  */
-public class StatSamplerStats {
-  public static final String SAMPLE_COUNT = "sampleCount"; // int
-  public static final String SAMPLE_TIME = "sampleTime"; // long
-  public static final String DELAY_DURATION = "delayDuration"; // int
-  public static final String STAT_RESOURCES = "statResources"; // int
-  public static final String JVM_PAUSES = "jvmPauses"; // int
-  public static final String SAMPLE_CALLBACKS = "sampleCallbacks"; // int
-  public static final String SAMPLE_CALLBACK_ERRORS = "sampleCallbackErrors"; // int
-  public static final String SAMPLE_CALLBACK_DURATION = "sampleCallbackDuration"; // long
-
+public class StatSamplerStatsImpl implements StatSampleStats, GFSStatsImplementer {
+  private static final String SAMPLE_COUNT = "sampleCount"; // int
+  private static final String SAMPLE_TIME = "sampleTime"; // long
+  private static final String DELAY_DURATION = "delayDuration"; // int
+  private static final String STAT_RESOURCES = "statResources"; // int
+  private static final String JVM_PAUSES = "jvmPauses"; // int
+  private static final String SAMPLE_CALLBACKS = "sampleCallbacks"; // int
+  private static final String SAMPLE_CALLBACK_ERRORS = "sampleCallbackErrors"; // int
+  private static final String SAMPLE_CALLBACK_DURATION = "sampleCallbackDuration"; // long
+  private final Statistics samplerStats;
   private StatisticsType samplerType;
   private int sampleCountId;
   private int sampleTimeId;
@@ -42,7 +43,12 @@ public class StatSamplerStats {
   private int sampleCallbackErrorsId;
   private int sampleCallbackDurationId;
 
-  private void initializeStats(StatisticsFactory factory) {
+  public StatSamplerStatsImpl(StatisticsFactory factory, long id) {
+    initializeStats(factory);
+    this.samplerStats = factory.createStatistics(samplerType, "statSampler", id);
+  }
+
+  public void initializeStats(StatisticsFactory factory) {
     samplerType = factory.createType("StatSampler", "Stats on the statistic sampler.",
         new StatisticDescriptor[] {
             factory.createIntCounter(SAMPLE_COUNT, "Total number of samples taken by this sampler.",
@@ -76,13 +82,6 @@ public class StatSamplerStats {
     sampleCallbackDurationId = samplerType.nameToId(SAMPLE_CALLBACK_DURATION);
   }
 
-  private final Statistics samplerStats;
-
-  public StatSamplerStats(StatisticsFactory factory, long id) {
-    initializeStats(factory);
-    this.samplerStats = factory.createStatistics(samplerType, "statSampler", id);
-  }
-
   public void tookSample(long nanosSpentWorking, int statResources, long nanosSpentSleeping) {
     this.samplerStats.incInt(sampleCountId, 1);
     this.samplerStats.incLong(sampleTimeId, nanosSpentWorking / 1000000);
@@ -90,38 +89,47 @@ public class StatSamplerStats {
     this.samplerStats.setInt(statResourcesId, statResources);
   }
 
+  @Override
   public void incJvmPauses() {
     this.samplerStats.incInt(jvmPausesId, 1);
   }
 
+  @Override
   public void incSampleCallbackErrors(int delta) {
     this.samplerStats.incInt(sampleCallbackErrorsId, delta);
   }
 
+  @Override
   public void setSampleCallbacks(int count) {
     this.samplerStats.setInt(sampleCallbacksId, count);
   }
 
+  @Override
   public void incSampleCallbackDuration(long delta) {
     this.samplerStats.incLong(sampleCallbackDurationId, delta);
   }
 
+  @Override
   public int getSampleCount() {
     return this.samplerStats.getInt(SAMPLE_COUNT);
   }
 
+  @Override
   public long getSampleTime() {
     return this.samplerStats.getLong(SAMPLE_TIME);
   }
 
+  @Override
   public int getDelayDuration() {
     return this.samplerStats.getInt(DELAY_DURATION);
   }
 
+  @Override
   public int getStatResources() {
     return this.samplerStats.getInt(STAT_RESOURCES);
   }
 
+  @Override
   public int getJvmPauses() {
     return this.samplerStats.getInt(JVM_PAUSES);
   }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/VMStatsContractFactory.java b/geode-core/src/main/java/org/apache/geode/internal/statistics/VMStatsContractFactory.java
index 3352248..443b911 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/statistics/VMStatsContractFactory.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/statistics/VMStatsContractFactory.java
@@ -17,16 +17,21 @@ package org.apache.geode.internal.statistics;
 import org.apache.geode.SystemFailure;
 import org.apache.geode.internal.stats50.VMStats50;
 import org.apache.geode.stats.common.statistics.StatisticsFactory;
+import org.apache.geode.stats.common.statistics.factory.StatsFactory;
 
 /**
  * Factory used to produce an instance of VMStatsContract.
  */
 public class VMStatsContractFactory {
+  private VMStatsContractFactory() {
+    // private so no instances allowed. static methods only
+  }
+
   /**
    * Create and return a VMStatsContract.
    */
-  public static VMStatsContract create(StatisticsFactory f, long id) {
-    VMStatsContract result;
+  public static VMStats create(StatisticsFactory f, long id) {
+    VMStats result;
     try {
       result = new VMStats50(f, id);
     } catch (VirtualMachineError err) {
@@ -46,12 +51,8 @@ public class VMStatsContractFactory {
       SystemFailure.checkFailure();
       // log.warning("Could not create 5.0 VMStats", ignore);
       // couldn't create the 1.5 version so create the old 1.4 version
-      result = new VMStats(f, id);
+      result = StatsFactory.createStatsImpl(VMStatsImpl.class, String.valueOf(id));
     }
     return result;
   }
-
-  private VMStatsContractFactory() {
-    // private so no instances allowed. static methods only
-  }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/VMStats.java b/geode-core/src/main/java/org/apache/geode/internal/statistics/VMStatsImpl.java
similarity index 90%
rename from geode-core/src/main/java/org/apache/geode/internal/statistics/VMStats.java
rename to geode-core/src/main/java/org/apache/geode/internal/statistics/VMStatsImpl.java
index a63d4f1..888ba23 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/statistics/VMStats.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/statistics/VMStatsImpl.java
@@ -14,6 +14,7 @@
  */
 package org.apache.geode.internal.statistics;
 
+import org.apache.geode.stats.common.statistics.GFSStatsImplementer;
 import org.apache.geode.stats.common.statistics.StatisticDescriptor;
 import org.apache.geode.stats.common.statistics.Statistics;
 import org.apache.geode.stats.common.statistics.StatisticsFactory;
@@ -22,14 +23,14 @@ import org.apache.geode.stats.common.statistics.StatisticsType;
 /**
  * Statistics related to a Java VM. Currently they all come from {@link java.lang.Runtime}.
  */
-public class VMStats implements VMStatsContract {
+public class VMStatsImpl implements GFSStatsImplementer, VMStats {
   private StatisticsType vmType;
   private int cpusId;
   private int freeMemoryId;
   private int totalMemoryId;
   private int maxMemoryId;
 
-  private void initializeStats(StatisticsFactory factory) {
+  public void initializeStats(StatisticsFactory factory) {
     vmType = factory.createType("VMStats", "Stats available on any java virtual machine.",
         new StatisticDescriptor[] {
             factory.createIntGauge("cpus",
@@ -53,9 +54,9 @@ public class VMStats implements VMStatsContract {
   private final Statistics vmStats;
 
 
-  public VMStats(StatisticsFactory factory, long id) {
+  public VMStatsImpl(StatisticsFactory factory, String id) {
     initializeStats(factory);
-    this.vmStats = factory.createStatistics(vmType, "vmStats", id);
+    this.vmStats = factory.createStatistics(vmType, "vmStats", Long.parseLong(id));
   }
 
   public void refresh() {
diff --git a/geode-core/src/main/java/org/apache/geode/internal/stats50/VMStats50.java b/geode-core/src/main/java/org/apache/geode/internal/stats50/VMStats50.java
index 7bd2552..639128a 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/stats50/VMStats50.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/stats50/VMStats50.java
@@ -37,7 +37,8 @@ import org.apache.geode.SystemFailure;
 import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.internal.ClassPathLoader;
 import org.apache.geode.internal.logging.LogService;
-import org.apache.geode.internal.statistics.VMStatsContract;
+import org.apache.geode.internal.statistics.VMStats;
+import org.apache.geode.stats.common.statistics.GFSStatsImplementer;
 import org.apache.geode.stats.common.statistics.StatisticDescriptor;
 import org.apache.geode.stats.common.statistics.Statistics;
 import org.apache.geode.stats.common.statistics.StatisticsFactory;
@@ -47,7 +48,7 @@ import org.apache.geode.stats.common.statistics.StatisticsType;
  * Statistics related to a Java VM. This version is hardcoded to use 1.5 MXBean stats from
  * java.lang.management.
  */
-public class VMStats50 implements VMStatsContract {
+public class VMStats50 implements VMStats, GFSStatsImplementer {
   private static final Logger logger = LogService.getLogger(VMStats50.class.getName());
 
   private StatisticsType vmType;
@@ -128,7 +129,7 @@ public class VMStats50 implements VMStatsContract {
   private int thread_cpuTimeId;
   private int thread_userTimeId;
 
-  private void initializeStats(StatisticsFactory factory) {
+  public void initializeStats(StatisticsFactory factory) {
     clBean = ManagementFactory.getClassLoadingMXBean();
     memBean = ManagementFactory.getMemoryMXBean();
     osBean = ManagementFactory.getOperatingSystemMXBean();
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/FederatingManager.java b/geode-core/src/main/java/org/apache/geode/management/internal/FederatingManager.java
index 8ce532a..54fd191 100755
--- a/geode-core/src/main/java/org/apache/geode/management/internal/FederatingManager.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/FederatingManager.java
@@ -376,9 +376,7 @@ public class FederatingManager extends Manager {
 
             // Create anonymous stats holder for Management Regions
             final HasCachePerfStats monitoringRegionStats =
-                () -> StatsFactory.createStatsImpl(CachePerfStats.class,
-                    cache.getDistributedSystem().getStatisticsFactory(),
-                    "managementRegionStats");
+                () -> StatsFactory.createStatsImpl(CachePerfStats.class, "managementRegionStats");
 
             internalArgs.setCachePerfStatsHolder(monitoringRegionStats);
 
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/LocalManager.java b/geode-core/src/main/java/org/apache/geode/management/internal/LocalManager.java
index b32eb3f..341a9e2 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/LocalManager.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/LocalManager.java
@@ -137,8 +137,7 @@ public class LocalManager extends Manager {
         // Create anonymous stats holder for Management Regions
         final HasCachePerfStats monitoringRegionStats = new HasCachePerfStats() {
           public CachePerfStats getCachePerfStats() {
-            return StatsFactory.createStatsImpl(CachePerfStats.class,
-                cache.getDistributedSystem().getStatisticsFactory(), "managementRegionStats");
+            return StatsFactory.createStatsImpl(CachePerfStats.class, "managementRegionStats");
           }
         };
 
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/beans/MemberMBeanBridge.java b/geode-core/src/main/java/org/apache/geode/management/internal/beans/MemberMBeanBridge.java
index 7480364..3ac61aa 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/beans/MemberMBeanBridge.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/beans/MemberMBeanBridge.java
@@ -77,8 +77,8 @@ import org.apache.geode.internal.process.ProcessUtils;
 import org.apache.geode.internal.statistics.GemFireStatSampler;
 import org.apache.geode.internal.statistics.HostStatHelper;
 import org.apache.geode.internal.statistics.InternalDistributedSystemStats;
-import org.apache.geode.internal.statistics.StatSamplerStats;
-import org.apache.geode.internal.statistics.VMStatsContract;
+import org.apache.geode.internal.statistics.StatSamplerStatsImpl;
+import org.apache.geode.internal.statistics.VMStats;
 import org.apache.geode.internal.statistics.platform.ProcessStats;
 import org.apache.geode.internal.stats50.VMStats50;
 import org.apache.geode.internal.tcp.ConnectionTable;
@@ -565,7 +565,7 @@ public class MemberMBeanBridge {
 
     ProcessStats processStats = sampler.getProcessStats();
 
-    StatSamplerStats samplerStats = sampler.getStatSamplerStats();
+    StatSamplerStatsImpl samplerStats = sampler.getStatSamplerStats();
     if (processStats != null) {
       systemStatsMonitor.addStatisticsToMonitor(processStats.getStatistics());
     }
@@ -575,7 +575,7 @@ public class MemberMBeanBridge {
   }
 
   public void addVMStats() {
-    VMStatsContract vmStatsContract =
+    VMStats vmStatsContract =
         system.getInternalDistributedSystemStats().getStatSampler().getVMStats();
     InternalDistributedSystemStats internalDistributedSystemStats =
         system.getInternalDistributedSystemStats();
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/wan/parallel/ParallelQueueRemovalMessageJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/wan/parallel/ParallelQueueRemovalMessageJUnitTest.java
index b2e3338..1ccb55d 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/wan/parallel/ParallelQueueRemovalMessageJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/wan/parallel/ParallelQueueRemovalMessageJUnitTest.java
@@ -70,11 +70,8 @@ import org.apache.geode.internal.cache.eviction.EvictionController;
 import org.apache.geode.internal.cache.partitioned.RegionAdvisor;
 import org.apache.geode.internal.cache.wan.AbstractGatewaySender;
 import org.apache.geode.internal.cache.wan.GatewaySenderEventImpl;
-import org.apache.geode.internal.statistics.DummyStatisticsFactory;
-import org.apache.geode.internal.statistics.StatisticsTypeFactoryImpl;
 import org.apache.geode.stats.common.internal.cache.PartitionedRegionStats;
 import org.apache.geode.stats.common.internal.cache.wan.GatewaySenderStats;
-import org.apache.geode.stats.common.statistics.StatisticsFactory;
 import org.apache.geode.stats.common.statistics.factory.StatsFactory;
 import org.apache.geode.test.fake.Fakes;
 
@@ -126,8 +123,7 @@ public class ParallelQueueRemovalMessageJUnitTest {
     when(this.queueRegion.getParallelGatewaySender()).thenReturn(this.sender);
     when(this.sender.getQueues()).thenReturn(null);
     when(this.sender.getDispatcherThreads()).thenReturn(1);
-    stats = StatsFactory.createStatsImpl(GatewaySenderStats.class, new DummyStatisticsFactory(
-        (StatisticsFactory) new StatisticsTypeFactoryImpl()), "ln");
+    stats = StatsFactory.createStatsImpl(GatewaySenderStats.class, "ln");
     when(this.sender.getStatistics()).thenReturn(stats);
   }
 
diff --git a/geode-core/src/test/java/org/apache/geode/internal/offheap/OffHeapStorageJUnitTest.java b/geode-core/src/test/java/org/apache/geode/internal/offheap/OffHeapStorageJUnitTest.java
index 10a1193..de4f2aa 100755
--- a/geode-core/src/test/java/org/apache/geode/internal/offheap/OffHeapStorageJUnitTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/offheap/OffHeapStorageJUnitTest.java
@@ -31,7 +31,6 @@ import org.apache.geode.distributed.internal.DistributionConfig;
 import org.apache.geode.distributed.internal.DistributionStatsImpl;
 import org.apache.geode.distributed.internal.InternalDistributedSystem;
 import org.apache.geode.distributed.internal.InternalLocator;
-import org.apache.geode.internal.statistics.LocalStatisticsFactory;
 import org.apache.geode.stats.common.internal.offheap.OffHeapStorageStats;
 import org.apache.geode.stats.common.statistics.StatisticsFactory;
 
@@ -123,19 +122,19 @@ public class OffHeapStorageJUnitTest {
   @Test
   public void createOffHeapStorageReturnsNullIfForceLocator() {
     System.setProperty(InternalLocator.FORCE_LOCATOR_DM_TYPE, "true");
-    assertEquals(null, OffHeapStorage.createOffHeapStorage(null, 1, null));
+    assertEquals(null, OffHeapStorage.createOffHeapStorage(1, null));
   }
 
   @Test
   public void createOffHeapStorageReturnsNullIfMemorySizeIsZero() {
-    assertEquals(null, OffHeapStorage.createOffHeapStorage(null, 0, null));
+    assertEquals(null, OffHeapStorage.createOffHeapStorage(0, null));
   }
 
   @Test
   public void exceptionIfSlabCountTooSmall() {
     StatisticsFactory statsFactory = mock(StatisticsFactory.class);
     try {
-      OffHeapStorage.createOffHeapStorage(statsFactory, OffHeapStorage.MIN_SLAB_SIZE - 1, null);
+      OffHeapStorage.createOffHeapStorage(OffHeapStorage.MIN_SLAB_SIZE - 1, null);
     } catch (IllegalArgumentException expected) {
       expected.getMessage()
           .equals("The amount of off heap memory must be at least " + OffHeapStorage.MIN_SLAB_SIZE
@@ -145,9 +144,8 @@ public class OffHeapStorageJUnitTest {
 
   @Test
   public void exceptionIfDistributedSystemNull() {
-    StatisticsFactory statsFactory = mock(StatisticsFactory.class);
     try {
-      OffHeapStorage.createOffHeapStorage(statsFactory, OffHeapStorage.MIN_SLAB_SIZE,
+      OffHeapStorage.createOffHeapStorage(OffHeapStorage.MIN_SLAB_SIZE,
           (DistributedSystem) null);
     } catch (IllegalArgumentException expected) {
       expected.getMessage().equals("InternalDistributedSystem is null");
@@ -156,20 +154,18 @@ public class OffHeapStorageJUnitTest {
 
   @Test
   public void createOffHeapStorageWorks() {
-    StatisticsFactory localStatsFactory = new LocalStatisticsFactory(null);
     InternalDistributedSystem ids = mock(InternalDistributedSystem.class);
     MemoryAllocator ma =
-        OffHeapStorage.createOffHeapStorage(localStatsFactory, OffHeapStorage.MIN_SLAB_SIZE, ids);
+        OffHeapStorage.createOffHeapStorage(OffHeapStorage.MIN_SLAB_SIZE, ids);
     System.setProperty(MemoryAllocatorImpl.FREE_OFF_HEAP_MEMORY_PROPERTY, "true");
     ma.close();
   }
 
   @Test
   public void testCreateOffHeapStorage() {
-    StatisticsFactory localStatsFactory = new LocalStatisticsFactory(null);
     OutOfOffHeapMemoryListener ooohml = mock(OutOfOffHeapMemoryListener.class);
     MemoryAllocator ma =
-        OffHeapStorage.basicCreateOffHeapStorage(localStatsFactory, 1024 * 1024, ooohml);
+        OffHeapStorage.basicCreateOffHeapStorage(1024 * 1024, ooohml);
     try {
       OffHeapStorageStats stats = ma.getStats();
       assertNotNull(stats.getStats());
diff --git a/geode-core/src/test/java/org/apache/geode/internal/statistics/CallbackSamplerTest.java b/geode-core/src/test/java/org/apache/geode/internal/statistics/CallbackSamplerTest.java
index 4cfcd52..6f72793 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/statistics/CallbackSamplerTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/statistics/CallbackSamplerTest.java
@@ -42,7 +42,7 @@ public class CallbackSamplerTest {
   @Mock
   CancelCriterion cancelCriterion;
   @Mock
-  StatSamplerStats statSamplerStats;
+  StatSamplerStatsImpl statSamplerStats;
   @Mock
   StatisticsManager statisticsManager;
   @Mock
diff --git a/geode-cq/src/main/java/org/apache/geode/cache/query/internal/cq/CqQueryImpl.java b/geode-cq/src/main/java/org/apache/geode/cache/query/internal/cq/CqQueryImpl.java
index 53937d2..30f2221 100644
--- a/geode-cq/src/main/java/org/apache/geode/cache/query/internal/cq/CqQueryImpl.java
+++ b/geode-cq/src/main/java/org/apache/geode/cache/query/internal/cq/CqQueryImpl.java
@@ -42,7 +42,6 @@ import org.apache.geode.internal.logging.InternalLogWriter;
 import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.stats.common.cache.query.CqStatistics;
 import org.apache.geode.stats.common.cache.query.internal.CqQueryVsdStats;
-import org.apache.geode.stats.common.statistics.StatisticsFactory;
 import org.apache.geode.stats.common.statistics.factory.StatsFactory;
 
 /**
@@ -134,11 +133,9 @@ public abstract class CqQueryImpl implements InternalCqQuery {
 
   void updateCqCreateStats() {
     // Initialize the VSD statistics
-    StatisticsFactory factory = cache.getDistributedSystem().getStatisticsFactory();
-    this.stats = StatsFactory.createStatsImpl(CqQueryVsdStats.class, factory, getServerCqName());
+    this.stats = StatsFactory.createStatsImpl(CqQueryVsdStats.class, getServerCqName());
     // This will not converted to a Micrometer impl. This is due to this merely being a wrapper
-    // around
-    // a real statsImpl
+    // around a real statsImpl
     this.cqStats = new CqStatisticsImpl(this);
 
     // Update statistics with CQ creation.
diff --git a/geode-cq/src/main/java/org/apache/geode/cache/query/internal/cq/CqServiceImpl.java b/geode-cq/src/main/java/org/apache/geode/cache/query/internal/cq/CqServiceImpl.java
index fffb2f1..a452ebc 100644
--- a/geode-cq/src/main/java/org/apache/geode/cache/query/internal/cq/CqServiceImpl.java
+++ b/geode-cq/src/main/java/org/apache/geode/cache/query/internal/cq/CqServiceImpl.java
@@ -80,7 +80,6 @@ import org.apache.geode.internal.logging.log4j.LocalizedMessage;
 import org.apache.geode.stats.common.cache.query.CqServiceStatistics;
 import org.apache.geode.stats.common.cache.query.internal.CqQueryVsdStats;
 import org.apache.geode.stats.common.cache.query.internal.cq.CqServiceVsdStats;
-import org.apache.geode.stats.common.statistics.StatisticsFactory;
 import org.apache.geode.stats.common.statistics.factory.StatsFactory;
 
 /**
@@ -168,8 +167,7 @@ public class CqServiceImpl implements CqService {
     this.matchingCqMap = new ConcurrentHashMap<String, HashSet<String>>();
 
     // Initialize the VSD statistics
-    StatisticsFactory factory = this.cache.getDistributedSystem().getStatisticsFactory();
-    this.cqServiceVsdStats = StatsFactory.createStatsImpl(CqServiceVsdStats.class, factory, null);
+    this.cqServiceVsdStats = StatsFactory.createStatsImpl(CqServiceVsdStats.class, null);
     // This won't be converted to a Micrometer stat, as this is not really a stat, but merely a
     // wrapper
     // around a stat Impl
diff --git a/geode-cq/src/main/java/org/apache/geode/cache/query/internal/cq/CqStatisticsImpl.java b/geode-cq/src/main/java/org/apache/geode/cache/query/internal/cq/CqStatisticsImpl.java
index 5fc6869..2e83424 100644
--- a/geode-cq/src/main/java/org/apache/geode/cache/query/internal/cq/CqStatisticsImpl.java
+++ b/geode-cq/src/main/java/org/apache/geode/cache/query/internal/cq/CqStatisticsImpl.java
@@ -15,13 +15,14 @@
 package org.apache.geode.cache.query.internal.cq;
 
 import org.apache.geode.stats.common.cache.query.CqStatistics;
+import org.apache.geode.stats.common.statistics.GFSStatsImplementer;
 
 /**
  * Provides statistical information about a CqQuery.
  *
  * @since GemFire 5.5
  */
-public class CqStatisticsImpl implements CqStatistics {
+public class CqStatisticsImpl implements CqStatistics, GFSStatsImplementer {
   private CqQueryImpl cqQuery;
 
   /**
diff --git a/geode-junit/src/main/java/org/apache/geode/test/fake/Fakes.java b/geode-junit/src/main/java/org/apache/geode/test/fake/Fakes.java
index 378e5c0..be83561 100644
--- a/geode-junit/src/main/java/org/apache/geode/test/fake/Fakes.java
+++ b/geode-junit/src/main/java/org/apache/geode/test/fake/Fakes.java
@@ -101,10 +101,12 @@ public class Fakes {
     when(system.getClock()).thenReturn(clock);
     when(system.getLogWriter()).thenReturn(logger);
     when(system.getSecurityService()).thenReturn(mock(SecurityService.class));
-    when(system.getInternalDistributedSystemStats().createAtomicStatistics(any(), any(), anyLong()))
-        .thenReturn(stats);
-    when(system.getInternalDistributedSystemStats().createAtomicStatistics(any(), any()))
-        .thenReturn(stats);
+    when(system.getInternalDistributedSystemStats().getStatisticsFactory()
+        .createAtomicStatistics(any(), any(), anyLong()))
+            .thenReturn(stats);
+    when(system.getInternalDistributedSystemStats().getStatisticsFactory()
+        .createAtomicStatistics(any(), any()))
+            .thenReturn(stats);
     when(system.getCache()).thenReturn(cache);
 
     when(distributionManager.getId()).thenReturn(member);
diff --git a/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/MicrometerStatSamplerStatsImpl.kt b/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/MicrometerStatSamplerStatsImpl.kt
new file mode 100644
index 0000000..efe7a1a
--- /dev/null
+++ b/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/MicrometerStatSamplerStatsImpl.kt
@@ -0,0 +1,90 @@
+/*
+ * 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.statistics
+
+import org.apache.geode.internal.statistics.StatSampleStats
+import org.apache.geode.statistics.internal.micrometer.impl.CounterStatisticMeter
+import org.apache.geode.statistics.internal.micrometer.impl.GaugeStatisticMeter
+import org.apache.geode.statistics.internal.micrometer.impl.MicrometerMeterGroup
+import org.apache.geode.statistics.micrometer.MicrometerStatsImplementer
+import org.apache.geode.stats.common.statistics.StatisticsFactory
+
+/**
+ * Statistics related to the statistic sampler.
+ */
+class MicrometerStatSamplerStats(factory: StatisticsFactory, id: String) : MicrometerMeterGroup(factory, id), StatSampleStats, MicrometerStatsImplementer {
+
+    private val statSamplerSampleCountMeter = CounterStatisticMeter("stat.sample.count", "Total number of samples taken by this sampler.")
+    @Deprecated("For Micrometer one should really be using Timers rather than current implemented Counters")
+    private val statSamplerSampleTimeTimer = CounterStatisticMeter("stat.sample.timer", "Total amount of time spent taking samples.")
+    private val statSamplerDelayDurationMeter = GaugeStatisticMeter("stat.sample.delay.timer",
+            "Actual duration of sampling delay taken before taking this sample.")
+    private val statSamplerStatisticResoucesCountMeter = GaugeStatisticMeter("stat.sample.resource.count",
+            "Current number of statistic resources being sampled by this sampler.")
+    private val statSamplerJVMPausesMeter = CounterStatisticMeter("stat.sample.jvm.pause.count",
+            "Total number of JVM pauses (which may or may not be full GC pauses) detected by this sampler. " +
+                    "A JVM pause is defined as a system event which kept the statistics sampler thread from sampling for 3000 or more milliseconds. " +
+                    "This threshold can be customized by setting the system property gemfire.statSamplerDelayThreshold (units are milliseconds).")
+    private val statSamplerSampleCallbackCountMeter = GaugeStatisticMeter("stat.sample.callbacks.count",
+            "Current number of statistics that are sampled using callbacks.", arrayOf("status", "success"))
+    private val statSamplerSampleCallbackErrorCountMeter = CounterStatisticMeter("stat.sample.callbacks.count",
+            "Total number of exceptions thrown by callbacks when performing sampling", arrayOf("status", "error"))
+    private val statSamplerSampleCallbackTimer = CounterStatisticMeter("stat.sample.callbacks.timer", "Total amount of time invoking sampling callbacks")
+
+    override fun initializeStaticMeters() {
+        registerMeter(statSamplerDelayDurationMeter)
+        registerMeter(statSamplerJVMPausesMeter)
+        registerMeter(statSamplerSampleCallbackCountMeter)
+        registerMeter(statSamplerSampleCallbackErrorCountMeter)
+        registerMeter(statSamplerSampleCountMeter)
+        registerMeter(statSamplerStatisticResoucesCountMeter)
+        registerMeter(statSamplerSampleCallbackTimer)
+        registerMeter(statSamplerSampleTimeTimer)
+    }
+
+
+    fun tookSample(nanosSpentWorking: Long, statResources: Int, nanosSpentSleeping: Long) {
+        statSamplerSampleCountMeter.increment()
+        statSamplerSampleTimeTimer.increment(nanosSpentWorking / 1000000)
+        statSamplerDelayDurationMeter.increment(nanosSpentSleeping / 1000000)
+        statSamplerStatisticResoucesCountMeter.increment(statResources)
+    }
+
+    override fun incJvmPauses() {
+        statSamplerJVMPausesMeter.increment()
+    }
+
+    override fun incSampleCallbackErrors(delta: Int) {
+        statSamplerSampleCallbackErrorCountMeter.increment(delta)
+    }
+
+    override fun setSampleCallbacks(count: Int) {
+        statSamplerSampleCallbackCountMeter.setValue(count)
+    }
+
+    override fun incSampleCallbackDuration(delta: Long) {
+        statSamplerSampleCallbackTimer.increment(delta)
+    }
+
+    override fun getSampleCount(): Int = statSamplerSampleCountMeter.getValue().toInt()
+
+    override fun getSampleTime(): Long = statSamplerSampleTimeTimer.getValue()
+
+    override fun getDelayDuration(): Int = statSamplerDelayDurationMeter.getValue().toInt()
+
+    override fun getStatResources(): Int = statSamplerStatisticResoucesCountMeter.getValue().toInt()
+
+    override fun getJvmPauses(): Int = statSamplerJVMPausesMeter.getValue().toInt()
+}
diff --git a/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/micrometer/MicrometerStatisticsFactoryImpl.kt b/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/micrometer/MicrometerStatisticsFactoryImpl.kt
index 5c44415..55e6a7b 100644
--- a/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/micrometer/MicrometerStatisticsFactoryImpl.kt
+++ b/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/micrometer/MicrometerStatisticsFactoryImpl.kt
@@ -107,4 +107,12 @@ class MicrometerStatisticsFactoryImpl(vararg meterRegistries: MeterRegistry = ar
     override fun createTypesFromXml(reader: Reader): Array<StatisticsType> {
         TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
     }
+
+    override fun findStatisticsByUniqueId(uniqueId: Long): Statistics {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun getStatsList(): MutableList<Any?> {
+        return super.getStatsList()
+    }
 }
\ No newline at end of file
diff --git a/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/resourcemanger/MicrometerResourceManagerStats.kt b/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/resourcemanger/MicrometerResourceManagerStats.kt
index 9b3ccc5..1ba7ebe 100644
--- a/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/resourcemanger/MicrometerResourceManagerStats.kt
+++ b/geode-micrometer-stats/src/main/kotlin/org/apache/geode/statistics/resourcemanger/MicrometerResourceManagerStats.kt
@@ -28,7 +28,7 @@ import org.apache.geode.statistics.util.NOW_NANOS
 class MicrometerResourceManagerStats() :
         MicrometerMeterGroup(statisticsFactory = null,groupName = "ResourceManagerStats"), ResourceManagerStats, MicrometerStatsImplementer {
 
-    constructor(statisticsFactory: StatisticsFactory?, name: String?): this()
+    constructor(statisticsFactory: StatisticsFactory, name: String?): this()
 
     private val resourceRebalanceInProgressMeter = GaugeStatisticMeter("manager.resources.rebalance.inprogress.count", "Current number of cache rebalance operations being directed by this process.")
     private val resourceRebalanceCompletedMeter = CounterStatisticMeter("manager.resources.rebalance.completed.count", "Total number of cache rebalance operations directed by this process.")
diff --git a/geode-stats-common/src/main/java/org/apache/geode/internal/statistics/StatSampleStats.java b/geode-stats-common/src/main/java/org/apache/geode/internal/statistics/StatSampleStats.java
new file mode 100644
index 0000000..ed51be3
--- /dev/null
+++ b/geode-stats-common/src/main/java/org/apache/geode/internal/statistics/StatSampleStats.java
@@ -0,0 +1,23 @@
+package org.apache.geode.internal.statistics;
+
+import org.apache.geode.stats.common.Stats;
+
+public interface StatSampleStats extends Stats {
+  void incJvmPauses();
+
+  void incSampleCallbackErrors(int delta);
+
+  void setSampleCallbacks(int count);
+
+  void incSampleCallbackDuration(long delta);
+
+  int getSampleCount();
+
+  long getSampleTime();
+
+  int getDelayDuration();
+
+  int getStatResources();
+
+  int getJvmPauses();
+}
diff --git a/geode-core/src/main/java/org/apache/geode/internal/statistics/VMStatsContract.java b/geode-stats-common/src/main/java/org/apache/geode/internal/statistics/VMStats.java
similarity index 93%
rename from geode-core/src/main/java/org/apache/geode/internal/statistics/VMStatsContract.java
rename to geode-stats-common/src/main/java/org/apache/geode/internal/statistics/VMStats.java
index 7c65281..6e8628c 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/statistics/VMStatsContract.java
+++ b/geode-stats-common/src/main/java/org/apache/geode/internal/statistics/VMStats.java
@@ -14,15 +14,15 @@
  */
 package org.apache.geode.internal.statistics;
 
+import org.apache.geode.stats.common.Stats;
+
 /**
  * Describes the contract a VMStats implementation must implement.
  * <p>
  * I named this VMStatsContract because an implementation named VMStats already exists and I didn't
  * want to rename it because of the svn merge issues.
- *
- * @see VMStatsContractFactory
  */
-public interface VMStatsContract {
+public interface VMStats extends Stats {
   /**
    * Called by sampler when it wants the VMStats statistics values to be refetched from the system.
    */
diff --git a/geode-stats-common/src/main/java/org/apache/geode/stats/common/statistics/StatisticsFactory.java b/geode-stats-common/src/main/java/org/apache/geode/stats/common/statistics/StatisticsFactory.java
index f037c5b..0ed6edb 100644
--- a/geode-stats-common/src/main/java/org/apache/geode/stats/common/statistics/StatisticsFactory.java
+++ b/geode-stats-common/src/main/java/org/apache/geode/stats/common/statistics/StatisticsFactory.java
@@ -15,6 +15,9 @@
 package org.apache.geode.stats.common.statistics;
 
 
+import java.util.Collections;
+import java.util.List;
+
 /**
  * Instances of this interface provide methods that create instances of {@link Statistics}. It can
  * also be used to create instances of {@link StatisticDescriptor} and {@link StatisticsType}
@@ -34,22 +37,22 @@ package org.apache.geode.stats.common.statistics;
  * has two stats whose values always increase:
  *
  * <pre>
-    StatisticsFactory f = ...;
-    StatisticsType t = f.createType(
-        "StatSampler",
-        "Stats on the statistic sampler.",
-        new StatisticDescriptor[] {
-            f.createIntCounter("sampleCount",
-                               "Total number of samples taken by this sampler.",
-                               "samples"),
-            f.createLongCounter("sampleTime",
-                                "Total amount of time spent taking samples.",
-                                "milliseconds"),
-        }
-    );
-    this.samplerStats = f.createStatistics(t, "statSampler");
-    this.sampleCountId = this.samplerStats.nameToId("sampleCount");
-    this.sampleTimeId = this.samplerStats.nameToId("sampleTime");
+ * StatisticsFactory f = ...;
+ * StatisticsType t = f.createType(
+ * "StatSampler",
+ * "Stats on the statistic sampler.",
+ * new StatisticDescriptor[] {
+ * f.createIntCounter("sampleCount",
+ * "Total number of samples taken by this sampler.",
+ * "samples"),
+ * f.createLongCounter("sampleTime",
+ * "Total amount of time spent taking samples.",
+ * "milliseconds"),
+ * }
+ * );
+ * this.samplerStats = f.createStatistics(t, "statSampler");
+ * this.sampleCountId = this.samplerStats.nameToId("sampleCount");
+ * this.sampleTimeId = this.samplerStats.nameToId("sampleTime");
  * </pre>
  *
  * Later on the stat ids can be used to increment the stats:
@@ -62,37 +65,35 @@ package org.apache.geode.stats.common.statistics;
  * The following is an example of how to create the same type using XML. The XML data:
  *
  * <pre>
-    &lt;?xml version="1.0" encoding="UTF-8"?&gt;
-    &lt;!DOCTYPE statistics PUBLIC
-      "-//GemStone Systems, Inc.//GemFire Statistics Type//EN"
-      "http://www.gemstone.com/dtd/statisticsType.dtd"&gt;
-    &lt;statistics&gt;
-      &lt;type name="StatSampler"&gt;
-        &lt;description&gt;Stats on the statistic sampler.&lt;/description&gt;
-        &lt;stat name="sampleCount" storage="int" counter="true"&gt;
-          &lt;description&gt;Total number of samples taken by this sampler.&lt;/description&gt;
-          &lt;unit&gt;samples&lt;/unit&gt;
-        &lt;/stat&gt;
-        &lt;stat name="sampleTime" storage="long" counter="true"&gt;
-          &lt;description&gt;Total amount of time spent taking samples.&lt;/description&gt;
-          &lt;unit&gt;milliseconds&lt;/unit&gt;
-        &lt;/stat&gt;
-      &lt;/type&gt;
-    &lt;/statistics&gt;
+ * &lt;?xml version="1.0" encoding="UTF-8"?&gt;
+ * &lt;!DOCTYPE statistics PUBLIC
+ * "-//GemStone Systems, Inc.//GemFire Statistics Type//EN"
+ * "http://www.gemstone.com/dtd/statisticsType.dtd"&gt;
+ * &lt;statistics&gt;
+ * &lt;type name="StatSampler"&gt;
+ * &lt;description&gt;Stats on the statistic sampler.&lt;/description&gt;
+ * &lt;stat name="sampleCount" storage="int" counter="true"&gt;
+ * &lt;description&gt;Total number of samples taken by this sampler.&lt;/description&gt;
+ * &lt;unit&gt;samples&lt;/unit&gt;
+ * &lt;/stat&gt;
+ * &lt;stat name="sampleTime" storage="long" counter="true"&gt;
+ * &lt;description&gt;Total amount of time spent taking samples.&lt;/description&gt;
+ * &lt;unit&gt;milliseconds&lt;/unit&gt;
+ * &lt;/stat&gt;
+ * &lt;/type&gt;
+ * &lt;/statistics&gt;
  * </pre>
  *
  * The code to create the type:
  *
  * <pre>
-      StatisticsFactory f = ...;
-      Reader r = new InputStreamReader("fileContainingXmlData"));
-      StatisticsType type = f.createTypesFromXml(r)[0];
+ * StatisticsFactory f = ...;
+ * Reader r = new InputStreamReader("fileContainingXmlData"));
+ * StatisticsType type = f.createTypesFromXml(r)[0];
  * </pre>
  * <P>
  *
  * @see <A href="package-summary.html#statistics">Package introduction</A>
- *
- *
  * @since GemFire 3.0
  */
 public interface StatisticsFactory extends StatisticsTypeFactory {
@@ -120,6 +121,8 @@ public interface StatisticsFactory extends StatisticsTypeFactory {
    */
   Statistics createStatistics(StatisticsType type, String textId, long numericId);
 
+  Statistics findStatisticsByUniqueId(long uniqueId);
+
   /**
    * Creates and returns a {@link Statistics} instance of the given {@link StatisticsType type} with
    * default ids.
@@ -162,4 +165,8 @@ public interface StatisticsFactory extends StatisticsTypeFactory {
   default String getType() {
     return "GeodeStats";
   }
+
+  default List getStatsList() {
+    return Collections.emptyList();
+  }
 }
diff --git a/geode-stats-common/src/main/java/org/apache/geode/stats/common/statistics/factory/StatsFactory.java b/geode-stats-common/src/main/java/org/apache/geode/stats/common/statistics/factory/StatsFactory.java
index cbbfb93..560269f 100644
--- a/geode-stats-common/src/main/java/org/apache/geode/stats/common/statistics/factory/StatsFactory.java
+++ b/geode-stats-common/src/main/java/org/apache/geode/stats/common/statistics/factory/StatsFactory.java
@@ -125,7 +125,7 @@ public class StatsFactory {
           statsFactory.resolvedStatsImplForClass.get(interfaceClazz);
       return (RegionPerfStats) resolvedLocatorClassImpl
           .getDeclaredConstructor(StatisticsFactory.class, CachePerfStats.class, String.class)
-          .newInstance(statsFactory.getStatisticsFactory(), cachePerfStats, regionName);
+          .newInstance(statsFactory.getFactory(), cachePerfStats, regionName);
     } catch (InstantiationException | IllegalAccessException | NoSuchMethodException
         | InvocationTargetException e) {
       e.printStackTrace();
@@ -134,14 +134,14 @@ public class StatsFactory {
   }
 
   public static boolean isLegacyGeodeStats() {
-    return statsFactory.getStatisticsFactory().getType().equals("GeodeStats");
+    return statsFactory.getFactory().getType().equals("GeodeStats");
   }
 
   public static StatisticsFactory getStatisticsFactory() {
     return statsFactory.statisticsFactory;
   }
 
-  private StatisticsFactory getStatisticsFactory() {
+  private StatisticsFactory getFactory() {
     return statisticsFactory;
   }
 
@@ -163,7 +163,8 @@ public class StatsFactory {
             .put(CachePerfStats.class, (Class<? extends StatsImplementer>) aClass));
   }
 
-  private StatsImplementer createConnectionStatInstanceFromClass(String locatorName, PoolStats poolStats) {
+  private StatsImplementer createConnectionStatInstanceFromClass(String locatorName,
+      PoolStats poolStats) {
     try {
       Class<? extends StatsImplementer> resolvedLocatorClassImpl =
           resolveImplementationForClass(ConnectionStats.class);