You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by ji...@apache.org on 2019/06/28 18:10:15 UTC

[geode] branch develop updated: GEODE-6861: separate static config object from runtime info in the Cl… (#3754)

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

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


The following commit(s) were added to refs/heads/develop by this push:
     new 2c39f92  GEODE-6861: separate static config object from runtime info in the Cl… (#3754)
2c39f92 is described below

commit 2c39f92dc5fa129058144a9ec16606092dc3d51e
Author: Jinmei Liao <ji...@pivotal.io>
AuthorDate: Fri Jun 28 11:10:02 2019 -0700

    GEODE-6861: separate static config object from runtime info in the Cl… (#3754)
    
    Co-authored-by: Joris Melchior <jo...@gmail.com>
    
    * use ConfigRealizer to retrieve the runtime information for configuration on each member
    * list result would return a List of Response object which has a configuration object and a list runtime objects
    * use existing object for runtime member info and move them to geode-management module.
---
 .../geode/test/junit/rules/HttpResponseAssert.java |   2 +-
 .../resources/ManagementClientCreateRegion.java    |   7 +-
 ...ateRegionWithDiskstoreAndSecurityDUnitTest.java |   6 +-
 .../rest/ClientClusterManagementSSLTest.java       |  10 +-
 .../ClientClusterManagementServiceDunitTest.java   |   8 +-
 ...ClusterManagementLocatorReconnectDunitTest.java |   3 +-
 .../rest/ClusterManagementServiceOnServerTest.java |   2 +-
 .../rest/ListIndexManagementDUnitTest.java         |  26 +--
 .../rest/ListRegionManagementDunitTest.java        |  42 ++--
 .../rest/ManagementRequestLoggingDUnitTest.java    |   2 +-
 .../rest/MemberManagementServiceDunitTest.java     |  30 ++-
 .../internal/rest/RegionManagementDunitTest.java   |  11 +-
 .../internal/DisabledClusterConfigTest.java        |   2 +-
 .../integrationTest/resources/assembly_content.txt |  11 +-
 .../internal/api/RegionAPIDUnitTest.java           |   6 +-
 .../RegionConfigMutatorIntegrationTest.java        |   2 +-
 .../management/internal/CacheElementOperation.java |   2 +-
 .../api/GeodeClusterManagementServiceBuilder.java  |   2 +-
 .../api/LocatorClusterManagementService.java       | 194 ++++++++++-------
 .../internal/cli/commands/CreateIndexCommand.java  |  13 +-
 .../cli/commands/DescribeMemberCommand.java        |   6 +-
 ...Function.java => CacheRealizationFunction.java} |  55 +++--
 .../functions/GatewayReceiverCreateFunction.java   |   3 +-
 .../functions/GetMemberInformationFunction.java    | 153 ++++++-------
 .../cli/functions/RegionCreateFunction.java        |   3 +-
 .../mutators/ConfigurationManager.java             |   5 +-
 .../mutators/GatewayReceiverConfigManager.java     |   2 +-
 .../mutators/MemberConfigManager.java              | 154 -------------
 .../configuration/mutators/PdxManager.java         |   2 +-
 .../mutators/RegionConfigManager.java              |  43 +---
 .../realizers/ConfigurationRealizer.java           |  17 +-
 .../realizers/GatewayReceiverRealizer.java         |  19 +-
 .../realizers/MemberConfigRealizer.java            |  81 +++++++
 .../realizers/RegionConfigRealizer.java            |  27 ++-
 .../configuration/validators/MemberValidator.java  |  34 ++-
 .../sanctioned-geode-core-serializables.txt        |   5 +-
 .../sanctioned-geode-management-serializables.txt  |   5 +-
 .../cache/configuration/RegionConfigTest.java      |  16 ++
 .../internal/api/ClusterManagementResultTest.java  |  37 +++-
 .../api/LocatorClusterManagementServiceTest.java   |  33 ++-
 .../cli/commands/CreateIndexCommandTest.java       |   7 +-
 .../mutators/MemberConfigManagerTest.java          | 240 ---------------------
 .../mutators/RegionConfigManagerTest.java          |  29 +--
 .../validators/MemberValidatorTest.java            |  18 +-
 .../assertions/ClusterManagementResultAssert.java  |  27 +--
 .../cache/configuration/GatewayReceiverConfig.java |   3 +-
 .../apache/geode/cache/configuration/PdxType.java  |   2 +-
 .../geode/cache/configuration/RegionConfig.java    |  12 +-
 .../management/api/ClusterManagementResult.java    |  37 +++-
 .../management/api/ClusterManagementService.java   |  14 +-
 .../apache/geode/management/api/RespondsWith.java  |  46 +++-
 .../api/{RespondsWith.java => Response.java}       |  39 +++-
 .../geode/management/api/RestfulEndpoint.java      |   5 +-
 .../management/configuration/MemberConfig.java     |   3 +-
 .../configuration/RuntimeMemberConfig.java         | 184 ----------------
 .../internal/ClientClusterManagementService.java   |  12 +-
 .../geode/management/runtime}/CacheServerInfo.java |  32 ++-
 .../management/runtime}/MemberInformation.java     |  20 +-
 .../geode/management/runtime/RuntimeInfo.java      |  10 +-
 .../RuntimeRegionInfo.java}                        |  29 +--
 .../configuration/CacheElementJsonMappingTest.java |  60 ++----
 .../cache/configuration/CacheElementTest.java      |  14 +-
 .../ClientClusterManagementServiceDUnitTest.java   |  45 ++--
 .../management/client/ConfigurePDXDUnitTest.java   |  11 +-
 .../client/MemberManagementServiceDUnitTest.java   |  50 +++--
 .../rest/GatewayManagementIntegrationTest.java     |  10 +-
 ...MemberManagementServiceRestIntegrationTest.java |  42 ++--
 .../internal/rest/PdxManagementTest.java           |   3 +-
 .../rest/RegionManagementIntegrationTest.java      |  13 --
 .../controllers/GatewayManagementController.java   |   7 +-
 .../controllers/MemberManagementController.java    |  17 +-
 .../rest/controllers/PdxManagementController.java  |   2 +-
 .../controllers/RegionManagementController.java    |  47 ++--
 .../rest/security/RestSecurityConfiguration.java   |   4 +-
 74 files changed, 936 insertions(+), 1239 deletions(-)

diff --git a/geode-assembly/geode-assembly-test/src/main/java/org/apache/geode/test/junit/rules/HttpResponseAssert.java b/geode-assembly/geode-assembly-test/src/main/java/org/apache/geode/test/junit/rules/HttpResponseAssert.java
index 65fd4ae..2a28daa 100644
--- a/geode-assembly/geode-assembly-test/src/main/java/org/apache/geode/test/junit/rules/HttpResponseAssert.java
+++ b/geode-assembly/geode-assembly-test/src/main/java/org/apache/geode/test/junit/rules/HttpResponseAssert.java
@@ -78,7 +78,7 @@ public class HttpResponseAssert extends AbstractAssert<HttpResponseAssert, HttpR
   }
 
   @SuppressWarnings("unchecked")
-  public <R extends CacheElement> ClusterManagementResult<R> getClusterManagementResult()
+  public <R extends CacheElement> ClusterManagementResult getClusterManagementResult()
       throws Exception {
     ObjectMapper mapper = new ObjectMapper();
     return mapper.readValue(responseBody, ClusterManagementResult.class);
diff --git a/geode-assembly/src/acceptanceTest/resources/ManagementClientCreateRegion.java b/geode-assembly/src/acceptanceTest/resources/ManagementClientCreateRegion.java
index b83c6d2..c80065d 100644
--- a/geode-assembly/src/acceptanceTest/resources/ManagementClientCreateRegion.java
+++ b/geode-assembly/src/acceptanceTest/resources/ManagementClientCreateRegion.java
@@ -20,7 +20,7 @@ import org.apache.geode.cache.configuration.RegionType;
 import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.api.ClusterManagementService;
 import org.apache.geode.management.client.ClusterManagementServiceBuilder;
-import org.apache.geode.management.configuration.RuntimeRegionConfig;
+import org.apache.geode.management.runtime.RuntimeRegionInfo;
 
 public class ManagementClientCreateRegion {
   public static void main(String[] args) throws Exception {
@@ -47,14 +47,15 @@ public class ManagementClientCreateRegion {
     config.setName(regionName);
     config.setType(RegionType.REPLICATE);
 
-    ClusterManagementResult<RegionConfig> result = cms.create(config);
+    ClusterManagementResult<?, ?> result = cms.create(config);
 
     if (!result.isSuccessful()) {
       throw new RuntimeException(
           "Failure creating region: " + result.getStatusMessage());
     }
 
-    ClusterManagementResult<RuntimeRegionConfig> listResult = cms.list(new RegionConfig());
+    ClusterManagementResult<RegionConfig, RuntimeRegionInfo> listResult =
+        cms.list(new RegionConfig());
     if (!listResult.isSuccessful()) {
       throw new RuntimeException("failed " + listResult.getStatusMessage());
     }
diff --git a/geode-assembly/src/distributedTest/java/org/apache/geode/management/client/CreateRegionWithDiskstoreAndSecurityDUnitTest.java b/geode-assembly/src/distributedTest/java/org/apache/geode/management/client/CreateRegionWithDiskstoreAndSecurityDUnitTest.java
index 0b46ad2..e76ceb4 100644
--- a/geode-assembly/src/distributedTest/java/org/apache/geode/management/client/CreateRegionWithDiskstoreAndSecurityDUnitTest.java
+++ b/geode-assembly/src/distributedTest/java/org/apache/geode/management/client/CreateRegionWithDiskstoreAndSecurityDUnitTest.java
@@ -84,7 +84,7 @@ public class CreateRegionWithDiskstoreAndSecurityDUnitTest {
         ClusterManagementServiceBuilder.buildWithHostAddress()
             .setHostAddress("localhost", locator.getHttpPort())
             .setCredentials("user", "user").build();
-    ClusterManagementResult<RegionConfig> result = client.create(regionConfig);
+    ClusterManagementResult<?, ?> result = client.create(regionConfig);
     assertThat(result.isSuccessful()).isFalse();
     assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.UNAUTHORIZED);
     assertThat(result.getStatusMessage()).isEqualTo("user not authorized for DATA:MANAGE");
@@ -109,7 +109,7 @@ public class CreateRegionWithDiskstoreAndSecurityDUnitTest {
         ClusterManagementServiceBuilder.buildWithHostAddress()
             .setHostAddress("localhost", locator.getHttpPort())
             .setCredentials("data", "data").build();
-    ClusterManagementResult<RegionConfig> result = client.create(regionConfig);
+    ClusterManagementResult<?, ?> result = client.create(regionConfig);
     assertThat(result.isSuccessful()).isFalse();
     assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.UNAUTHORIZED);
     assertThat(result.getStatusMessage()).isEqualTo("data not authorized for CLUSTER:WRITE:DISK");
@@ -136,7 +136,7 @@ public class CreateRegionWithDiskstoreAndSecurityDUnitTest {
         ClusterManagementServiceBuilder.buildWithHostAddress()
             .setHostAddress("localhost", locator.getHttpPort())
             .setCredentials("data,cluster", "data,cluster").build();
-    ClusterManagementResult<RegionConfig> result = client.create(regionConfig);
+    ClusterManagementResult<?, ?> result = client.create(regionConfig);
     assertThat(result.isSuccessful()).isTrue();
 
     gfsh.executeAndAssertThat("describe disk-store --name=DISKSTORE --member=server-1")
diff --git a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ClientClusterManagementSSLTest.java b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ClientClusterManagementSSLTest.java
index 6698d52..5d19614 100644
--- a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ClientClusterManagementSSLTest.java
+++ b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ClientClusterManagementSSLTest.java
@@ -105,7 +105,7 @@ public class ClientClusterManagementSSLTest {
           .setHostnameVerifier(hostnameVerifier)
           .setCredentials("dataManage", "dataManage").build();
 
-      ClusterManagementResult<RegionConfig> result = cmsClient.create(region);
+      ClusterManagementResult<?, ?> result = cmsClient.create(region);
       assertThat(result.isSuccessful()).isTrue();
       assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.OK);
       assertThat(result.getMemberStatuses()).extracting(RealizationResult::getMemberName)
@@ -146,7 +146,7 @@ public class ClientClusterManagementSSLTest {
           .setHostnameVerifier(hostnameVerifier)
           .setCredentials("dataManage", "wrongPassword").build();
 
-      ClusterManagementResult<RegionConfig> result = cmsClient.create(region);
+      ClusterManagementResult<?, ?> result = cmsClient.create(region);
       assertThat(result.isSuccessful()).isFalse();
       assertThat(result.getStatusCode())
           .isEqualTo(ClusterManagementResult.StatusCode.UNAUTHENTICATED);
@@ -170,7 +170,7 @@ public class ClientClusterManagementSSLTest {
           .setHostnameVerifier(hostnameVerifier)
           .build();
 
-      ClusterManagementResult<RegionConfig> result = cmsClient.create(region);
+      ClusterManagementResult<?, ?> result = cmsClient.create(region);
       assertThat(result.isSuccessful()).isFalse();
       assertThat(result.getStatusCode())
           .isEqualTo(ClusterManagementResult.StatusCode.UNAUTHENTICATED);
@@ -193,7 +193,7 @@ public class ClientClusterManagementSSLTest {
           .setHostnameVerifier(hostnameVerifier)
           .setCredentials("dataManage", null).build();
 
-      ClusterManagementResult<RegionConfig> result = cmsClient.create(region);
+      ClusterManagementResult<?, ?> result = cmsClient.create(region);
       assertThat(result.isSuccessful()).isFalse();
       assertThat(result.getStatusCode())
           .isEqualTo(ClusterManagementResult.StatusCode.UNAUTHENTICATED);
@@ -216,7 +216,7 @@ public class ClientClusterManagementSSLTest {
           .setHostnameVerifier(hostnameVerifier)
           .setCredentials("dataRead", "dataRead").build();
 
-      ClusterManagementResult<RegionConfig> result = cmsClient.create(region);
+      ClusterManagementResult<?, ?> result = cmsClient.create(region);
       assertThat(result.isSuccessful()).isFalse();
       assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.UNAUTHORIZED);
     });
diff --git a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ClientClusterManagementServiceDunitTest.java b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ClientClusterManagementServiceDunitTest.java
index 2eb11fd..9461395 100644
--- a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ClientClusterManagementServiceDunitTest.java
+++ b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ClientClusterManagementServiceDunitTest.java
@@ -61,7 +61,7 @@ public class ClientClusterManagementServiceDunitTest {
     region.setName("customer");
     region.setType(RegionType.PARTITION);
 
-    ClusterManagementResult<RegionConfig> result = cmsClient.create(region);
+    ClusterManagementResult<?, ?> result = cmsClient.create(region);
 
     assertThat(result.isSuccessful()).isTrue();
     assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.OK);
@@ -79,7 +79,7 @@ public class ClientClusterManagementServiceDunitTest {
     region.setName("orders");
     region.setType(RegionType.PARTITION);
 
-    ClusterManagementResult<RegionConfig> result = cmsClient.create(region);
+    ClusterManagementResult<?, ?> result = cmsClient.create(region);
 
     assertThat(result.isSuccessful()).isTrue();
     assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.OK);
@@ -93,7 +93,7 @@ public class ClientClusterManagementServiceDunitTest {
     RegionConfig region = new RegionConfig();
     region.setName("__test");
 
-    ClusterManagementResult<RegionConfig> result = cmsClient.create(region);
+    ClusterManagementResult<?, ?> result = cmsClient.create(region);
     assertThat(result.isSuccessful()).isFalse();
     assertThat(result.getStatusCode())
         .isEqualTo(ClusterManagementResult.StatusCode.ILLEGAL_ARGUMENT);
@@ -106,7 +106,7 @@ public class ClientClusterManagementServiceDunitTest {
     region.setType(RegionType.PARTITION);
     region.setGroup(groupA);
 
-    ClusterManagementResult<RegionConfig> result = cmsClient.create(region);
+    ClusterManagementResult<?, ?> result = cmsClient.create(region);
 
     assertThat(result.isSuccessful()).isTrue();
     assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.OK);
diff --git a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ClusterManagementLocatorReconnectDunitTest.java b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ClusterManagementLocatorReconnectDunitTest.java
index 15669a1..308ba00 100644
--- a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ClusterManagementLocatorReconnectDunitTest.java
+++ b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ClusterManagementLocatorReconnectDunitTest.java
@@ -31,7 +31,6 @@ import org.apache.geode.cache.configuration.RegionConfig;
 import org.apache.geode.cache.configuration.RegionType;
 import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.api.RealizationResult;
-import org.apache.geode.management.configuration.RuntimeRegionConfig;
 import org.apache.geode.test.dunit.IgnoredException;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
@@ -75,7 +74,7 @@ public class ClusterManagementLocatorReconnectDunitTest {
     ObjectMapper mapper = new ObjectMapper();
     String json = mapper.writeValueAsString(regionConfig);
 
-    ClusterManagementResult<RuntimeRegionConfig> result =
+    ClusterManagementResult<?, ?> result =
         restClient.doPostAndAssert("/regions", json, "test", "test")
             .hasStatusCode(201)
             .getClusterManagementResult();
diff --git a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ClusterManagementServiceOnServerTest.java b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ClusterManagementServiceOnServerTest.java
index 6890937..e4f3a7e 100644
--- a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ClusterManagementServiceOnServerTest.java
+++ b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ClusterManagementServiceOnServerTest.java
@@ -125,7 +125,7 @@ public class ClusterManagementServiceOnServerTest implements Serializable {
           buildWithCache().setCache(ClusterStartupRule.getCache())
               .build();
       assertThat(service).isNotNull();
-      ClusterManagementResult<RegionConfig> clusterManagementResult =
+      ClusterManagementResult<?, ?> clusterManagementResult =
           service.create(regionConfig);
       assertThat(clusterManagementResult.isSuccessful()).isTrue();
     });
diff --git a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ListIndexManagementDUnitTest.java b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ListIndexManagementDUnitTest.java
index 36f295c..2c1ce65 100644
--- a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ListIndexManagementDUnitTest.java
+++ b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ListIndexManagementDUnitTest.java
@@ -31,7 +31,7 @@ import org.apache.geode.cache.configuration.RegionType;
 import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.api.ClusterManagementService;
 import org.apache.geode.management.client.ClusterManagementServiceBuilder;
-import org.apache.geode.management.configuration.RuntimeRegionConfig;
+import org.apache.geode.management.runtime.RuntimeInfo;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
 import org.apache.geode.test.junit.rules.GfshCommandRule;
@@ -80,17 +80,17 @@ public class ListIndexManagementDUnitTest {
 
   @Test
   public void listRegion() {
-    List<RuntimeRegionConfig> result =
-        cms.list(new RegionConfig()).getResult();
+    List<RegionConfig> result =
+        cms.list(new RegionConfig()).getConfigResult();
     assertThat(result).hasSize(1);
   }
 
   @Test
   public void getRegion() throws Exception {
     regionConfig.setName("region1");
-    List<RuntimeRegionConfig> regions = cms.get(regionConfig).getResult();
+    List<RegionConfig> regions = cms.get(regionConfig).getConfigResult();
     assertThat(regions).hasSize(1);
-    RuntimeRegionConfig region = regions.get(0);
+    RegionConfig region = regions.get(0);
     List<RegionConfig.Index> indexes = region.getIndexes();
     assertThat(indexes).hasSize(2);
   }
@@ -106,8 +106,8 @@ public class ListIndexManagementDUnitTest {
   public void listIndexForOneRegion() throws Exception {
     RegionConfig.Index index = new RegionConfig.Index();
     index.setRegionName("region1");
-    ClusterManagementResult<RegionConfig.Index> list = cms.list(index);
-    List<RegionConfig.Index> result = list.getResult();
+    ClusterManagementResult<RegionConfig.Index, RuntimeInfo> list = cms.list(index);
+    List<RegionConfig.Index> result = list.getConfigResult();
     assertThat(result).hasSize(2);
   }
 
@@ -116,8 +116,8 @@ public class ListIndexManagementDUnitTest {
     RegionConfig.Index index = new RegionConfig.Index();
     index.setRegionName("region1");
     index.setName("index1");
-    ClusterManagementResult<RegionConfig.Index> list = cms.get(index);
-    List<RegionConfig.Index> result = list.getResult();
+    ClusterManagementResult<RegionConfig.Index, RuntimeInfo> list = cms.get(index);
+    List<RegionConfig.Index> result = list.getConfigResult();
     assertThat(result).hasSize(1);
     RegionConfig.Index runtimeIndex = result.get(0);
     assertThat(runtimeIndex.getRegionName()).isEqualTo("region1");
@@ -147,8 +147,8 @@ public class ListIndexManagementDUnitTest {
     RegionConfig.Index index = new RegionConfig.Index();
     index.setRegionName("region1");
     index.setName("index1");
-    ClusterManagementResult<RegionConfig.Index> list = cms.list(index);
-    List<RegionConfig.Index> result = list.getResult();
+    ClusterManagementResult<RegionConfig.Index, RuntimeInfo> list = cms.list(index);
+    List<RegionConfig.Index> result = list.getConfigResult();
     assertThat(result).hasSize(1);
     RegionConfig.Index runtimeIndex = result.get(0);
     assertThat(runtimeIndex.getRegionName()).isEqualTo("region1");
@@ -171,8 +171,8 @@ public class ListIndexManagementDUnitTest {
     RegionConfig.Index index = new RegionConfig.Index();
     index.setRegionName("region1");
     index.setName("index333");
-    ClusterManagementResult<RegionConfig.Index> list = cms.list(index);
-    List<RegionConfig.Index> result = list.getResult();
+    ClusterManagementResult<RegionConfig.Index, RuntimeInfo> list = cms.list(index);
+    List<RegionConfig.Index> result = list.getConfigResult();
     assertThat(result).hasSize(0);
     assertThat(list.isSuccessful()).isTrue();
   }
diff --git a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ListRegionManagementDunitTest.java b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ListRegionManagementDunitTest.java
index 772f531..e5d7de9 100644
--- a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ListRegionManagementDunitTest.java
+++ b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ListRegionManagementDunitTest.java
@@ -30,9 +30,10 @@ import org.apache.geode.cache.Region;
 import org.apache.geode.cache.configuration.CacheElement;
 import org.apache.geode.cache.configuration.RegionConfig;
 import org.apache.geode.cache.configuration.RegionType;
+import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.api.ClusterManagementService;
 import org.apache.geode.management.client.ClusterManagementServiceBuilder;
-import org.apache.geode.management.configuration.RuntimeRegionConfig;
+import org.apache.geode.management.runtime.RuntimeRegionInfo;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
 import org.apache.geode.test.junit.rules.GfshCommandRule;
@@ -110,15 +111,15 @@ public class ListRegionManagementDunitTest {
   @Test
   public void listAll() throws Exception {
     // list all
-    List<RuntimeRegionConfig> regions = client.list(filter).getResult();
+    List<RegionConfig> regions = client.list(filter).getConfigResult();
     assertThat(regions).hasSize(5);
-    RuntimeRegionConfig element = CacheElement.findElement(regions, "customers");
+    RegionConfig element = CacheElement.findElement(regions, "customers");
     assertThat(element.getGroup()).isNull();
 
     element = CacheElement.findElement(regions, "customers1");
     assertThat(element.getGroup()).isEqualTo("group1");
 
-    RuntimeRegionConfig region = CacheElement.findElement(regions, "customers2");
+    RegionConfig region = CacheElement.findElement(regions, "customers2");
     assertThat(region.getGroup()).isIn("group1", "group2");
     assertThat(region.getType()).isIn("PARTITION", "PARTITION_PROXY");
 
@@ -130,7 +131,7 @@ public class ListRegionManagementDunitTest {
   public void listClusterLevel() throws Exception {
     // list cluster level only
     filter.setGroup("cluster");
-    List<RuntimeRegionConfig> regions = client.list(filter).getResult();
+    List<RegionConfig> regions = client.list(filter).getConfigResult();
     assertThat(regions).hasSize(1);
     assertThat(regions.get(0).getId()).isEqualTo("customers");
     assertThat(regions.get(0).getGroup()).isNull();
@@ -152,22 +153,25 @@ public class ListRegionManagementDunitTest {
     });
 
     filter.setName("customers");
-    List<RuntimeRegionConfig> regions = client.list(filter).getResult();
+    ClusterManagementResult<RegionConfig, RuntimeRegionInfo> result = client.list(filter);
+    List<RegionConfig> regions = result.getConfigResult();
     assertThat(regions).hasSize(1);
-    RuntimeRegionConfig regionConfig = regions.get(0);
+    RegionConfig regionConfig = regions.get(0);
     assertThat(regionConfig.getName()).isEqualTo("customers");
-    assertThat(regionConfig).isInstanceOf(RuntimeRegionConfig.class);
-    assertThat(regionConfig.getEntryCount()).isEqualTo(2);
+
+    List<RuntimeRegionInfo> runtimeRegionInfos = result.getRuntimeResult();
+    assertThat(runtimeRegionInfos).hasSize(1);
+    assertThat(runtimeRegionInfos.get(0).getEntryCount()).isEqualTo(2);
   }
 
   @Test
   public void listGroup1() throws Exception {
     // list group1
     filter.setGroup("group1");
-    List<RuntimeRegionConfig> regions = client.list(filter).getResult();
+    List<RegionConfig> regions = client.list(filter).getConfigResult();
     assertThat(regions).hasSize(3);
     // when filtering by group, the returned list should not have group info
-    RuntimeRegionConfig region = CacheElement.findElement(regions, "customers1");
+    RegionConfig region = CacheElement.findElement(regions, "customers1");
     assertThat(region.getGroup()).isEqualTo("group1");
 
     region = CacheElement.findElement(regions, "customers2");
@@ -181,10 +185,10 @@ public class ListRegionManagementDunitTest {
   public void listGroup2() throws Exception {
     // list group1
     filter.setGroup("group2");
-    List<RuntimeRegionConfig> regions = client.list(filter).getResult();
+    List<RegionConfig> regions = client.list(filter).getConfigResult();
     assertThat(regions).hasSize(2);
 
-    RuntimeRegionConfig region = CacheElement.findElement(regions, "customers2");
+    RegionConfig region = CacheElement.findElement(regions, "customers2");
     assertThat(region.getGroup()).isEqualTo("group2");
 
     region = CacheElement.findElement(regions, "customers3");
@@ -195,14 +199,14 @@ public class ListRegionManagementDunitTest {
   public void listNonExistentGroup() throws Exception {
     // list non-existent group
     filter.setGroup("group3");
-    List<RuntimeRegionConfig> regions = client.list(filter).getResult();
+    List<RegionConfig> regions = client.list(filter).getConfigResult();
     assertThat(regions).hasSize(0);
   }
 
   @Test
   public void listRegionByName() throws Exception {
     filter.setName("customers");
-    List<RuntimeRegionConfig> regions = client.list(filter).getResult();
+    List<RegionConfig> regions = client.list(filter).getConfigResult();
     assertThat(regions).hasSize(1);
     assertThat(regions.get(0).getId()).isEqualTo("customers");
     assertThat(regions.get(0).getGroup()).isNull();
@@ -211,7 +215,7 @@ public class ListRegionManagementDunitTest {
   @Test
   public void listRegionByName1() throws Exception {
     filter.setName("customers1");
-    List<RuntimeRegionConfig> regions = client.list(filter).getResult();
+    List<RegionConfig> regions = client.list(filter).getConfigResult();
     assertThat(regions).hasSize(1);
     assertThat(regions.get(0).getId()).isEqualTo("customers1");
     assertThat(regions.get(0).getGroup()).isEqualTo("group1");
@@ -220,7 +224,7 @@ public class ListRegionManagementDunitTest {
   @Test
   public void listRegionByName2() throws Exception {
     filter.setName("customers2");
-    List<RuntimeRegionConfig> regions = client.list(filter).getResult();
+    List<RegionConfig> regions = client.list(filter).getConfigResult();
     assertThat(regions).hasSize(2);
     assertThat(
         regions.stream().map(CacheElement::getGroup).collect(Collectors.toList()))
@@ -234,7 +238,7 @@ public class ListRegionManagementDunitTest {
   @Test
   public void listRegionByName3() throws Exception {
     filter.setName("customers3");
-    List<RuntimeRegionConfig> regions = client.list(filter).getResult();
+    List<RegionConfig> regions = client.list(filter).getConfigResult();
     assertThat(regions).hasSize(1);
     assertThat(regions.get(0).getId()).isEqualTo("customers3");
     assertThat(regions.get(0).getGroups()).containsExactlyInAnyOrder("group1", "group2");
@@ -244,7 +248,7 @@ public class ListRegionManagementDunitTest {
   public void listNonExistentRegion() throws Exception {
     // list non-existent region
     filter.setName("customer4");
-    List<RuntimeRegionConfig> regions = client.list(filter).getResult();
+    List<RegionConfig> regions = client.list(filter).getConfigResult();
     assertThat(regions).hasSize(0);
   }
 }
diff --git a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ManagementRequestLoggingDUnitTest.java b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ManagementRequestLoggingDUnitTest.java
index b30ecd6..cc609e4 100644
--- a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ManagementRequestLoggingDUnitTest.java
+++ b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/ManagementRequestLoggingDUnitTest.java
@@ -67,7 +67,7 @@ public class ManagementRequestLoggingDUnitTest {
     regionConfig.setName("customers");
     regionConfig.setType(RegionType.REPLICATE);
 
-    ClusterManagementResult<RegionConfig> result = service.create(regionConfig);
+    ClusterManagementResult<?, ?> result = service.create(regionConfig);
     assertThat(result.isSuccessful()).isTrue();
 
     locator.invoke(() -> {
diff --git a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/MemberManagementServiceDunitTest.java b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/MemberManagementServiceDunitTest.java
index c1eace5..4eba148 100644
--- a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/MemberManagementServiceDunitTest.java
+++ b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/MemberManagementServiceDunitTest.java
@@ -21,12 +21,11 @@ import org.junit.BeforeClass;
 import org.junit.ClassRule;
 import org.junit.Test;
 
-import org.apache.geode.cache.configuration.CacheElement;
 import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.api.ClusterManagementService;
 import org.apache.geode.management.client.ClusterManagementServiceBuilder;
 import org.apache.geode.management.configuration.MemberConfig;
-import org.apache.geode.management.configuration.RuntimeMemberConfig;
+import org.apache.geode.management.runtime.MemberInformation;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
 import org.apache.geode.test.junit.rules.MemberStarterRule;
@@ -51,18 +50,17 @@ public class MemberManagementServiceDunitTest {
   @Test
   public void listAllMembers() {
     MemberConfig config = new MemberConfig();
-    ClusterManagementResult<RuntimeMemberConfig> result = cmsClient.list(config);
+    ClusterManagementResult<MemberConfig, MemberInformation> result = cmsClient.list(config);
 
     assertThat(result.isSuccessful()).isTrue();
     assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.OK);
-    assertThat(result.getResult().size()).isEqualTo(2);
+    assertThat(result.getRuntimeResult().size()).isEqualTo(2);
 
-    RuntimeMemberConfig memberConfig =
-        CacheElement.findElement(result.getResult(),
-            "locator-0");
+    MemberInformation memberConfig = result.getRuntimeResult().stream()
+        .filter(r -> "locator-0".equals(r.getName())).findFirst().orElse(null);
     assertThat(memberConfig.isCoordinator()).isTrue();
-    assertThat(memberConfig.isLocator()).isTrue();
-    assertThat(memberConfig.getPort()).isEqualTo(locator.getPort());
+    assertThat(memberConfig.isServer()).isFalse();
+    assertThat(memberConfig.getLocatorPort()).isEqualTo(locator.getPort());
   }
 
   @Test
@@ -70,25 +68,25 @@ public class MemberManagementServiceDunitTest {
     MemberConfig config = new MemberConfig();
     config.setId("locator-0");
 
-    ClusterManagementResult<RuntimeMemberConfig> result = cmsClient.list(config);
+    ClusterManagementResult<MemberConfig, MemberInformation> result = cmsClient.list(config);
     assertThat(result.isSuccessful()).isTrue();
     assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.OK);
-    assertThat(result.getResult().size()).isEqualTo(1);
+    assertThat(result.getRuntimeResult().size()).isEqualTo(1);
 
-    RuntimeMemberConfig memberConfig = result.getResult().get(0);
+    MemberInformation memberConfig = result.getRuntimeResult().get(0);
     assertThat(memberConfig.isCoordinator()).isTrue();
-    assertThat(memberConfig.isLocator()).isTrue();
-    assertThat(memberConfig.getPort()).isEqualTo(locator.getPort());
+    assertThat(memberConfig.isServer()).isFalse();
+    assertThat(memberConfig.getLocatorPort()).isEqualTo(locator.getPort());
   }
 
   @Test
   public void listNonExistentMember() {
     MemberConfig config = new MemberConfig();
     config.setId("locator");
-    ClusterManagementResult<RuntimeMemberConfig> result = cmsClient.list(config);
+    ClusterManagementResult<MemberConfig, MemberInformation> result = cmsClient.list(config);
     assertThat(result.isSuccessful()).isTrue();
     assertThat(result.getStatusCode())
         .isEqualTo(ClusterManagementResult.StatusCode.OK);
-    assertThat(result.getResult().size()).isEqualTo(0);
+    assertThat(result.getRuntimeResult().size()).isEqualTo(0);
   }
 }
diff --git a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/RegionManagementDunitTest.java b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/RegionManagementDunitTest.java
index f74fb21..aa47b99 100644
--- a/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/RegionManagementDunitTest.java
+++ b/geode-assembly/src/distributedTest/java/org/apache/geode/management/internal/rest/RegionManagementDunitTest.java
@@ -36,7 +36,6 @@ import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.api.ClusterManagementService;
 import org.apache.geode.management.api.RealizationResult;
 import org.apache.geode.management.client.ClusterManagementServiceBuilder;
-import org.apache.geode.management.configuration.RuntimeRegionConfig;
 import org.apache.geode.test.dunit.IgnoredException;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
@@ -73,7 +72,7 @@ public class RegionManagementDunitTest {
     regionConfig.setGroup("group1");
     regionConfig.setType(RegionType.REPLICATE);
 
-    ClusterManagementResult<RegionConfig> result = cms.create(regionConfig);
+    ClusterManagementResult<?, ?> result = cms.create(regionConfig);
 
     assertThat(result.isSuccessful()).isTrue();
     assertThat(result.getMemberStatuses()).extracting(RealizationResult::getMemberName)
@@ -98,10 +97,10 @@ public class RegionManagementDunitTest {
     config.setRegionAttributes(type);
     cms.create(config);
 
-    List<RuntimeRegionConfig> result = cms.get(config).getResult();
+    List<RegionConfig> result = cms.get(config).getConfigResult();
 
     assertThat(result).hasSize(1);
-    RuntimeRegionConfig config1 = result.get(0);
+    RegionConfig config1 = result.get(0);
     assertThat(config1.getType()).isEqualTo("PARTITION");
     assertThat(config1.getRegionAttributes().getDataPolicy().name()).isEqualTo("PARTITION");
     assertThat(config1.getRegionAttributes().getValueConstraint()).isEqualTo("java.lang.Integer");
@@ -121,7 +120,7 @@ public class RegionManagementDunitTest {
   public void createsAPartitionedRegion() throws Exception {
     String json = "{\"name\": \"orders\", \"type\": \"PARTITION\", \"group\": \"group1\"}";
 
-    ClusterManagementResult<RuntimeRegionConfig> result =
+    ClusterManagementResult<?, ?> result =
         restClient.doPostAndAssert("/regions", json)
             .hasStatusCode(201)
             .getClusterManagementResult();
@@ -148,7 +147,7 @@ public class RegionManagementDunitTest {
     IgnoredException.addIgnoredException("Name of the region has to be specified");
     String json = "{\"type\": \"REPLICATE\"}";
 
-    ClusterManagementResult<RuntimeRegionConfig> result =
+    ClusterManagementResult<?, ?> result =
         restClient.doPostAndAssert("/regions", json)
             .hasStatusCode(400)
             .getClusterManagementResult();
diff --git a/geode-assembly/src/integrationTest/java/org/apache/geode/management/internal/DisabledClusterConfigTest.java b/geode-assembly/src/integrationTest/java/org/apache/geode/management/internal/DisabledClusterConfigTest.java
index f2b830f..15b0d23 100644
--- a/geode-assembly/src/integrationTest/java/org/apache/geode/management/internal/DisabledClusterConfigTest.java
+++ b/geode-assembly/src/integrationTest/java/org/apache/geode/management/internal/DisabledClusterConfigTest.java
@@ -41,7 +41,7 @@ public class DisabledClusterConfigTest {
     GeodeDevRestClient restClient =
         new GeodeDevRestClient("/management/v2", "localhost", locator.getHttpPort(), false);
 
-    ClusterManagementResult<?> result =
+    ClusterManagementResult result =
         restClient.doPostAndAssert("/regions", "{\"name\":\"test\"}")
             .hasStatusCode(500)
             .getClusterManagementResult();
diff --git a/geode-assembly/src/integrationTest/resources/assembly_content.txt b/geode-assembly/src/integrationTest/resources/assembly_content.txt
index be4ab26..fddebbe 100644
--- a/geode-assembly/src/integrationTest/resources/assembly_content.txt
+++ b/geode-assembly/src/integrationTest/resources/assembly_content.txt
@@ -682,6 +682,7 @@ javadoc/org/apache/geode/management/api/ClusterManagementResult.html
 javadoc/org/apache/geode/management/api/ClusterManagementService.html
 javadoc/org/apache/geode/management/api/RealizationResult.html
 javadoc/org/apache/geode/management/api/RespondsWith.html
+javadoc/org/apache/geode/management/api/Response.html
 javadoc/org/apache/geode/management/api/RestfulEndpoint.html
 javadoc/org/apache/geode/management/api/package-frame.html
 javadoc/org/apache/geode/management/api/package-summary.html
@@ -716,9 +717,6 @@ javadoc/org/apache/geode/management/client/package-frame.html
 javadoc/org/apache/geode/management/client/package-summary.html
 javadoc/org/apache/geode/management/client/package-tree.html
 javadoc/org/apache/geode/management/configuration/MemberConfig.html
-javadoc/org/apache/geode/management/configuration/RuntimeMemberConfig.CacheServerConfig.html
-javadoc/org/apache/geode/management/configuration/RuntimeMemberConfig.html
-javadoc/org/apache/geode/management/configuration/RuntimeRegionConfig.html
 javadoc/org/apache/geode/management/configuration/package-frame.html
 javadoc/org/apache/geode/management/configuration/package-summary.html
 javadoc/org/apache/geode/management/configuration/package-tree.html
@@ -736,6 +734,13 @@ javadoc/org/apache/geode/management/membership/package-tree.html
 javadoc/org/apache/geode/management/package-frame.html
 javadoc/org/apache/geode/management/package-summary.html
 javadoc/org/apache/geode/management/package-tree.html
+javadoc/org/apache/geode/management/runtime/CacheServerInfo.html
+javadoc/org/apache/geode/management/runtime/MemberInformation.html
+javadoc/org/apache/geode/management/runtime/RuntimeInfo.html
+javadoc/org/apache/geode/management/runtime/RuntimeRegionInfo.html
+javadoc/org/apache/geode/management/runtime/package-frame.html
+javadoc/org/apache/geode/management/runtime/package-summary.html
+javadoc/org/apache/geode/management/runtime/package-tree.html
 javadoc/org/apache/geode/memcached/GemFireMemcachedServer.Protocol.html
 javadoc/org/apache/geode/memcached/GemFireMemcachedServer.html
 javadoc/org/apache/geode/memcached/package-frame.html
diff --git a/geode-core/src/distributedTest/java/org/apache/geode/management/internal/api/RegionAPIDUnitTest.java b/geode-core/src/distributedTest/java/org/apache/geode/management/internal/api/RegionAPIDUnitTest.java
index 0777857..65ec4d2 100644
--- a/geode-core/src/distributedTest/java/org/apache/geode/management/internal/api/RegionAPIDUnitTest.java
+++ b/geode-core/src/distributedTest/java/org/apache/geode/management/internal/api/RegionAPIDUnitTest.java
@@ -64,7 +64,7 @@ public class RegionAPIDUnitTest {
       RegionConfig config = new RegionConfig();
       config.setName(regionName);
       config.setType(RegionType.PARTITION);
-      ClusterManagementResult<RegionConfig> result =
+      ClusterManagementResult<?, ?> result =
           ClusterStartupRule.getLocator().getClusterManagementService()
               .create(config);
       assertThat(result.isSuccessful()).isTrue();
@@ -90,7 +90,7 @@ public class RegionAPIDUnitTest {
       RegionConfig config = new RegionConfig();
       config.setName(regionName);
       config.setType(RegionType.REPLICATE);
-      ClusterManagementResult<RegionConfig> result =
+      ClusterManagementResult<?, ?> result =
           ClusterStartupRule.getLocator().getClusterManagementService()
               .create(config);
       assertThat(result.isSuccessful()).isTrue();
@@ -108,7 +108,7 @@ public class RegionAPIDUnitTest {
       RegionConfig config = new RegionConfig();
       config.setName(regionName);
       config.setType(RegionType.PARTITION);
-      ClusterManagementResult<RegionConfig> result =
+      ClusterManagementResult<?, ?> result =
           ClusterStartupRule.getLocator().getClusterManagementService()
               .create(config);
       assertThat(result.isSuccessful()).isTrue();
diff --git a/geode-core/src/integrationTest/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigMutatorIntegrationTest.java b/geode-core/src/integrationTest/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigMutatorIntegrationTest.java
index c3b84aa..30d4140 100644
--- a/geode-core/src/integrationTest/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigMutatorIntegrationTest.java
+++ b/geode-core/src/integrationTest/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigMutatorIntegrationTest.java
@@ -37,7 +37,7 @@ public class RegionConfigMutatorIntegrationTest {
   @Before
   public void before() throws Exception {
     config = new RegionConfig();
-    mutator = new RegionConfigManager(locator.getCache());
+    mutator = new RegionConfigManager();
   }
 
   @Test
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/CacheElementOperation.java b/geode-core/src/main/java/org/apache/geode/management/internal/CacheElementOperation.java
index e9b07ff..123bd18 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/CacheElementOperation.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/CacheElementOperation.java
@@ -16,5 +16,5 @@
 package org.apache.geode.management.internal;
 
 public enum CacheElementOperation {
-  CREATE, DELETE, UPDATE, LIST
+  CREATE, DELETE, UPDATE, GET
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/api/GeodeClusterManagementServiceBuilder.java b/geode-core/src/main/java/org/apache/geode/management/internal/api/GeodeClusterManagementServiceBuilder.java
index 26206f8..37018f0 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/api/GeodeClusterManagementServiceBuilder.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/api/GeodeClusterManagementServiceBuilder.java
@@ -44,10 +44,10 @@ import org.apache.geode.management.api.ClusterManagementService;
 import org.apache.geode.management.builder.ClusterManagementServiceBuilder;
 import org.apache.geode.management.internal.PlainClusterManagementServiceBuilder;
 import org.apache.geode.management.internal.SSLUtil;
-import org.apache.geode.management.internal.cli.domain.MemberInformation;
 import org.apache.geode.management.internal.cli.functions.GetMemberInformationFunction;
 import org.apache.geode.management.internal.configuration.messages.ClusterManagementServiceInfo;
 import org.apache.geode.management.internal.configuration.messages.ClusterManagementServiceInfoRequest;
+import org.apache.geode.management.runtime.MemberInformation;
 import org.apache.geode.security.AuthInitialize;
 
 
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/api/LocatorClusterManagementService.java b/geode-core/src/main/java/org/apache/geode/management/internal/api/LocatorClusterManagementService.java
index 119b980..28d73b1 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/api/LocatorClusterManagementService.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/api/LocatorClusterManagementService.java
@@ -49,12 +49,13 @@ import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.api.ClusterManagementService;
 import org.apache.geode.management.api.RealizationResult;
 import org.apache.geode.management.api.RespondsWith;
+import org.apache.geode.management.api.Response;
+import org.apache.geode.management.api.RestfulEndpoint;
 import org.apache.geode.management.configuration.MemberConfig;
 import org.apache.geode.management.internal.CacheElementOperation;
-import org.apache.geode.management.internal.cli.functions.UpdateCacheFunction;
+import org.apache.geode.management.internal.cli.functions.CacheRealizationFunction;
 import org.apache.geode.management.internal.configuration.mutators.ConfigurationManager;
 import org.apache.geode.management.internal.configuration.mutators.GatewayReceiverConfigManager;
-import org.apache.geode.management.internal.configuration.mutators.MemberConfigManager;
 import org.apache.geode.management.internal.configuration.mutators.PdxManager;
 import org.apache.geode.management.internal.configuration.mutators.RegionConfigManager;
 import org.apache.geode.management.internal.configuration.validators.CacheElementValidator;
@@ -63,6 +64,7 @@ import org.apache.geode.management.internal.configuration.validators.GatewayRece
 import org.apache.geode.management.internal.configuration.validators.MemberValidator;
 import org.apache.geode.management.internal.configuration.validators.RegionConfigValidator;
 import org.apache.geode.management.internal.exceptions.EntityNotFoundException;
+import org.apache.geode.management.runtime.RuntimeInfo;
 
 public class LocatorClusterManagementService implements ClusterManagementService {
   private static final Logger logger = LogService.getLogger();
@@ -76,8 +78,7 @@ public class LocatorClusterManagementService implements ClusterManagementService
       ConfigurationPersistenceService persistenceService) {
     this(persistenceService, new HashMap<>(), new HashMap<>(), null, null);
     // initialize the list of managers
-    managers.put(RegionConfig.class, new RegionConfigManager(cache));
-    managers.put(MemberConfig.class, new MemberConfigManager(cache));
+    managers.put(RegionConfig.class, new RegionConfigManager());
     managers.put(PdxType.class, new PdxManager());
     managers.put(GatewayReceiverConfig.class, new GatewayReceiverConfigManager(cache));
 
@@ -100,13 +101,12 @@ public class LocatorClusterManagementService implements ClusterManagementService
   }
 
   @Override
-  public <T extends CacheElement & RespondsWith<R>, R extends CacheElement> ClusterManagementResult<T> create(
-      T config) {
+  public <T extends CacheElement> ClusterManagementResult<?, ?> create(T config) {
     // validate that user used the correct config object type
     ConfigurationManager configurationManager = getConfigurationManager(config);
 
     if (persistenceService == null) {
-      return new ClusterManagementResult<>(false,
+      return new ClusterManagementResult(false,
           "Cluster configuration service needs to be enabled");
     }
 
@@ -123,12 +123,12 @@ public class LocatorClusterManagementService implements ClusterManagementService
     memberValidator.validateCreate(config, configurationManager);
 
     // execute function on all members
-    Set<DistributedMember> targetedMembers = memberValidator.findMembers(group);
+    Set<DistributedMember> targetedMembers = memberValidator.findServers(group);
 
-    ClusterManagementResult<T> result = new ClusterManagementResult<>();
+    ClusterManagementResult result = new ClusterManagementResult();
 
     List<RealizationResult> functionResults = executeAndGetFunctionResult(
-        new UpdateCacheFunction(),
+        new CacheRealizationFunction(),
         Arrays.asList(config, CacheElementOperation.CREATE),
         targetedMembers);
 
@@ -157,20 +157,20 @@ public class LocatorClusterManagementService implements ClusterManagementService
     });
 
     // add the config object which includes the HATOS information of the element created
-    if (result.isSuccessful()) {
-      result.setResult(Collections.singletonList(config));
+    if (result.isSuccessful() && config instanceof RestfulEndpoint) {
+      result.setUri(((RestfulEndpoint) config).getUri());
     }
     return result;
   }
 
   @Override
-  public <T extends CacheElement & RespondsWith<R>, R extends CacheElement> ClusterManagementResult<T> delete(
+  public <T extends CacheElement> ClusterManagementResult<?, ?> delete(
       T config) {
     // validate that user used the correct config object type
     ConfigurationManager configurationManager = getConfigurationManager(config);
 
     if (persistenceService == null) {
-      return new ClusterManagementResult<>(false,
+      return new ClusterManagementResult(false,
           "Cluster configuration service needs to be enabled");
     }
 
@@ -189,12 +189,12 @@ public class LocatorClusterManagementService implements ClusterManagementService
     }
 
     // execute function on all members
-    ClusterManagementResult<T> result = new ClusterManagementResult<>();
+    ClusterManagementResult result = new ClusterManagementResult();
 
     List<RealizationResult> functionResults = executeAndGetFunctionResult(
-        new UpdateCacheFunction(),
+        new CacheRealizationFunction(),
         Arrays.asList(config, CacheElementOperation.DELETE),
-        memberValidator.findMembers(groupsWithThisElement));
+        memberValidator.findServers(groupsWithThisElement));
     functionResults.forEach(result::addMemberStatus);
 
     // if any false result is added to the member list
@@ -231,81 +231,121 @@ public class LocatorClusterManagementService implements ClusterManagementService
   }
 
   @Override
-  public <T extends CacheElement & RespondsWith<R>, R extends CacheElement> ClusterManagementResult<T> update(
+  public <T extends CacheElement> ClusterManagementResult<?, ?> update(
       T config) {
     throw new NotImplementedException("Not implemented");
   }
 
   @Override
-  public <T extends CacheElement & RespondsWith<R>, R extends CacheElement> ClusterManagementResult<R> list(
+  public <T extends CacheElement & RespondsWith<R>, R extends RuntimeInfo> ClusterManagementResult<T, R> list(
       T filter) {
-    ConfigurationManager<T, R> manager = managers.get(filter.getClass());
-
-    ClusterManagementResult<R> result = new ClusterManagementResult<>();
+    ConfigurationManager<T> manager = managers.get(filter.getClass());
 
-    if (filter instanceof MemberConfig) {
-      List<R> listResults = manager.list(filter, null);
-      result.setResult(listResults);
-      return result;
-    }
+    ClusterManagementResult<T, R> result = new ClusterManagementResult<>();
 
     if (persistenceService == null) {
       return new ClusterManagementResult<>(false,
           "Cluster configuration service needs to be enabled");
     }
 
-    List<R> resultList = new ArrayList<>();
-    for (String group : persistenceService.getGroups()) {
-      CacheConfig currentPersistedConfig = persistenceService.getCacheConfig(group, true);
-      List<R> listInGroup = manager.list(filter, currentPersistedConfig);
-      for (R element : listInGroup) {
-        element.setGroup(group);
-        resultList.add(element);
-      }
-    }
+    List<T> resultList = new ArrayList<>();
 
-    // if empty result, return immediately
-    if (resultList.size() == 0) {
-      return result;
-    }
+    if (filter instanceof MemberConfig) {
+      resultList.add(filter);
+    } else {
+      // gather elements on all the groups, consolidate the group information and then do the filter
+      // so that when we filter by a specific group, we still show that a particular element might
+      // also belong to another group.
+      for (String group : persistenceService.getGroups()) {
+        CacheConfig currentPersistedConfig = persistenceService.getCacheConfig(group, true);
+        List<T> listInGroup = manager.list(filter, currentPersistedConfig);
+        for (T element : listInGroup) {
+          element.setGroup(group);
+          resultList.add(element);
+        }
+      }
 
-    // right now the list contains [{regionA, group1}, {regionA, group2}...], if the elements are
-    // MultiGroupCacheElement, we need to consolidate the list into [{regionA, [group1, group2]}
+      // if empty result, return immediately
+      if (resultList.size() == 0) {
+        return result;
+      }
 
-    List<R> consolidatedConfigList = new ArrayList<>();
-    for (R element : resultList) {
-      int index = consolidatedConfigList.indexOf(element);
-      if (index >= 0) {
-        R exist = consolidatedConfigList.get(index);
-        exist.getGroups().add(element.getGroup());
-      } else {
-        consolidatedConfigList.add(element);
+      // right now the list contains [{regionA, group1}, {regionA, group2}...], if the elements are
+      // MultiGroupCacheElement, we need to consolidate the list into [{regionA, [group1, group2]}
+      List<T> consolidatedResultList = new ArrayList<>();
+      for (T element : resultList) {
+        int index = consolidatedResultList.indexOf(element);
+        if (index >= 0) {
+          T exist = consolidatedResultList.get(index);
+          exist.addGroup(element.getGroup());
+        } else {
+          consolidatedResultList.add(element);
+        }
       }
+      if (StringUtils.isNotBlank(filter.getGroup())) {
+        consolidatedResultList = consolidatedResultList.stream()
+            .filter(e -> (e.getGroups().contains(filter.getConfigGroup())))
+            .collect(Collectors.toList());
+      }
+      resultList = consolidatedResultList;
     }
-    if (StringUtils.isNotBlank(filter.getGroup())) {
-      consolidatedConfigList = consolidatedConfigList.stream()
-          .filter(e -> (e.getGroups().contains(filter.getConfigGroup())))
-          .collect(Collectors.toList());
-    }
-    // if "cluster" is the only group, clear it
-    for (R element : consolidatedConfigList) {
+
+    // gather the runtime info for each configuration objects
+    List<Response<T, R>> responses = new ArrayList<>();
+    boolean hasRuntimeInfo = filter.hasRuntimeInfo();
+
+    for (T element : resultList) {
+      List<String> groups = element.getGroups();
+      Response<T, R> response = new Response<>(element);
+
+      // if "cluster" is the only group, clear it, so that the returning json does not show
+      // "cluster" as a group value
       if (element.getGroups().size() == 1 && CacheElement.CLUSTER.equals(element.getGroup())) {
         element.getGroups().clear();
       }
-    }
-    resultList = consolidatedConfigList;
 
+      responses.add(response);
+      // do not gather runtime if this type of CacheElement is RespondWith<RuntimeInfo>
+      if (!hasRuntimeInfo) {
+        continue;
+      }
 
+      Set<DistributedMember> members;
 
-    result.setResult(resultList);
+      if (filter instanceof MemberConfig) {
+        members =
+            memberValidator.findMembers(filter.getId(), filter.getGroups().toArray(new String[0]));
+      } else {
+        members = memberValidator.findServers(groups.toArray(new String[0]));
+      }
+
+      // no member belongs to these groups
+      if (members.size() == 0) {
+        continue;
+      }
+
+      // if this cacheElement's runtime info only contains global info (no per member info), we will
+      // only need to issue get function on any member instead of all of them.
+      if (element.isGlobalRuntime()) {
+        members = Collections.singleton(members.iterator().next());
+      }
+
+      List<R> runtimeInfos = executeAndGetFunctionResult(new CacheRealizationFunction(),
+          Arrays.asList(element, CacheElementOperation.GET),
+          members);
+      response.setRuntimeInfo(runtimeInfos);
+    }
+
+    result.setResult(responses);
     return result;
   }
 
   @Override
-  public <T extends CacheElement & RespondsWith<R>, R extends CacheElement> ClusterManagementResult<R> get(
+  public <T extends CacheElement & RespondsWith<R>, R extends RuntimeInfo> ClusterManagementResult<T, R> get(
       T config) {
-    ClusterManagementResult<R> list = list(config);
-    List<R> result = list.getResult();
+    ClusterManagementResult<T, R> list = list(config);
+    List<Response<T, R>> result = list.getResult();
+
     if (result.size() == 0) {
       throw new EntityNotFoundException(
           config.getClass().getSimpleName() + " with id = " + config.getId() + " not found.");
@@ -323,8 +363,20 @@ public class LocatorClusterManagementService implements ClusterManagementService
     return true;
   }
 
+  @SuppressWarnings("unchecked")
+  private <T extends CacheElement> ConfigurationManager<T> getConfigurationManager(
+      T config) {
+    ConfigurationManager configurationManager = managers.get(config.getClass());
+    if (configurationManager == null) {
+      throw new IllegalArgumentException(String.format("Configuration type %s is not supported",
+          config.getClass().getSimpleName()));
+    }
+
+    return configurationManager;
+  }
+
   @VisibleForTesting
-  List<RealizationResult> executeAndGetFunctionResult(Function function, Object args,
+  <R> List<R> executeAndGetFunctionResult(Function function, Object args,
       Set<DistributedMember> targetMembers) {
     if (targetMembers.size() == 0) {
       return Collections.emptyList();
@@ -334,18 +386,6 @@ public class LocatorClusterManagementService implements ClusterManagementService
     ((AbstractExecution) execution).setIgnoreDepartedMembers(true);
     ResultCollector rc = execution.execute(function);
 
-    return (List<RealizationResult>) rc.getResult();
-  }
-
-  @SuppressWarnings("unchecked")
-  private <T extends CacheElement & RespondsWith<R>, R extends CacheElement> ConfigurationManager<T, R> getConfigurationManager(
-      T config) {
-    ConfigurationManager configurationManager = managers.get(config.getClass());
-    if (configurationManager == null) {
-      throw new IllegalArgumentException(String.format("Configuration type %s is not supported",
-          config.getClass().getSimpleName()));
-    }
-
-    return configurationManager;
+    return (List<R>) rc.getResult();
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateIndexCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateIndexCommand.java
index 6f324aa..21dd603 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateIndexCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateIndexCommand.java
@@ -33,16 +33,17 @@ import org.apache.geode.cache.query.IndexType;
 import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
 import org.apache.geode.management.api.ClusterManagementService;
+import org.apache.geode.management.api.Response;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
 import org.apache.geode.management.cli.GfshCommand;
-import org.apache.geode.management.configuration.RuntimeRegionConfig;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.cli.functions.CreateIndexFunction;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.result.model.InfoResultModel;
 import org.apache.geode.management.internal.cli.result.model.ResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
+import org.apache.geode.management.runtime.RuntimeRegionInfo;
 import org.apache.geode.security.ResourcePermission;
 
 public class CreateIndexCommand extends GfshCommand {
@@ -86,7 +87,7 @@ public class CreateIndexCommand extends GfshCommand {
     // we will find the applicable members based on the what group this region is on
     if (ccService != null && memberNameOrID == null) {
       regionName = getValidRegionName(regionPath, cms);
-      RuntimeRegionConfig config = getRuntimeRegionConfig(cms, regionName);
+      RegionConfig config = getRegionConfig(cms, regionName);
       if (config == null) {
         return ResultModel.createError("Region " + regionName + " does not exist.");
       }
@@ -173,7 +174,7 @@ public class CreateIndexCommand extends GfshCommand {
     String regionName = regionPath.trim().split(" ")[0];
     // check to see if the region path is in the form of "--region=region.entrySet() z"
     while (regionName.contains(".")) {
-      RuntimeRegionConfig region = getRuntimeRegionConfig(cms, regionName);
+      RegionConfig region = getRegionConfig(cms, regionName);
       if (region != null) {
         break;
       }
@@ -185,15 +186,15 @@ public class CreateIndexCommand extends GfshCommand {
     return regionName;
   }
 
-  RuntimeRegionConfig getRuntimeRegionConfig(ClusterManagementService cms,
+  RegionConfig getRegionConfig(ClusterManagementService cms,
       String regionName) {
     RegionConfig regionConfig = new RegionConfig();
     regionConfig.setName(regionName);
-    List<RuntimeRegionConfig> list = cms.list(regionConfig).getResult();
+    List<Response<RegionConfig, RuntimeRegionInfo>> list = cms.list(regionConfig).getResult();
     if (list.isEmpty()) {
       return null;
     } else {
-      return list.get(0);
+      return list.get(0).getConfig();
     }
   }
 
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeMemberCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeMemberCommand.java
index 26aa3ac..5baaab4 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeMemberCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DescribeMemberCommand.java
@@ -28,13 +28,13 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
 import org.apache.geode.management.cli.GfshCommand;
-import org.apache.geode.management.internal.cli.domain.CacheServerInfo;
-import org.apache.geode.management.internal.cli.domain.MemberInformation;
 import org.apache.geode.management.internal.cli.functions.GetMemberInformationFunction;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.result.model.DataResultModel;
 import org.apache.geode.management.internal.cli.result.model.ResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
+import org.apache.geode.management.runtime.CacheServerInfo;
+import org.apache.geode.management.runtime.MemberInformation;
 import org.apache.geode.security.ResourcePermission;
 
 public class DescribeMemberCommand extends GfshCommand {
@@ -84,7 +84,7 @@ public class DescribeMemberCommand extends GfshCommand {
     memberInfo.addData("Locators", memberInformation.getLocators());
 
     if (memberInformation.isServer()) {
-      List<CacheServerInfo> csList = memberInformation.getCacheServeInfo();
+      List<CacheServerInfo> csList = memberInformation.getCacheServerInfo();
       if (csList != null) {
         int serverCount = 0;
         for (CacheServerInfo cacheServerInfo : csList) {
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/UpdateCacheFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CacheRealizationFunction.java
similarity index 70%
rename from geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/UpdateCacheFunction.java
rename to geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CacheRealizationFunction.java
index 6e64ea6..4c3db4a 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/UpdateCacheFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/CacheRealizationFunction.java
@@ -24,20 +24,22 @@ import java.util.Map;
 import org.apache.logging.log4j.Logger;
 
 import org.apache.geode.annotations.Immutable;
-import org.apache.geode.cache.Cache;
 import org.apache.geode.cache.configuration.CacheElement;
 import org.apache.geode.cache.configuration.GatewayReceiverConfig;
 import org.apache.geode.cache.configuration.RegionConfig;
 import org.apache.geode.cache.execute.FunctionContext;
+import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.execute.InternalFunction;
 import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.management.api.RealizationResult;
+import org.apache.geode.management.configuration.MemberConfig;
 import org.apache.geode.management.internal.CacheElementOperation;
 import org.apache.geode.management.internal.configuration.realizers.ConfigurationRealizer;
 import org.apache.geode.management.internal.configuration.realizers.GatewayReceiverRealizer;
+import org.apache.geode.management.internal.configuration.realizers.MemberConfigRealizer;
 import org.apache.geode.management.internal.configuration.realizers.RegionConfigRealizer;
 
-public class UpdateCacheFunction implements InternalFunction<List> {
+public class CacheRealizationFunction implements InternalFunction<List> {
   private static final Logger logger = LogService.getLogger();
   @Immutable
   private static final Map<Class, ConfigurationRealizer> realizers = new HashMap<>();
@@ -45,25 +47,50 @@ public class UpdateCacheFunction implements InternalFunction<List> {
   static {
     realizers.put(RegionConfig.class, new RegionConfigRealizer());
     realizers.put(GatewayReceiverConfig.class, new GatewayReceiverRealizer());
+    realizers.put(MemberConfig.class, new MemberConfigRealizer());
   }
 
   @Override
   public void execute(FunctionContext<List> context) {
-    try {
-      context.getResultSender().lastResult(executeFunction(context));
-    } catch (Exception e) {
-      logger.error(e.getMessage(), e);
-      context.getResultSender().lastResult(new RealizationResult()
-          .setSuccess(false)
-          .setMemberName(context.getMemberName())
-          .setMessage(e.getMessage()));
+    CacheElement cacheElement = (CacheElement) context.getArguments().get(0);
+    CacheElementOperation operation = (CacheElementOperation) context.getArguments().get(1);
+    InternalCache cache = (InternalCache) context.getCache();
+
+    if (operation == CacheElementOperation.GET) {
+      try {
+        context.getResultSender().lastResult(executeGet(cache, cacheElement));
+      } catch (Exception e) {
+        logger.error(e.getMessage(), e);
+        context.getResultSender().lastResult(null);
+      }
+    } else {
+      try {
+        context.getResultSender()
+            .lastResult(executeUpdate(context, cache, cacheElement, operation));
+      } catch (Exception e) {
+        logger.error(e.getMessage(), e);
+        context.getResultSender().lastResult(new RealizationResult()
+            .setSuccess(false)
+            .setMemberName(context.getMemberName())
+            .setMessage(e.getMessage()));
+      }
     }
   }
 
-  public RealizationResult executeFunction(FunctionContext<List> context) {
-    CacheElement cacheElement = (CacheElement) context.getArguments().get(0);
-    CacheElementOperation operation = (CacheElementOperation) context.getArguments().get(1);
-    Cache cache = context.getCache();
+  public Object executeGet(InternalCache cache,
+      CacheElement cacheElement) {
+    ConfigurationRealizer realizer = realizers.get(cacheElement.getClass());
+
+    if (realizer == null) {
+      return null;
+    }
+    return realizer.get(cacheElement, cache);
+  }
+
+  public RealizationResult executeUpdate(FunctionContext<List> context,
+      InternalCache cache,
+      CacheElement cacheElement,
+      CacheElementOperation operation) {
 
     ConfigurationRealizer realizer = realizers.get(cacheElement.getClass());
 
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GatewayReceiverCreateFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GatewayReceiverCreateFunction.java
index dfce128..d50715f 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GatewayReceiverCreateFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GatewayReceiverCreateFunction.java
@@ -23,6 +23,7 @@ import org.apache.geode.cache.configuration.GatewayReceiverConfig;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.cache.execute.ResultSender;
 import org.apache.geode.cache.wan.GatewayReceiver;
+import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.execute.InternalFunction;
 import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
@@ -96,7 +97,7 @@ public class GatewayReceiverCreateFunction implements InternalFunction {
   GatewayReceiver createGatewayReceiver(Cache cache,
       GatewayReceiverConfig gatewayReceiverConfig) {
     GatewayReceiverRealizer receiverRealizer = new GatewayReceiverRealizer();
-    receiverRealizer.create(gatewayReceiverConfig, cache);
+    receiverRealizer.create(gatewayReceiverConfig, (InternalCache) cache);
 
     return cache.getGatewayReceivers().iterator().next();
   }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GetMemberInformationFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GetMemberInformationFunction.java
index b96ae10..b0d41a5 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GetMemberInformationFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GetMemberInformationFunction.java
@@ -14,6 +14,7 @@
  */
 package org.apache.geode.management.internal.cli.functions;
 
+import java.io.IOException;
 import java.lang.management.ManagementFactory;
 import java.lang.management.MemoryMXBean;
 import java.lang.management.MemoryUsage;
@@ -24,7 +25,6 @@ import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 
 import org.apache.geode.cache.Cache;
-import org.apache.geode.cache.CacheClosedException;
 import org.apache.geode.cache.execute.FunctionContext;
 import org.apache.geode.cache.server.CacheServer;
 import org.apache.geode.distributed.DistributedMember;
@@ -42,8 +42,8 @@ import org.apache.geode.internal.cache.tier.sockets.ClientProxyMembershipID;
 import org.apache.geode.internal.net.SSLConfigurationFactory;
 import org.apache.geode.internal.security.SecurableCommunicationChannel;
 import org.apache.geode.management.internal.cli.CliUtil;
-import org.apache.geode.management.internal.cli.domain.CacheServerInfo;
-import org.apache.geode.management.internal.cli.domain.MemberInformation;
+import org.apache.geode.management.runtime.CacheServerInfo;
+import org.apache.geode.management.runtime.MemberInformation;
 
 /***
  *
@@ -88,82 +88,89 @@ public class GetMemberInformationFunction implements InternalFunction {
           CliUtil.getDistributedMemberByNameOrId(functionContext.getMemberName(),
               (InternalCache) functionContext.getCache());
 
-      MemberInformation memberInfo = new MemberInformation();
-
-      memberInfo.setName(member.getName());
-      memberInfo.setId(member.getId());
-      memberInfo.setHost(member.getHost());
-      memberInfo.setProcessId(member.getProcessId());
-
-      SSLConfig sslConfig = SSLConfigurationFactory.getSSLConfigForComponent(config,
-          SecurableCommunicationChannel.WEB);
-      memberInfo.setWebSSL(sslConfig.isEnabled());
-      memberInfo.setSecured(StringUtils.isNotBlank(config.getSecurityManager()));
-      memberInfo.setGroups(config.getGroups());
-      memberInfo.setLogFilePath(config.getLogFile().getCanonicalPath());
-      memberInfo.setStatArchiveFilePath(config.getStatisticArchiveFile().getCanonicalPath());
-      memberInfo.setWorkingDirPath(System.getProperty("user.dir"));
-      memberInfo.setCacheXmlFilePath(config.getCacheXmlFile().getCanonicalPath());
-      memberInfo.setLocators(config.getLocators());
-      memberInfo.setServerBindAddress(config.getServerBindAddress());
-      memberInfo.setOffHeapMemorySize(config.getOffHeapMemorySize());
-      memberInfo.setHttpServicePort(config.getHttpServicePort());
-      memberInfo.setHttpServiceBindAddress(config.getHttpServiceBindAddress());
-
-      MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
-      MemoryUsage memUsage = memoryMXBean.getHeapMemoryUsage();
-      memberInfo.setHeapUsage(bytesToMeg(memUsage.getUsed()));
-      memberInfo.setMaxHeapSize(bytesToMeg(memUsage.getMax()));
-      memberInfo.setInitHeapSize(bytesToMeg(memUsage.getInit()));
-      memberInfo.setHostedRegions(CliUtil.getAllRegionNames(cache));
-
-      List<CacheServer> csList = cache.getCacheServers();
-
-      // A member is a server only if it has a cacheserver
-      if (csList != null && !csList.isEmpty()) {
-        memberInfo.setServer(true);
-        Iterator<CacheServer> iters = csList.iterator();
-        while (iters.hasNext()) {
-          CacheServer cs = iters.next();
-
-          CacheServerInfo cacheServerInfo = new CacheServerInfo(cs);
-          memberInfo.addCacheServerInfo(cacheServerInfo);
-        }
-        Map<ClientProxyMembershipID, CacheClientStatus> allConnectedClients =
-            InternalClientMembership.getStatusForAllClientsIgnoreSubscriptionStatus();
-        Iterator<ClientProxyMembershipID> it = allConnectedClients.keySet().iterator();
-        int numConnections = 0;
-
-        while (it.hasNext()) {
-          CacheClientStatus status = allConnectedClients.get(it.next());
-          numConnections = numConnections + status.getNumberOfConnections();
-        }
-        memberInfo.setClientCount(numConnections);
-
-        ServerLauncher.ServerState state = ServerLauncher.getServerState();
-        if (state != null) {
-          memberInfo.setStatus(state.getStatus().getDescription());
-        }
-      } else {
-        memberInfo.setServer(false);
-        InternalLocator locator = InternalLocator.getLocator();
-        if (locator != null) {
-          memberInfo.setLocatorPort(locator.getPort());
-        }
-
-        LocatorLauncher.LocatorState state = LocatorLauncher.getLocatorState();
-        if (state != null) {
-          memberInfo.setStatus(state.getStatus().getDescription());
-        }
-      }
+      MemberInformation memberInfo = getMemberInformation(cache, config, member);
       functionContext.getResultSender().lastResult(memberInfo);
-    } catch (CacheClosedException e) {
-      functionContext.getResultSender().sendException(e);
     } catch (Exception e) {
       functionContext.getResultSender().sendException(e);
     }
   }
 
+  public MemberInformation getMemberInformation(Cache cache, DistributionConfig config,
+      DistributedMember member) throws IOException {
+    MemberInformation memberInfo = new MemberInformation();
+
+    memberInfo.setName(member.getName());
+    memberInfo.setId(member.getId());
+    memberInfo.setHost(member.getHost());
+    memberInfo.setProcessId(member.getProcessId());
+
+    SSLConfig sslConfig = SSLConfigurationFactory.getSSLConfigForComponent(config,
+        SecurableCommunicationChannel.WEB);
+    memberInfo.setWebSSL(sslConfig.isEnabled());
+    memberInfo.setSecured(StringUtils.isNotBlank(config.getSecurityManager()));
+    memberInfo.setGroups(config.getGroups());
+    memberInfo.setLogFilePath(config.getLogFile().getCanonicalPath());
+    memberInfo.setStatArchiveFilePath(config.getStatisticArchiveFile().getCanonicalPath());
+    memberInfo.setWorkingDirPath(System.getProperty("user.dir"));
+    memberInfo.setCacheXmlFilePath(config.getCacheXmlFile().getCanonicalPath());
+    memberInfo.setLocators(config.getLocators());
+    memberInfo.setServerBindAddress(config.getServerBindAddress());
+    memberInfo.setOffHeapMemorySize(config.getOffHeapMemorySize());
+    memberInfo.setHttpServicePort(config.getHttpServicePort());
+    memberInfo.setHttpServiceBindAddress(config.getHttpServiceBindAddress());
+
+    MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
+    MemoryUsage memUsage = memoryMXBean.getHeapMemoryUsage();
+    memberInfo.setHeapUsage(bytesToMeg(memUsage.getUsed()));
+    memberInfo.setMaxHeapSize(bytesToMeg(memUsage.getMax()));
+    memberInfo.setInitHeapSize(bytesToMeg(memUsage.getInit()));
+    memberInfo.setHostedRegions(CliUtil.getAllRegionNames(cache));
+
+    List<CacheServer> csList = cache.getCacheServers();
+
+    // A member is a server only if it has a cacheserver
+    if (csList != null && !csList.isEmpty()) {
+      memberInfo.setServer(true);
+      Iterator<CacheServer> iters = csList.iterator();
+      while (iters.hasNext()) {
+        CacheServer cs = iters.next();
+        CacheServerInfo cacheServerInfo = new CacheServerInfo();
+        cacheServerInfo.setBindAddress(cs.getBindAddress());
+        cacheServerInfo.setPort(cs.getPort());
+        cacheServerInfo.setRunning(cs.isRunning());
+        cacheServerInfo.setMaxConnections(cs.getMaxConnections());
+        cacheServerInfo.setMaxThreads(cs.getMaxThreads());
+        memberInfo.addCacheServerInfo(cacheServerInfo);
+      }
+      Map<ClientProxyMembershipID, CacheClientStatus> allConnectedClients =
+          InternalClientMembership.getStatusForAllClientsIgnoreSubscriptionStatus();
+      Iterator<ClientProxyMembershipID> it = allConnectedClients.keySet().iterator();
+      int numConnections = 0;
+
+      while (it.hasNext()) {
+        CacheClientStatus status = allConnectedClients.get(it.next());
+        numConnections = numConnections + status.getNumberOfConnections();
+      }
+      memberInfo.setClientCount(numConnections);
+
+      ServerLauncher.ServerState state = ServerLauncher.getServerState();
+      if (state != null) {
+        memberInfo.setStatus(state.getStatus().getDescription());
+      }
+    } else {
+      memberInfo.setServer(false);
+      InternalLocator locator = InternalLocator.getLocator();
+      if (locator != null) {
+        memberInfo.setLocatorPort(locator.getPort());
+      }
+
+      LocatorLauncher.LocatorState state = LocatorLauncher.getLocatorState();
+      if (state != null) {
+        memberInfo.setStatus(state.getStatus().getDescription());
+      }
+    }
+    return memberInfo;
+  }
 
 
   private long bytesToMeg(long bytes) {
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/RegionCreateFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/RegionCreateFunction.java
index 543f2a3..28dbf15 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/RegionCreateFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/RegionCreateFunction.java
@@ -79,7 +79,8 @@ public class RegionCreateFunction implements InternalFunction {
 
     try {
       RegionPath regionPath = new RegionPath(regionCreateArgs.getRegionPath());
-      realizer.create(regionCreateArgs.getConfig(), regionCreateArgs.getRegionPath(), cache);
+      realizer.create(regionCreateArgs.getConfig(), regionCreateArgs.getRegionPath(),
+          (InternalCache) cache);
       XmlEntity xmlEntity = new XmlEntity(CacheXml.REGION, "name", regionPath.getRootRegionName());
       resultSender.lastResult(new CliFunctionResult(memberNameOrId, xmlEntity.getXmlDefinition(),
           CliStrings.format(CliStrings.CREATE_REGION__MSG__REGION_0_CREATED_ON_1,
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/ConfigurationManager.java b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/ConfigurationManager.java
index 85be925..cb5ccb3 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/ConfigurationManager.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/ConfigurationManager.java
@@ -22,7 +22,6 @@ import java.util.List;
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.configuration.CacheConfig;
 import org.apache.geode.cache.configuration.CacheElement;
-import org.apache.geode.management.api.RespondsWith;
 
 /**
  * Defines the behavior to mutate a configuration change into a pre-existing cache config from a
@@ -31,7 +30,7 @@ import org.apache.geode.management.api.RespondsWith;
  * type {@link CacheElement}, which represents the configuration change.
  */
 @Experimental
-public interface ConfigurationManager<T extends CacheElement & RespondsWith<R>, R extends CacheElement> {
+public interface ConfigurationManager<T extends CacheElement> {
   /**
    * specify how to add the config to the existing cache config. Note at this point, the config
    * should have passed all the validations already.
@@ -42,7 +41,7 @@ public interface ConfigurationManager<T extends CacheElement & RespondsWith<R>,
 
   void delete(T config, CacheConfig existing);
 
-  List<R> list(T filterConfig, CacheConfig existing);
+  List<T> list(T filterConfig, CacheConfig existing);
 
   T get(String id, CacheConfig existing);
 
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/GatewayReceiverConfigManager.java b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/GatewayReceiverConfigManager.java
index 68b3013..96e4865 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/GatewayReceiverConfigManager.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/GatewayReceiverConfigManager.java
@@ -23,7 +23,7 @@ import org.apache.geode.cache.configuration.GatewayReceiverConfig;
 import org.apache.geode.internal.cache.InternalCache;
 
 public class GatewayReceiverConfigManager
-    implements ConfigurationManager<GatewayReceiverConfig, GatewayReceiverConfig> {
+    implements ConfigurationManager<GatewayReceiverConfig> {
   private final InternalCache cache;
 
   public GatewayReceiverConfigManager(InternalCache cache) {
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/MemberConfigManager.java b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/MemberConfigManager.java
deleted file mode 100644
index 364fd70..0000000
--- a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/MemberConfigManager.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package org.apache.geode.management.internal.configuration.mutators;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import org.apache.commons.lang3.NotImplementedException;
-
-import org.apache.geode.annotations.VisibleForTesting;
-import org.apache.geode.cache.configuration.CacheConfig;
-import org.apache.geode.cache.execute.Execution;
-import org.apache.geode.cache.execute.FunctionService;
-import org.apache.geode.cache.execute.ResultCollector;
-import org.apache.geode.distributed.DistributedMember;
-import org.apache.geode.distributed.internal.DistributionManager;
-import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
-import org.apache.geode.distributed.internal.membership.MembershipManager;
-import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.management.configuration.MemberConfig;
-import org.apache.geode.management.configuration.RuntimeMemberConfig;
-import org.apache.geode.management.internal.cli.domain.CacheServerInfo;
-import org.apache.geode.management.internal.cli.domain.MemberInformation;
-import org.apache.geode.management.internal.cli.functions.GetMemberInformationFunction;
-
-public class MemberConfigManager
-    implements ConfigurationManager<MemberConfig, RuntimeMemberConfig> {
-
-  private InternalCache cache;
-
-  public MemberConfigManager(InternalCache cache) {
-    this.cache = cache;
-  }
-
-  @Override
-  public void add(MemberConfig config, CacheConfig existing) {
-    throw new NotImplementedException("Not implemented");
-  }
-
-  @Override
-  public void update(MemberConfig config, CacheConfig existing) {
-    throw new NotImplementedException("Not implemented");
-  }
-
-  @Override
-  public void delete(MemberConfig config, CacheConfig existing) {
-    throw new NotImplementedException("Not implemented");
-  }
-
-  @Override
-  public List<RuntimeMemberConfig> list(MemberConfig filter, CacheConfig existing) {
-    Set<DistributedMember> distributedMembers = getDistributedMembers(filter);
-    if (distributedMembers.size() == 0) {
-      return Collections.emptyList();
-    }
-
-    ArrayList<MemberInformation> memberInformation = getMemberInformation(distributedMembers);
-
-    return generateMemberConfigs(memberInformation);
-  }
-
-  @Override
-  public MemberConfig get(String id, CacheConfig existing) {
-    throw new NotImplementedException("Not implemented");
-  }
-
-  @VisibleForTesting
-  Set<DistributedMember> getDistributedMembers(MemberConfig filter) {
-    Set<InternalDistributedMember> distributionManagerIds =
-        cache.getDistributionManager().getDistributionManagerIds();
-    if (filter.getId() != null) {
-      distributionManagerIds = distributionManagerIds.stream().filter(
-          internalDistributedMember -> (filter.getId().equals(internalDistributedMember.getName())))
-          .collect(Collectors.toSet());
-    }
-
-    return distributionManagerIds.stream()
-        .map(DistributedMember.class::cast).collect(Collectors.toSet());
-  }
-
-  private ArrayList<MemberInformation> getMemberInformation(
-      Set<DistributedMember> distributedMembers) {
-    Execution execution = FunctionService.onMembers(distributedMembers);
-    ResultCollector<?, ?> resultCollector = execution.execute(new GetMemberInformationFunction());
-    return (ArrayList<MemberInformation>) resultCollector.getResult();
-  }
-
-  @VisibleForTesting
-  List<RuntimeMemberConfig> generateMemberConfigs(ArrayList<MemberInformation> memberInformation) {
-    final String coordinatorId = getCoordinatorId();
-    return memberInformation.stream().map(
-        memberInfo -> generateMemberConfig(coordinatorId, memberInfo)).collect(Collectors.toList());
-  }
-
-  @VisibleForTesting
-  RuntimeMemberConfig generateMemberConfig(String coordinatorId, MemberInformation memberInfo) {
-    RuntimeMemberConfig member = new RuntimeMemberConfig();
-    member.setId(memberInfo.getName());
-    member.setHost(memberInfo.getHost());
-    member.setPid(memberInfo.getProcessId());
-    member.setStatus(memberInfo.getStatus());
-    member.setInitialHeap(memberInfo.getInitHeapSize());
-    member.setMaxHeap(memberInfo.getMaxHeapSize());
-    member.setCoordinator(memberInfo.getId().equals(coordinatorId));
-    member.setUsedHeap(memberInfo.getHeapUsage());
-    member.setLogFile(memberInfo.getLogFilePath());
-    member.setWorkingDirectory(memberInfo.getWorkingDirPath());
-
-    if (memberInfo.isServer()) {
-      for (CacheServerInfo info : memberInfo.getCacheServeInfo()) {
-        RuntimeMemberConfig.CacheServerConfig cacheServerConfig =
-            new RuntimeMemberConfig.CacheServerConfig();
-        cacheServerConfig.setPort(info.getPort());
-        cacheServerConfig.setMaxConnections(info.getMaxConnections());
-        cacheServerConfig.setMaxThreads(info.getMaxThreads());
-        member.addCacheServer(cacheServerConfig);
-      }
-      member.setLocator(false);
-      member.setGroups(Arrays.asList(memberInfo.getGroups().split(",")));
-      member.setClientConnections(memberInfo.getClientCount());
-    } else {
-      member.setPort(memberInfo.getLocatorPort());
-      member.setLocator(true);
-    }
-    return member;
-  }
-
-  @VisibleForTesting
-  String getCoordinatorId() {
-    return Optional.ofNullable(cache.getDistributionManager())
-        .map(DistributionManager::getMembershipManager)
-        .map(MembershipManager::getCoordinator)
-        .map(DistributedMember::getId)
-        .orElse(null);
-  }
-}
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/PdxManager.java b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/PdxManager.java
index 6b25fcb..2601fba 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/PdxManager.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/PdxManager.java
@@ -21,7 +21,7 @@ import java.util.List;
 import org.apache.geode.cache.configuration.CacheConfig;
 import org.apache.geode.cache.configuration.PdxType;
 
-public class PdxManager implements ConfigurationManager<PdxType, PdxType> {
+public class PdxManager implements ConfigurationManager<PdxType> {
   @Override
   public void add(PdxType config, CacheConfig existing) {
     existing.setPdx(config);
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigManager.java b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigManager.java
index fcec7a2..c268981 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigManager.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigManager.java
@@ -17,36 +17,19 @@
 
 package org.apache.geode.management.internal.configuration.mutators;
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.commons.lang3.StringUtils;
 
-import org.apache.geode.annotations.VisibleForTesting;
 import org.apache.geode.cache.configuration.CacheConfig;
 import org.apache.geode.cache.configuration.CacheElement;
 import org.apache.geode.cache.configuration.RegionConfig;
-import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.management.DistributedRegionMXBean;
-import org.apache.geode.management.ManagementService;
-import org.apache.geode.management.configuration.RuntimeRegionConfig;
 
-public class RegionConfigManager
-    implements ConfigurationManager<RegionConfig, RuntimeRegionConfig> {
-  private InternalCache cache;
+public class RegionConfigManager implements ConfigurationManager<RegionConfig> {
 
-  @VisibleForTesting
-  RegionConfigManager() {}
-
-  public RegionConfigManager(InternalCache cache) {
-    this.cache = cache;
-  }
-
-  ManagementService getManagementService() {
-    return ManagementService.getExistingManagementService(cache);
-  }
+  public RegionConfigManager() {}
 
   @Override
   public void add(RegionConfig configElement, CacheConfig existingConfig) {
@@ -64,29 +47,17 @@ public class RegionConfigManager
   }
 
   @Override
-  public List<RuntimeRegionConfig> list(RegionConfig filter, CacheConfig existing) {
-    List<RegionConfig> staticRegionConfigs;
+  public List<RegionConfig> list(RegionConfig filter, CacheConfig existing) {
+    List<RegionConfig> regionConfigs;
     if (StringUtils.isBlank(filter.getName())) {
-      staticRegionConfigs = existing.getRegions();
+      regionConfigs = existing.getRegions();
     } else {
-      staticRegionConfigs =
+      regionConfigs =
           existing.getRegions().stream().filter(r -> filter.getName().equals(r.getName())).collect(
               Collectors.toList());
     }
 
-    List<RuntimeRegionConfig> results = new ArrayList<>();
-    for (RegionConfig config : staticRegionConfigs) {
-      DistributedRegionMXBean distributedRegionMXBean =
-          getManagementService().getDistributedRegionMXBean("/" + config.getName());
-      long entryCount = 0;
-      if (distributedRegionMXBean != null) {
-        entryCount = distributedRegionMXBean.getSystemRegionEntryCount();
-      }
-      RuntimeRegionConfig runtimeConfig = new RuntimeRegionConfig(config);
-      runtimeConfig.setEntryCount(entryCount);
-      results.add(runtimeConfig);
-    }
-    return results;
+    return regionConfigs;
   }
 
   @Override
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/realizers/ConfigurationRealizer.java b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/realizers/ConfigurationRealizer.java
index 0ca7399..8cac09d 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/realizers/ConfigurationRealizer.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/realizers/ConfigurationRealizer.java
@@ -17,9 +17,10 @@
 package org.apache.geode.management.internal.configuration.realizers;
 
 import org.apache.geode.annotations.Experimental;
-import org.apache.geode.cache.Cache;
 import org.apache.geode.cache.configuration.CacheElement;
+import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.management.api.RealizationResult;
+import org.apache.geode.management.api.RespondsWith;
 
 /**
  * Defines the behavior to realize a configuration change in the cache on a server. Created with an
@@ -27,12 +28,16 @@ import org.apache.geode.management.api.RealizationResult;
  * configuration change.
  */
 @Experimental
-public interface ConfigurationRealizer<T extends CacheElement> {
-  RealizationResult create(T config, Cache cache);
+public interface ConfigurationRealizer<T extends CacheElement & RespondsWith<R>, R> {
+  RealizationResult create(T config, InternalCache cache);
 
-  boolean exists(T config, Cache cache);
+  default boolean exists(T config, InternalCache cache) {
+    return get(config, cache) != null;
+  }
 
-  RealizationResult update(T config, Cache cache);
+  R get(T config, InternalCache cache);
 
-  RealizationResult delete(T config, Cache cache);
+  RealizationResult update(T config, InternalCache cache);
+
+  RealizationResult delete(T config, InternalCache cache);
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/realizers/GatewayReceiverRealizer.java b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/realizers/GatewayReceiverRealizer.java
index 797ceb2..929c481 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/realizers/GatewayReceiverRealizer.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/realizers/GatewayReceiverRealizer.java
@@ -21,16 +21,18 @@ import java.util.List;
 
 import org.apache.commons.lang3.NotImplementedException;
 
-import org.apache.geode.cache.Cache;
 import org.apache.geode.cache.configuration.DeclarableType;
 import org.apache.geode.cache.configuration.GatewayReceiverConfig;
 import org.apache.geode.cache.wan.GatewayReceiverFactory;
+import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.management.api.RealizationResult;
+import org.apache.geode.management.runtime.RuntimeInfo;
 
-public class GatewayReceiverRealizer implements ConfigurationRealizer<GatewayReceiverConfig> {
+public class GatewayReceiverRealizer
+    implements ConfigurationRealizer<GatewayReceiverConfig, RuntimeInfo> {
 
   @Override
-  public RealizationResult create(GatewayReceiverConfig config, Cache cache) {
+  public RealizationResult create(GatewayReceiverConfig config, InternalCache cache) {
     GatewayReceiverFactory gatewayReceiverFactory = cache.createGatewayReceiverFactory();
 
     String startPort = config.getStartPort();
@@ -82,17 +84,22 @@ public class GatewayReceiverRealizer implements ConfigurationRealizer<GatewayRec
   }
 
   @Override
-  public boolean exists(GatewayReceiverConfig config, Cache cache) {
+  public boolean exists(GatewayReceiverConfig config, InternalCache cache) {
     return cache.getGatewayReceivers() != null && cache.getGatewayReceivers().size() > 0;
   }
 
   @Override
-  public RealizationResult update(GatewayReceiverConfig config, Cache cache) {
+  public RuntimeInfo get(GatewayReceiverConfig config, InternalCache cache) {
+    return null;
+  }
+
+  @Override
+  public RealizationResult update(GatewayReceiverConfig config, InternalCache cache) {
     throw new NotImplementedException("Not implemented");
   }
 
   @Override
-  public RealizationResult delete(GatewayReceiverConfig config, Cache cache) {
+  public RealizationResult delete(GatewayReceiverConfig config, InternalCache cache) {
     throw new NotImplementedException("Not implemented");
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/realizers/MemberConfigRealizer.java b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/realizers/MemberConfigRealizer.java
new file mode 100644
index 0000000..2abfdc9
--- /dev/null
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/realizers/MemberConfigRealizer.java
@@ -0,0 +1,81 @@
+/*
+ * 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.management.internal.configuration.realizers;
+
+import java.io.IOException;
+import java.util.Optional;
+
+import org.apache.logging.log4j.Logger;
+
+import org.apache.geode.annotations.VisibleForTesting;
+import org.apache.geode.distributed.DistributedMember;
+import org.apache.geode.distributed.internal.DistributionManager;
+import org.apache.geode.distributed.internal.InternalDistributedSystem;
+import org.apache.geode.distributed.internal.membership.MembershipManager;
+import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.internal.logging.LogService;
+import org.apache.geode.management.api.RealizationResult;
+import org.apache.geode.management.configuration.MemberConfig;
+import org.apache.geode.management.internal.cli.functions.GetMemberInformationFunction;
+import org.apache.geode.management.runtime.MemberInformation;
+
+public class MemberConfigRealizer
+    implements ConfigurationRealizer<MemberConfig, MemberInformation> {
+  private static final Logger logger = LogService.getLogger();
+
+  @Override
+  public RealizationResult create(MemberConfig config, InternalCache cache) {
+    throw new IllegalStateException("Not supported");
+  }
+
+  @Override
+  public MemberInformation get(MemberConfig config, InternalCache cache) {
+    GetMemberInformationFunction getMemberInfoFunction = new GetMemberInformationFunction();
+    InternalDistributedSystem system = (InternalDistributedSystem) cache.getDistributedSystem();
+    DistributedMember member = system.getDistributedMember();
+
+    try {
+      MemberInformation memberInformation =
+          getMemberInfoFunction.getMemberInformation(cache, system.getConfig(), member);
+      if (member.getId().equals(getCoordinatorId((cache)))) {
+        memberInformation.setCoordinator(true);
+      }
+      return memberInformation;
+    } catch (IOException e) {
+      logger.error("unable to get the member information. ", e);
+      return null;
+    }
+  }
+
+  @Override
+  public RealizationResult update(MemberConfig config, InternalCache cache) {
+    throw new IllegalStateException("Not supported");
+  }
+
+  @Override
+  public RealizationResult delete(MemberConfig config, InternalCache cache) {
+    throw new IllegalStateException("Not supported");
+  }
+
+  @VisibleForTesting
+  String getCoordinatorId(InternalCache cache) {
+    return Optional.ofNullable(cache.getDistributionManager())
+        .map(DistributionManager::getMembershipManager)
+        .map(MembershipManager::getCoordinator)
+        .map(DistributedMember::getId)
+        .orElse(null);
+  }
+}
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/realizers/RegionConfigRealizer.java b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/realizers/RegionConfigRealizer.java
index 7b38b44..e113718 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/realizers/RegionConfigRealizer.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/realizers/RegionConfigRealizer.java
@@ -35,14 +35,17 @@ import org.apache.geode.cache.configuration.DeclarableType;
 import org.apache.geode.cache.configuration.RegionAttributesType;
 import org.apache.geode.cache.configuration.RegionConfig;
 import org.apache.geode.internal.cache.EvictionAttributesImpl;
+import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.PartitionAttributesImpl;
 import org.apache.geode.management.api.RealizationResult;
 import org.apache.geode.management.internal.cli.CliUtil;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.util.RegionPath;
 import org.apache.geode.management.internal.configuration.domain.DeclarableTypeInstantiator;
+import org.apache.geode.management.runtime.RuntimeRegionInfo;
 
-public class RegionConfigRealizer implements ConfigurationRealizer<RegionConfig> {
+public class RegionConfigRealizer
+    implements ConfigurationRealizer<RegionConfig, RuntimeRegionInfo> {
   public RegionConfigRealizer() {}
 
   /**
@@ -51,7 +54,7 @@ public class RegionConfigRealizer implements ConfigurationRealizer<RegionConfig>
    * @param regionConfig the name in the regionConfig can not contain sub-regions.
    */
   @Override
-  public RealizationResult create(RegionConfig regionConfig, Cache cache) {
+  public RealizationResult create(RegionConfig regionConfig, InternalCache cache) {
     RegionFactory factory = getRegionFactory(cache, regionConfig.getRegionAttributes());
     factory.create(regionConfig.getName());
     return new RealizationResult().setMessage("Region successfully created.");
@@ -65,7 +68,8 @@ public class RegionConfigRealizer implements ConfigurationRealizer<RegionConfig>
    * @param regionConfig the name in regionConfig is ignored.
    * @param regionPath this is the full path of the region
    */
-  public RealizationResult create(RegionConfig regionConfig, String regionPath, Cache cache) {
+  public RealizationResult create(RegionConfig regionConfig, String regionPath,
+      InternalCache cache) {
     RegionFactory factory = getRegionFactory(cache, regionConfig.getRegionAttributes());
     RegionPath regionPathData = new RegionPath(regionPath);
     String regionName = regionPathData.getName();
@@ -290,18 +294,27 @@ public class RegionConfigRealizer implements ConfigurationRealizer<RegionConfig>
     return partitionAttributes;
   }
 
+
   @Override
-  public boolean exists(RegionConfig config, Cache cache) {
-    return cache.getRegion("/" + config.getName()) != null;
+  public RuntimeRegionInfo get(RegionConfig config, InternalCache cache) {
+    Region<Object, Object> region = cache.getRegion("/" + config.getName());
+    if (region == null) {
+      return null;
+    }
+
+    RuntimeRegionInfo info = new RuntimeRegionInfo();
+    info.setEntryCount(region.size());
+    return info;
   }
 
+
   @Override
-  public RealizationResult update(RegionConfig config, Cache cache) {
+  public RealizationResult update(RegionConfig config, InternalCache cache) {
     throw new NotImplementedException("Not implemented");
   }
 
   @Override
-  public RealizationResult delete(RegionConfig config, Cache cache) {
+  public RealizationResult delete(RegionConfig config, InternalCache cache) {
     Region region = cache.getRegion(config.getName());
     if (region == null) {
       // Since we are trying to delete this region, we can return early
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/validators/MemberValidator.java b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/validators/MemberValidator.java
index b3e250f..c9097b1 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/configuration/validators/MemberValidator.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/configuration/validators/MemberValidator.java
@@ -22,6 +22,8 @@ import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import org.apache.commons.lang3.StringUtils;
+
 import org.apache.geode.cache.configuration.CacheConfig;
 import org.apache.geode.cache.configuration.CacheElement;
 import org.apache.geode.distributed.ConfigurationPersistenceService;
@@ -51,8 +53,8 @@ public class MemberValidator {
     }
 
     Set<DistributedMember> membersOfExistingGroups =
-        findMembers(existingElementsAndTheirGroups.keySet().toArray(new String[0]));
-    Set<DistributedMember> membersOfNewGroup = findMembers(config.getConfigGroup());
+        findServers(existingElementsAndTheirGroups.keySet().toArray(new String[0]));
+    Set<DistributedMember> membersOfNewGroup = findServers(config.getConfigGroup());
     Set<DistributedMember> intersection = new HashSet<>(membersOfExistingGroups);
     intersection.retainAll(membersOfNewGroup);
     if (intersection.size() > 0) {
@@ -94,22 +96,35 @@ public class MemberValidator {
   /**
    * @param groups should not be null contains no element
    */
-  public Set<DistributedMember> findMembers(String... groups) {
+  public Set<DistributedMember> findServers(String... groups) {
+    return findMembers(false, groups);
+  }
+
+  public Set<DistributedMember> findMembers(String id, String... groups) {
+    if (StringUtils.isNotBlank(id)) {
+      return getAllServersAndLocators().stream().filter(m -> m.getName().equals(id))
+          .collect(Collectors.toSet());
+    }
+
+    return findMembers(true, groups);
+  }
+
+  public Set<DistributedMember> findMembers(boolean includeLocators, String... groups) {
     if (groups == null || groups.length == 0) {
-      throw new IllegalArgumentException("groups cannot be empty");
+      groups = new String[] {CacheElement.CLUSTER};
     }
 
-    Set<DistributedMember> allMembers = getAllServers();
+    Set<DistributedMember> all = includeLocators ? getAllServersAndLocators() : getAllServers();
 
     // if groups contains "cluster" group, return all members
     if (Arrays.asList(groups).contains(CacheElement.CLUSTER)) {
-      return allMembers;
+      return all;
     }
 
     Set<DistributedMember> matchingMembers = new HashSet<>();
     for (String group : groups) {
       matchingMembers.addAll(
-          allMembers.stream().filter(m -> m.getGroups() != null && m.getGroups().contains(group))
+          all.stream().filter(m -> m.getGroups() != null && m.getGroups().contains(group))
               .collect(Collectors.toSet()));
     }
     return matchingMembers;
@@ -119,4 +134,9 @@ public class MemberValidator {
     return cache.getDistributionManager().getNormalDistributionManagerIds()
         .stream().map(DistributedMember.class::cast).collect(Collectors.toSet());
   }
+
+  Set<DistributedMember> getAllServersAndLocators() {
+    return cache.getDistributionManager().getDistributionManagerIds()
+        .stream().map(DistributedMember.class::cast).collect(Collectors.toSet());
+  }
 }
diff --git a/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt b/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
index 5c9a60d..82474b1 100644
--- a/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
+++ b/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-core-serializables.txt
@@ -424,7 +424,6 @@ org/apache/geode/management/internal/cli/CliUtil$DeflaterInflaterData,true,11048
 org/apache/geode/management/internal/cli/commands/CreateJndiBindingCommand$DATASOURCE_TYPE,false,type:java/lang/String
 org/apache/geode/management/internal/cli/commands/ImportClusterConfigurationCommand$Action,false
 org/apache/geode/management/internal/cli/domain/AsyncEventQueueDetails,true,1,batchSize:int,diskStoreName:java/lang/String,id:java/lang/String,listener:java/lang/String,listenerProperties:java/util/Properties,maxQueueMemory:int,persistent:boolean
-org/apache/geode/management/internal/cli/domain/CacheServerInfo,true,1,bindAddress:java/lang/String,isRunning:boolean,maxConnections:int,maxThreads:int,port:int
 org/apache/geode/management/internal/cli/domain/DataCommandRequest,false,command:java/lang/String,key:java/lang/String,keyClass:java/lang/String,loadOnCacheMiss:boolean,principal:java/lang/Object,putIfAbsent:boolean,query:java/lang/String,recursive:boolean,regionName:java/lang/String,removeAllKeys:java/lang/String,value:java/lang/String,valueClass:java/lang/String
 org/apache/geode/management/internal/cli/domain/DataCommandResult,true,2601227194108110936,command:java/lang/String,error:java/lang/Throwable,errorString:java/lang/String,getResult:java/lang/Object,hasResultForAggregation:boolean,infoString:java/lang/String,inputKey:java/lang/Object,inputQuery:java/lang/Object,inputValue:java/lang/Object,keyClass:java/lang/String,limit:int,locateEntryLocations:java/util/List,locateEntryResult:org/apache/geode/management/internal/cli/domain/DataCommandRes [...]
 org/apache/geode/management/internal/cli/domain/DataCommandResult$KeyInfo,false,host:java/lang/String,locations:java/util/ArrayList,memberId:java/lang/String,memberName:java/lang/String,pid:int
@@ -440,7 +439,6 @@ org/apache/geode/management/internal/cli/domain/FixedPartitionAttributesInfo,tru
 org/apache/geode/management/internal/cli/domain/IndexDetails,true,-2198907141534201288,fromClause:java/lang/String,indexName:java/lang/String,indexStatisticsDetails:org/apache/geode/management/internal/cli/domain/IndexDetails$IndexStatisticsDetails,indexType:org/apache/geode/cache/query/IndexType,indexedExpression:java/lang/String,isValid:boolean,memberId:java/lang/String,memberName:java/lang/String,projectionAttributes:java/lang/String,regionName:java/lang/String,regionPath:java/lang/String
 org/apache/geode/management/internal/cli/domain/IndexDetails$IndexStatisticsDetails,false,numberOfKeys:java/lang/Long,numberOfUpdates:java/lang/Long,numberOfValues:java/lang/Long,totalUpdateTime:java/lang/Long,totalUses:java/lang/Long
 org/apache/geode/management/internal/cli/domain/MemberConfigurationInfo,false,cacheAttributes:java/util/Map,cacheServerAttributes:java/util/List,gfePropsRuntime:java/util/Map,gfePropsSetFromFile:java/util/Map,gfePropsSetUsingApi:java/util/Map,gfePropsSetWithDefaults:java/util/Map,jvmInputArguments:java/util/List,pdxAttributes:java/util/Map,systemProperties:java/util/Properties
-org/apache/geode/management/internal/cli/domain/MemberInformation,true,1,cacheServerList:java/util/List,cacheXmlFilePath:java/lang/String,clientCount:int,cpuUsage:double,groups:java/lang/String,heapUsage:long,host:java/lang/String,hostedRegions:java/util/Set,httpServiceBindAddress:java/lang/String,httpServicePort:int,id:java/lang/String,initHeapSize:long,isSecured:boolean,isServer:boolean,locatorPort:int,locators:java/lang/String,logFilePath:java/lang/String,maxHeapSize:long,name:java/la [...]
 org/apache/geode/management/internal/cli/domain/PartitionAttributesInfo,true,1,colocatedWith:java/lang/String,fpaInfoList:java/util/List,localMaxMemory:int,nonDefaultAttributes:java/util/Map,partitionResolverName:java/lang/String,recoveryDelay:long,redundantCopies:int,startupRecoveryDelay:long,totalNumBuckets:int
 org/apache/geode/management/internal/cli/domain/RegionAttributesInfo,true,336184564012988487,asyncEventQueueIDs:java/util/Set,cacheListenerClassNames:java/util/List,cacheLoaderClassName:java/lang/String,cacheWriterClassName:java/lang/String,cloningEnabled:boolean,compressorClassName:java/lang/String,concurrencyChecksEnabled:boolean,concurrencyLevel:int,customExpiryIdleTimeoutClass:java/lang/String,customExpiryTTLClass:java/lang/String,dataPolicy:org/apache/geode/cache/DataPolicy,diskStor [...]
 org/apache/geode/management/internal/cli/domain/RegionDescription,true,6461449275798378332,cndEvictionAttributes:java/util/Map,cndPartitionAttributes:java/util/Map,cndRegionAttributes:java/util/Map,dataPolicy:org/apache/geode/cache/DataPolicy,isAccessor:boolean,isLocal:boolean,isPartition:boolean,isPersistent:boolean,isReplicate:boolean,name:java/lang/String,regionDescPerMemberMap:java/util/Map,scope:org/apache/geode/cache/Scope
@@ -449,6 +447,7 @@ org/apache/geode/management/internal/cli/domain/RegionInformation,true,1,dataPol
 org/apache/geode/management/internal/cli/domain/StackTracesPerMember,true,1,memberNameOrId:java/lang/String,stackTraces:byte[]
 org/apache/geode/management/internal/cli/functions/AlterRuntimeConfigFunction,true,1
 org/apache/geode/management/internal/cli/functions/AsyncEventQueueFunctionArgs,true,-6524494645663740872,asyncEventQueueId:java/lang/String,batchSize:int,batchTimeInterval:int,diskStoreName:java/lang/String,diskSynchronous:boolean,dispatcherThreads:int,enableBatchConflation:boolean,forwardExpirationDestroy:boolean,gatewayEventFilters:java/lang/String[],gatewaySubstitutionFilter:java/lang/String,isParallel:boolean,listenerClassName:java/lang/String,listenerProperties:java/util/Properties, [...]
+org/apache/geode/management/internal/cli/functions/CacheRealizationFunction,false
 org/apache/geode/management/internal/cli/functions/ChangeLogLevelFunction,true,1
 org/apache/geode/management/internal/cli/functions/CliFunctionResult$StatusState,false
 org/apache/geode/management/internal/cli/functions/CloseDurableClientFunction,true,1
@@ -514,7 +513,7 @@ org/apache/geode/management/internal/cli/functions/ShutDownFunction,true,1
 org/apache/geode/management/internal/cli/functions/SizeExportLogsFunction,true,1
 org/apache/geode/management/internal/cli/functions/UndeployFunction,true,1
 org/apache/geode/management/internal/cli/functions/UnregisterFunction,true,1
-org/apache/geode/management/internal/cli/functions/UpdateCacheFunction,false
+org/apache/geode/management/internal/cli/functions/CacheRealizationFunction,false
 org/apache/geode/management/internal/cli/functions/UserFunctionExecution,true,1
 org/apache/geode/management/internal/cli/result/CommandResultException,true,1,result:org/apache/geode/management/cli/Result
 org/apache/geode/management/internal/cli/result/TableBuilder$Align,false
diff --git a/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-management-serializables.txt b/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-management-serializables.txt
index 658e281..8b06577 100644
--- a/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-management-serializables.txt
+++ b/geode-core/src/main/resources/org/apache/geode/internal/sanctioned-geode-management-serializables.txt
@@ -34,6 +34,7 @@ org/apache/geode/cache/configuration/RegionType,false
 org/apache/geode/management/api/ClusterManagementResult$StatusCode,false
 org/apache/geode/management/api/RealizationResult,false,memberName:java/lang/String,message:java/lang/String,success:boolean
 org/apache/geode/management/configuration/MemberConfig,false,id:java/lang/String
-org/apache/geode/management/configuration/RuntimeMemberConfig,false,cacheServers:java/util/List,clientConnections:int,host:java/lang/String,initialHeap:long,isCoordinator:boolean,isLocator:boolean,logFile:java/lang/String,maxHeap:long,pid:int,port:java/lang/Integer,status:java/lang/String,usedHeap:long,workingDirectory:java/lang/String
-org/apache/geode/management/configuration/RuntimeRegionConfig,false,entryCount:long
 org/apache/geode/management/internal/cli/domain/ClassName,true,1,className:java/lang/String,initProperties:java/util/Properties
+org/apache/geode/management/runtime/CacheServerInfo,true,1,bindAddress:java/lang/String,isRunning:boolean,maxConnections:int,maxThreads:int,port:int
+org/apache/geode/management/runtime/MemberInformation,true,1,cacheServerList:java/util/List,cacheXmlFilePath:java/lang/String,clientCount:int,cpuUsage:double,groups:java/lang/String,heapUsage:long,host:java/lang/String,hostedRegions:java/util/Set,httpServiceBindAddress:java/lang/String,httpServicePort:int,id:java/lang/String,initHeapSize:long,isCoordinator:boolean,isSecured:boolean,isServer:boolean,locatorPort:int,locators:java/lang/String,logFilePath:java/lang/String,maxHeapSize:long,na [...]
+org/apache/geode/management/runtime/RuntimeRegionInfo,false,entryCount:long: new class
\ No newline at end of file
diff --git a/geode-core/src/test/java/org/apache/geode/cache/configuration/RegionConfigTest.java b/geode-core/src/test/java/org/apache/geode/cache/configuration/RegionConfigTest.java
index 8fa29f0..af964be 100644
--- a/geode-core/src/test/java/org/apache/geode/cache/configuration/RegionConfigTest.java
+++ b/geode-core/src/test/java/org/apache/geode/cache/configuration/RegionConfigTest.java
@@ -32,6 +32,8 @@ import org.apache.geode.internal.config.JAXBService;
 import org.apache.geode.management.api.RestfulEndpoint;
 import org.apache.geode.management.internal.CacheElementOperation;
 import org.apache.geode.management.internal.configuration.validators.RegionConfigValidator;
+import org.apache.geode.management.runtime.RuntimeInfo;
+import org.apache.geode.management.runtime.RuntimeRegionInfo;
 import org.apache.geode.util.internal.GeodeJsonMapper;
 
 public class RegionConfigTest {
@@ -268,4 +270,18 @@ public class RegionConfigTest {
     assertThat(regionConfig.getUri())
         .isEqualTo(RestfulEndpoint.URI_CONTEXT + "/v2/regions/regionA");
   }
+
+  @Test
+  public void getRuntimeClass() throws Exception {
+    RegionConfig config = new RegionConfig();
+    assertThat(config.getRuntimeClass()).isEqualTo(RuntimeRegionInfo.class);
+    assertThat(config.hasRuntimeInfo()).isTrue();
+  }
+
+  @Test
+  public void getIndexRuntimeClass() throws Exception {
+    RegionConfig.Index index = new RegionConfig.Index();
+    assertThat(index.getRuntimeClass()).isEqualTo(RuntimeInfo.class);
+    assertThat(index.hasRuntimeInfo()).isFalse();
+  }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/api/ClusterManagementResultTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/api/ClusterManagementResultTest.java
index d063255..eab83b3 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/api/ClusterManagementResultTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/api/ClusterManagementResultTest.java
@@ -21,14 +21,20 @@ import static org.apache.geode.management.api.ClusterManagementResult.StatusCode
 import static org.apache.geode.management.api.ClusterManagementResult.StatusCode.OK;
 import static org.assertj.core.api.Assertions.assertThat;
 
+import java.util.Collections;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.junit.Before;
 import org.junit.Test;
 
+import org.apache.geode.cache.configuration.RegionConfig;
 import org.apache.geode.management.api.ClusterManagementResult;
+import org.apache.geode.management.api.Response;
+import org.apache.geode.management.runtime.RuntimeRegionInfo;
 import org.apache.geode.util.internal.GeodeJsonMapper;
 
 public class ClusterManagementResultTest {
-  private ClusterManagementResult<?> result;
+  private ClusterManagementResult result;
 
   @Before
   public void setup() {
@@ -109,8 +115,35 @@ public class ClusterManagementResultTest {
   @Test
   public void deserialize() throws Exception {
     String json = "{\"statusCode\":\"OK\"}";
-    ClusterManagementResult<?> result =
+    ClusterManagementResult result =
         GeodeJsonMapper.getMapper().readValue(json, ClusterManagementResult.class);
     assertThat(result.getResult()).isNotNull().isEmpty();
   }
+
+  @Test
+  public void serializeResult() throws Exception {
+    ObjectMapper mapper = GeodeJsonMapper.getMapper();
+    ClusterManagementResult<RegionConfig, RuntimeRegionInfo> result =
+        new ClusterManagementResult<>();
+    Response<RegionConfig, RuntimeRegionInfo> response = new Response<>();
+    RegionConfig region = new RegionConfig();
+    region.setName("region");
+    region.setType("REPLICATE");
+    region.setGroup("group1");
+    response.setConfig(region);
+
+    RuntimeRegionInfo info = new RuntimeRegionInfo();
+    info.setEntryCount(3);
+    response.setRuntimeInfo(Collections.singletonList(info));
+    result.setResult(Collections.singletonList(response));
+
+    String json = mapper.writeValueAsString(result);
+    System.out.println(json);
+    ClusterManagementResult<RegionConfig, RuntimeRegionInfo> result1 =
+        mapper.readValue(json, ClusterManagementResult.class);
+    assertThat(result1.getConfigResult()).hasSize(1)
+        .extracting(RegionConfig::getName).containsExactly("region");
+    assertThat(result1.getRuntimeResult()).hasSize(1)
+        .extracting(RuntimeRegionInfo::getEntryCount).containsExactly(3L);
+  }
 }
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/api/LocatorClusterManagementServiceTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/api/LocatorClusterManagementServiceTest.java
index eb15c1c..078a686 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/api/LocatorClusterManagementServiceTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/api/LocatorClusterManagementServiceTest.java
@@ -53,7 +53,6 @@ import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.api.RealizationResult;
 import org.apache.geode.management.configuration.MemberConfig;
-import org.apache.geode.management.configuration.RuntimeRegionConfig;
 import org.apache.geode.management.internal.CacheElementOperation;
 import org.apache.geode.management.internal.configuration.mutators.ConfigurationManager;
 import org.apache.geode.management.internal.configuration.mutators.GatewayReceiverConfigManager;
@@ -70,12 +69,12 @@ public class LocatorClusterManagementServiceTest {
   private InternalCache cache;
   private InternalConfigurationPersistenceService persistenceService;
   private RegionConfig regionConfig;
-  private ClusterManagementResult<RegionConfig> result;
+  private ClusterManagementResult<?, ?> result;
   private Map<Class, ConfigurationValidator> validators = new HashMap<>();
   private Map<Class, ConfigurationManager> managers = new HashMap<>();
   private ConfigurationValidator<RegionConfig> regionValidator;
   private CacheElementValidator cacheElementValidator;
-  private ConfigurationManager<RegionConfig, RuntimeRegionConfig> regionManager;
+  private ConfigurationManager<RegionConfig> regionManager;
   private MemberValidator memberValidator;
 
   @Before
@@ -116,7 +115,7 @@ public class LocatorClusterManagementServiceTest {
 
   @Test
   public void create_validatorIsCalledCorrectly() throws Exception {
-    doReturn(Collections.emptySet()).when(memberValidator).findMembers(anyString());
+    doReturn(Collections.emptySet()).when(memberValidator).findServers(anyString());
     doNothing().when(persistenceService).updateCacheConfig(any(), any());
     service.create(regionConfig);
     verify(cacheElementValidator).validate(CacheElementOperation.CREATE, regionConfig);
@@ -126,7 +125,7 @@ public class LocatorClusterManagementServiceTest {
 
   @Test
   public void delete_validatorIsCalledCorrectly() throws Exception {
-    doReturn(Collections.emptySet()).when(memberValidator).findMembers(anyString());
+    doReturn(Collections.emptySet()).when(memberValidator).findServers(anyString());
     doReturn(new String[] {"cluster"}).when(memberValidator).findGroupsWithThisElement(
         regionConfig.getId(),
         regionManager);
@@ -135,7 +134,7 @@ public class LocatorClusterManagementServiceTest {
     verify(cacheElementValidator).validate(CacheElementOperation.DELETE, regionConfig);
     verify(regionValidator).validate(CacheElementOperation.DELETE, regionConfig);
     verify(memberValidator).findGroupsWithThisElement(regionConfig.getId(), regionManager);
-    verify(memberValidator).findMembers("cluster");
+    verify(memberValidator).findServers("cluster");
   }
 
   @Test
@@ -147,7 +146,7 @@ public class LocatorClusterManagementServiceTest {
     doReturn(functionResults).when(service).executeAndGetFunctionResult(any(), any(), any());
 
     doReturn(Collections.singleton(mock(DistributedMember.class))).when(memberValidator)
-        .findMembers(any());
+        .findServers();
 
     when(persistenceService.getCacheConfig("cluster", true)).thenReturn(new CacheConfig());
     regionConfig.setName("test");
@@ -165,7 +164,7 @@ public class LocatorClusterManagementServiceTest {
     doReturn(functionResults).when(service).executeAndGetFunctionResult(any(), any(), any());
 
     doReturn(Collections.singleton(mock(DistributedMember.class))).when(memberValidator)
-        .findMembers(any());
+        .findServers();
 
     CacheConfig cacheConfig = new CacheConfig();
     when(persistenceService.getCacheConfig("cluster", true)).thenReturn(cacheConfig);
@@ -202,10 +201,10 @@ public class LocatorClusterManagementServiceTest {
   @Test
   public void list_aRegionInClusterAndGroup1() throws Exception {
     doReturn(Sets.newHashSet("cluster", "group1")).when(persistenceService).getGroups();
-    RuntimeRegionConfig region1 = new RuntimeRegionConfig();
+    RegionConfig region1 = new RegionConfig();
     region1.setName("region1");
     region1.setType("REPLICATE");
-    RuntimeRegionConfig region2 = new RuntimeRegionConfig();
+    RegionConfig region2 = new RegionConfig();
     region2.setName("region1");
     region2.setType("REPLICATE");
 
@@ -215,10 +214,10 @@ public class LocatorClusterManagementServiceTest {
 
     // this is to make sure when 'cluster" is in one of the group, it will show
     // the cluster and the other group name
-    List<RuntimeRegionConfig> results =
-        service.list(new RegionConfig()).getResult();
+    List<RegionConfig> results =
+        service.list(new RegionConfig()).getConfigResult();
     assertThat(results).hasSize(1);
-    RuntimeRegionConfig result = results.get(0);
+    RegionConfig result = results.get(0);
     assertThat(result.getName()).isEqualTo("region1");
     assertThat(result.getGroups()).containsExactlyInAnyOrder("cluster", "group1");
   }
@@ -254,7 +253,7 @@ public class LocatorClusterManagementServiceTest {
     doReturn(new String[] {"cluster"}).when(memberValidator).findGroupsWithThisElement(any(),
         any());
     doReturn(Collections.singleton(mock(DistributedMember.class))).when(memberValidator)
-        .findMembers(any());
+        .findServers();
 
     CacheConfig config = new CacheConfig();
     RegionConfig regionConfig = new RegionConfig();
@@ -280,7 +279,7 @@ public class LocatorClusterManagementServiceTest {
     doReturn(new String[] {"cluster"}).when(memberValidator).findGroupsWithThisElement(any(),
         any());
     doReturn(Collections.singleton(mock(DistributedMember.class))).when(memberValidator)
-        .findMembers(any());
+        .findServers();
 
     CacheConfig config = new CacheConfig();
     RegionConfig regionConfig = new RegionConfig();
@@ -303,12 +302,12 @@ public class LocatorClusterManagementServiceTest {
     doReturn(new String[] {"cluster"}).when(memberValidator).findGroupsWithThisElement(any(),
         any());
     // no members found in any group
-    doReturn(Collections.emptySet()).when(memberValidator).findMembers(any());
+    doReturn(Collections.emptySet()).when(memberValidator).findServers();
     doReturn(null).when(persistenceService).getConfiguration(any());
     Region mockRegion = mock(Region.class);
     doReturn(mockRegion).when(persistenceService).getConfigurationRegion();
 
-    ClusterManagementResult<RegionConfig> result = service.delete(regionConfig);
+    ClusterManagementResult<?, ?> result = service.delete(regionConfig);
     verify(regionManager).delete(eq(regionConfig), any());
     assertThat(result.isSuccessful()).isTrue();
     assertThat(result.getMemberStatuses()).hasSize(0);
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateIndexCommandTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateIndexCommandTest.java
index 991b108..58d6e72 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateIndexCommandTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateIndexCommandTest.java
@@ -39,7 +39,6 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
 import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.api.ClusterManagementService;
-import org.apache.geode.management.configuration.RuntimeRegionConfig;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.cli.result.CommandResult;
 import org.apache.geode.test.junit.rules.GfshParserRule;
@@ -149,7 +148,7 @@ public class CreateIndexCommandTest {
   @Test
   public void getValidRegionName() {
     // the existing configuration has a region named /regionA.B
-    doReturn(mock(RuntimeRegionConfig.class)).when(command).getRuntimeRegionConfig(cms,
+    doReturn(mock(RegionConfig.class)).when(command).getRegionConfig(cms,
         "/regionA.B");
     when(cms.list(any())).thenReturn(new ClusterManagementResult<>());
 
@@ -167,10 +166,10 @@ public class CreateIndexCommandTest {
   @Test
   public void groupIgnored() throws Exception {
     doReturn(ccService).when(command).getConfigurationPersistenceService();
-    RuntimeRegionConfig config = mock(RuntimeRegionConfig.class);
+    RegionConfig config = mock(RegionConfig.class);
     List<String> realGroups = Arrays.asList("group2", "group1");
     when(config.getGroups()).thenReturn(realGroups);
-    doReturn(config).when(command).getRuntimeRegionConfig(any(), any());
+    doReturn(config).when(command).getRegionConfig(any(), any());
 
     doReturn(Collections.singleton(mock(DistributedMember.class))).when(command).findMembers(any(),
         any());
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/configuration/mutators/MemberConfigManagerTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/configuration/mutators/MemberConfigManagerTest.java
deleted file mode 100644
index f068cb6..0000000
--- a/geode-core/src/test/java/org/apache/geode/management/internal/configuration/mutators/MemberConfigManagerTest.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-package org.apache.geode.management.internal.configuration.mutators;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import org.apache.geode.distributed.DistributedMember;
-import org.apache.geode.distributed.internal.DistributionManager;
-import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
-import org.apache.geode.distributed.internal.membership.MembershipManager;
-import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.management.configuration.MemberConfig;
-import org.apache.geode.management.configuration.RuntimeMemberConfig;
-import org.apache.geode.management.internal.cli.domain.CacheServerInfo;
-import org.apache.geode.management.internal.cli.domain.MemberInformation;
-
-public class MemberConfigManagerTest {
-  private MemberConfigManager memberConfigManager;
-  private DistributionManager distributionManager;
-  private MembershipManager membershipManager;
-  private DistributedMember coordinator;
-  private CacheServerInfo cacheServerInfo;
-  private MemberConfig filter;
-  private InternalDistributedMember internalDistributedMemberMatch;
-  private InternalDistributedMember internalDistributedMember;
-
-  @Before
-  public void setUp() throws Exception {
-    InternalCache cache = mock(InternalCache.class);
-    memberConfigManager = new MemberConfigManager(cache);
-    distributionManager = mock(DistributionManager.class);
-    membershipManager = mock(MembershipManager.class);
-    coordinator = mock(DistributedMember.class);
-    cacheServerInfo = mock(CacheServerInfo.class);
-    filter = new MemberConfig();
-    internalDistributedMember = mock(InternalDistributedMember.class);
-    internalDistributedMemberMatch = mock(InternalDistributedMember.class);
-
-    when(internalDistributedMember.getName()).thenReturn("no-match");
-    when(cache.getDistributionManager()).thenReturn(distributionManager);
-  }
-
-  @Test
-  public void getDistributedMembersNoFilter() {
-    Set<InternalDistributedMember> internalDistributedMembers = new HashSet<>();
-    internalDistributedMembers.add(internalDistributedMember);
-    internalDistributedMembers.add(internalDistributedMember);
-    when(distributionManager.getDistributionManagerIds()).thenReturn(internalDistributedMembers);
-
-    assertThat(memberConfigManager.getDistributedMembers(filter).size())
-        .isEqualTo(internalDistributedMembers.size());
-  }
-
-  @Test
-  public void getDistributedMembersReturnsNothing() {
-    filter.setId("some-id-no-one-else-has");
-    Set<InternalDistributedMember> internalDistributedMembers = new HashSet<>();
-
-    internalDistributedMembers.add(internalDistributedMember);
-    internalDistributedMembers.add(internalDistributedMember);
-    when(distributionManager.getDistributionManagerIds()).thenReturn(internalDistributedMembers);
-
-    assertThat(memberConfigManager.getDistributedMembers(filter).size())
-        .isEqualTo(0);
-  }
-
-  @Test
-  public void getDistributedMembersReturnsSomeMatches() {
-    String sharedId = "shared-id";
-    filter.setId(sharedId);
-    Set<InternalDistributedMember> internalDistributedMembers = new HashSet<>();
-    when(internalDistributedMemberMatch.getName()).thenReturn(sharedId);
-    internalDistributedMembers.add(internalDistributedMemberMatch);
-    internalDistributedMembers.add(internalDistributedMember);
-    when(distributionManager.getDistributionManagerIds()).thenReturn(internalDistributedMembers);
-
-    assertThat(memberConfigManager.getDistributedMembers(filter).size())
-        .isEqualTo(1);
-  }
-
-  @Test
-  public void generatesMemberConfigs() {
-    ArrayList<MemberInformation> emptyArrayList = new ArrayList<>();
-    assertThat(memberConfigManager.generateMemberConfigs(emptyArrayList)).isNotNull();
-
-    ArrayList<MemberInformation> smallArrayList = new ArrayList<>();
-    MemberInformation someMemberInfo = new MemberInformation();
-    someMemberInfo.setGroups("hello");
-    someMemberInfo.setId("world");
-    smallArrayList.add(someMemberInfo);
-    MemberInformation someOtherMemberInfo = new MemberInformation();
-    someOtherMemberInfo.setId("hello");
-    someOtherMemberInfo.setGroups("world");
-    smallArrayList.add(someOtherMemberInfo);
-    assertThat(memberConfigManager.generateMemberConfigs(smallArrayList).size())
-        .isEqualTo(smallArrayList.size());
-  }
-
-  @Test
-  public void generateMemberConfig() {
-    MemberInformation memberInformation = new MemberInformation();
-    memberInformation.setId("some-id");
-    String someName = "some-name";
-    memberInformation.setName(someName);
-    String someHost = "some-host";
-    memberInformation.setHost(someHost);
-    int somePid = 7;
-    memberInformation.setProcessId(somePid);
-    String someStatus = "some-status";
-    memberInformation.setStatus(someStatus);
-    long someInitHeapSize = 234L;
-    memberInformation.setInitHeapSize(someInitHeapSize);
-    long someMaxHeapSize = 523L;
-    memberInformation.setMaxHeapSize(someMaxHeapSize);
-    long someHeapUsage = 123L;
-    memberInformation.setHeapUsage(someHeapUsage);
-    String somePath = "somePath";
-    memberInformation.setLogFilePath(somePath);
-    memberInformation.setWorkingDirPath(somePath);
-
-    RuntimeMemberConfig memberConfig =
-        memberConfigManager.generateMemberConfig("coordinatorId", memberInformation);
-    assertThat(memberConfig.getId()).isEqualTo(someName);
-    assertThat(memberConfig.getHost()).isEqualTo(someHost);
-    assertThat(memberConfig.getPid()).isEqualTo(somePid);
-    assertThat(memberConfig.getStatus()).isEqualTo(someStatus);
-    assertThat(memberConfig.getInitialHeap()).isEqualTo(someInitHeapSize);
-    assertThat(memberConfig.getMaxHeap()).isEqualTo(someMaxHeapSize);
-    assertThat(memberConfig.getUsedHeap()).isEqualTo(someHeapUsage);
-    assertThat(memberConfig.getLogFile()).isEqualTo(somePath);
-    assertThat(memberConfig.getWorkingDirectory()).isEqualTo(somePath);
-    assertThat(memberConfig.isCoordinator()).isFalse();
-  }
-
-  @Test
-  public void generateServerMemberConfig() {
-    int somePort = 5000;
-    when(cacheServerInfo.getPort()).thenReturn(somePort);
-    int someConnectionNumber = 10;
-    when(cacheServerInfo.getMaxConnections()).thenReturn(someConnectionNumber);
-    int someThreadNumber = 5;
-    when(cacheServerInfo.getMaxThreads()).thenReturn(someThreadNumber);
-
-    MemberInformation memberInformation = new MemberInformation();
-    memberInformation.addCacheServerInfo(cacheServerInfo);
-    memberInformation.setServer(true);
-    String someGroup1 = "something1";
-    String someGroup2 = "something2";
-    memberInformation.setGroups(someGroup1 + "," + someGroup2);
-    String memberId = "memberId";
-    memberInformation.setId(memberId);
-
-    String coordinatorId = "coordinatorId";
-    RuntimeMemberConfig memberConfig =
-        memberConfigManager.generateMemberConfig(coordinatorId, memberInformation);
-
-    assertThat(memberConfig.isLocator()).isFalse();
-    assertThat(memberConfig.isCoordinator()).isFalse();
-    RuntimeMemberConfig.CacheServerConfig cacheServerConfig = memberConfig.getCacheServers().get(0);
-    assertThat(cacheServerConfig).isNotNull();
-    assertThat(cacheServerConfig.getPort()).isEqualTo(somePort);
-    assertThat(cacheServerConfig.getMaxConnections()).isEqualTo(someConnectionNumber);
-    assertThat(cacheServerConfig.getMaxThreads()).isEqualTo(someThreadNumber);
-    assertThat(memberConfig.getGroups()).contains(someGroup1, someGroup2);
-  }
-
-  @Test
-  public void generateLocatorMemberConfig() {
-    MemberInformation memberInformation = new MemberInformation();
-    int someLocatorPort = 180;
-    memberInformation.setLocatorPort(someLocatorPort);
-    String memberId = "memberId";
-    memberInformation.setId(memberId);
-
-    String coordinatorId = "coordinatorId";
-    RuntimeMemberConfig memberConfig =
-        memberConfigManager.generateMemberConfig(coordinatorId, memberInformation);
-    assertThat(memberConfig.getPort()).isEqualTo(someLocatorPort);
-    assertThat(memberConfig.isLocator()).isTrue();
-    assertThat(memberConfig.isCoordinator()).isFalse();
-  }
-
-
-  @Test
-  public void generateCoordinatorMemberConfig() {
-    MemberInformation memberInformation = new MemberInformation();
-    String coordinatorId = "coordinatorId";
-    memberInformation.setId(coordinatorId);
-
-    RuntimeMemberConfig memberConfig =
-        memberConfigManager.generateMemberConfig(coordinatorId, memberInformation);
-    assertThat(memberConfig.isCoordinator()).isTrue();
-  }
-
-  @Test
-  public void getsCoordinatorId() {
-    when(distributionManager.getMembershipManager()).thenReturn(membershipManager);
-    when(membershipManager.getCoordinator()).thenReturn(coordinator);
-    String coordinatorId = "some-id";
-    when(coordinator.getId()).thenReturn(coordinatorId);
-
-    assertThat(memberConfigManager.getCoordinatorId()).isEqualTo(coordinatorId);
-  }
-
-  @Test
-  public void getCoordinatorIdReturnsNullWhenMembershipManagerIsNull() {
-    when(distributionManager.getMembershipManager()).thenReturn(null);
-
-    assertThat(memberConfigManager.getCoordinatorId()).isNull();
-  }
-
-  @Test
-  public void getCoordinatorIdReturnsNullWhenCoordinatorIsNull() {
-    when(distributionManager.getMembershipManager()).thenReturn(membershipManager);
-    when(membershipManager.getCoordinator()).thenReturn(null);
-
-    assertThat(memberConfigManager.getCoordinatorId()).isNull();
-  }
-}
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigManagerTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigManagerTest.java
index 36d0f22..11a733b 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigManagerTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/configuration/mutators/RegionConfigManagerTest.java
@@ -15,25 +15,14 @@
 
 package org.apache.geode.management.internal.configuration.mutators;
 
-import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
-
-import java.util.ArrayList;
-import java.util.List;
 
 import org.junit.Before;
 import org.junit.Test;
 
-import org.apache.geode.cache.configuration.CacheConfig;
 import org.apache.geode.cache.configuration.RegionConfig;
 import org.apache.geode.cache.configuration.RegionType;
-import org.apache.geode.internal.cache.InternalCache;
-import org.apache.geode.management.ManagementService;
-import org.apache.geode.management.configuration.RuntimeRegionConfig;
 
 public class RegionConfigManagerTest {
 
@@ -42,8 +31,7 @@ public class RegionConfigManagerTest {
 
   @Before
   public void before() throws Exception {
-    InternalCache cache = mock(InternalCache.class);
-    manager = spy(new RegionConfigManager(cache));
+    manager = spy(new RegionConfigManager());
     config1 = new RegionConfig();
     config1.setName("test");
     config2 = new RegionConfig();
@@ -51,21 +39,6 @@ public class RegionConfigManagerTest {
   }
 
   @Test
-  public void entryCountIsZeroEvenIfMbeanIsNotAvailable() throws Exception {
-    CacheConfig existing = mock(CacheConfig.class);
-    List<RegionConfig> staticRegionConfigs = new ArrayList<>();
-    config1.setName("region1");
-    staticRegionConfigs.add(config1);
-    when(existing.getRegions()).thenReturn(staticRegionConfigs);
-
-
-    ManagementService managementService = mock(ManagementService.class);
-    doReturn(managementService).when(manager).getManagementService();
-    List<RuntimeRegionConfig> result = manager.list(new RegionConfig(), existing);
-    assertThat(result.get(0).getEntryCount()).isEqualTo(0);
-  }
-
-  @Test
   public void compatibleWithItself() throws Exception {
     config1.setType(RegionType.REPLICATE);
     manager.checkCompatibility(config1, "group", config1);
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/configuration/validators/MemberValidatorTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/configuration/validators/MemberValidatorTest.java
index c38bb15..9d35e0c 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/configuration/validators/MemberValidatorTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/configuration/validators/MemberValidatorTest.java
@@ -89,18 +89,20 @@ public class MemberValidatorTest {
 
   @Test
   public void findMembers() throws Exception {
-    assertThatThrownBy(() -> validator.findMembers(null))
-        .isInstanceOf(IllegalArgumentException.class);
-    assertThatThrownBy(() -> validator.findMembers(new String[] {}))
-        .isInstanceOf(IllegalArgumentException.class);
+    assertThat(validator.findServers(null))
+        .flatExtracting(DistributedMember::getName)
+        .containsExactlyInAnyOrder("member1", "member2", "member3", "member4", "member5");
+    assertThat(validator.findServers(new String[] {}))
+        .flatExtracting(DistributedMember::getName)
+        .containsExactlyInAnyOrder("member1", "member2", "member3", "member4", "member5");
 
-    assertThat(validator.findMembers("group1")).flatExtracting(DistributedMember::getName)
+    assertThat(validator.findServers("group1")).flatExtracting(DistributedMember::getName)
         .containsExactlyInAnyOrder("member2", "member4");
-    assertThat(validator.findMembers("group1", "group2")).flatExtracting(DistributedMember::getName)
+    assertThat(validator.findServers("group1", "group2")).flatExtracting(DistributedMember::getName)
         .containsExactlyInAnyOrder("member2", "member3", "member4");
-    assertThat(validator.findMembers("group1", "group3")).flatExtracting(DistributedMember::getName)
+    assertThat(validator.findServers("group1", "group3")).flatExtracting(DistributedMember::getName)
         .containsExactlyInAnyOrder("member2", "member4", "member5");
-    assertThat(validator.findMembers("cluster", "group3"))
+    assertThat(validator.findServers("cluster", "group3"))
         .flatExtracting(DistributedMember::getName)
         .containsExactlyInAnyOrder("member1", "member2", "member3", "member4", "member5");
   }
diff --git a/geode-junit/src/main/java/org/apache/geode/test/junit/assertions/ClusterManagementResultAssert.java b/geode-junit/src/main/java/org/apache/geode/test/junit/assertions/ClusterManagementResultAssert.java
index 6084ea7..045eff9 100644
--- a/geode-junit/src/main/java/org/apache/geode/test/junit/assertions/ClusterManagementResultAssert.java
+++ b/geode-junit/src/main/java/org/apache/geode/test/junit/assertions/ClusterManagementResultAssert.java
@@ -25,31 +25,34 @@ import org.assertj.core.api.ListAssert;
 import org.apache.geode.cache.configuration.CacheElement;
 import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.api.RealizationResult;
+import org.apache.geode.management.api.RespondsWith;
+import org.apache.geode.management.api.Response;
+import org.apache.geode.management.runtime.RuntimeInfo;
 
-public class ClusterManagementResultAssert<R extends CacheElement>
-    extends AbstractAssert<ClusterManagementResultAssert<R>, ClusterManagementResult<R>> {
+public class ClusterManagementResultAssert<T extends CacheElement & RespondsWith<R>, R extends RuntimeInfo>
+    extends AbstractAssert<ClusterManagementResultAssert<T, R>, ClusterManagementResult<T, R>> {
   public ClusterManagementResultAssert(
-      ClusterManagementResult<R> clusterManagementResult, Class<?> selfType) {
+      ClusterManagementResult<T, R> clusterManagementResult, Class<?> selfType) {
     super(clusterManagementResult, selfType);
   }
 
-  public ClusterManagementResultAssert<R> isSuccessful() {
+  public ClusterManagementResultAssert<T, R> isSuccessful() {
     assertThat(actual.isSuccessful()).isTrue();
     return this;
   }
 
-  public ClusterManagementResultAssert<R> failed() {
+  public ClusterManagementResultAssert<T, R> failed() {
     assertThat(actual.isSuccessful()).isFalse();
     return this;
   }
 
-  public ClusterManagementResultAssert<R> hasStatusCode(
+  public ClusterManagementResultAssert<T, R> hasStatusCode(
       ClusterManagementResult.StatusCode... codes) {
     assertThat(actual.getStatusCode()).isIn(codes);
     return this;
   }
 
-  public ClusterManagementResultAssert<R> containsStatusMessage(String statusMessage) {
+  public ClusterManagementResultAssert<T, R> containsStatusMessage(String statusMessage) {
     assertThat(actual.getStatusMessage()).contains(statusMessage);
     return this;
   }
@@ -62,20 +65,20 @@ public class ClusterManagementResultAssert<R extends CacheElement>
     return actual.getMemberStatuses();
   }
 
-  public ListAssert<R> hasListResult() {
+  public ListAssert<Response<T, R>> hasListResult() {
     return assertThat(actual.getResult());
   }
 
-  public R getResult(int index) {
+  public Response<T, R> getResult(int index) {
     return getActual().getResult().get(index);
   }
 
-  public static <R extends CacheElement> ClusterManagementResultAssert<R> assertManagementResult(
-      ClusterManagementResult<R> result) {
+  public static <T extends CacheElement & RespondsWith<R>, R extends RuntimeInfo> ClusterManagementResultAssert<T, R> assertManagementResult(
+      ClusterManagementResult<T, R> result) {
     return new ClusterManagementResultAssert<>(result, ClusterManagementResultAssert.class);
   }
 
-  public ClusterManagementResult<R> getActual() {
+  public ClusterManagementResult<T, R> getActual() {
     return actual;
   }
 }
diff --git a/geode-management/src/main/java/org/apache/geode/cache/configuration/GatewayReceiverConfig.java b/geode-management/src/main/java/org/apache/geode/cache/configuration/GatewayReceiverConfig.java
index 2abfe06..d53a8f2 100644
--- a/geode-management/src/main/java/org/apache/geode/cache/configuration/GatewayReceiverConfig.java
+++ b/geode-management/src/main/java/org/apache/geode/cache/configuration/GatewayReceiverConfig.java
@@ -29,6 +29,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 
 import org.apache.geode.management.api.RespondsWith;
 import org.apache.geode.management.api.RestfulEndpoint;
+import org.apache.geode.management.runtime.RuntimeInfo;
 
 /**
  * <p>
@@ -62,7 +63,7 @@ import org.apache.geode.management.api.RestfulEndpoint;
 @XmlType(name = "", propOrder = {"gatewayTransportFilters"})
 @JsonIgnoreProperties(value = {"uri"}, allowGetters = true)
 public class GatewayReceiverConfig extends CacheElement
-    implements RestfulEndpoint, RespondsWith<GatewayReceiverConfig> {
+    implements RestfulEndpoint, RespondsWith<RuntimeInfo> {
 
   @XmlElement(name = "gateway-transport-filter",
       namespace = "http://geode.apache.org/schema/cache")
diff --git a/geode-management/src/main/java/org/apache/geode/cache/configuration/PdxType.java b/geode-management/src/main/java/org/apache/geode/cache/configuration/PdxType.java
index 6a7415e..3d931cd 100644
--- a/geode-management/src/main/java/org/apache/geode/cache/configuration/PdxType.java
+++ b/geode-management/src/main/java/org/apache/geode/cache/configuration/PdxType.java
@@ -78,7 +78,7 @@ import org.apache.geode.management.api.RestfulEndpoint;
     propOrder = {"pdxSerializer"})
 @Experimental
 @JsonIgnoreProperties(value = {"uri"}, allowGetters = true)
-public class PdxType extends CacheElement implements RestfulEndpoint, RespondsWith<PdxType> {
+public class PdxType extends CacheElement implements RestfulEndpoint, RespondsWith<Void> {
   @XmlElement(name = "pdx-serializer", namespace = "http://geode.apache.org/schema/cache")
   protected DeclarableType pdxSerializer;
   @XmlAttribute(name = "read-serialized")
diff --git a/geode-management/src/main/java/org/apache/geode/cache/configuration/RegionConfig.java b/geode-management/src/main/java/org/apache/geode/cache/configuration/RegionConfig.java
index bc371d8..66679b5 100644
--- a/geode-management/src/main/java/org/apache/geode/cache/configuration/RegionConfig.java
+++ b/geode-management/src/main/java/org/apache/geode/cache/configuration/RegionConfig.java
@@ -39,7 +39,8 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.management.api.RespondsWith;
 import org.apache.geode.management.api.RestfulEndpoint;
-import org.apache.geode.management.configuration.RuntimeRegionConfig;
+import org.apache.geode.management.runtime.RuntimeInfo;
+import org.apache.geode.management.runtime.RuntimeRegionInfo;
 
 
 /**
@@ -161,7 +162,7 @@ import org.apache.geode.management.configuration.RuntimeRegionConfig;
 @Experimental
 @JsonIgnoreProperties(value = {"uri"}, allowGetters = true)
 public class RegionConfig extends CacheElement implements RestfulEndpoint,
-    RespondsWith<RuntimeRegionConfig> {
+    RespondsWith<RuntimeRegionInfo> {
 
   public static final String REGION_CONFIG_ENDPOINT = "/regions";
 
@@ -206,6 +207,11 @@ public class RegionConfig extends CacheElement implements RestfulEndpoint,
   }
 
   @Override
+  public boolean isGlobalRuntime() {
+    return true;
+  }
+
+  @Override
   @JsonIgnore
   public String getEndpoint() {
     return REGION_CONFIG_ENDPOINT;
@@ -538,7 +544,7 @@ public class RegionConfig extends CacheElement implements RestfulEndpoint,
   @XmlAccessorType(XmlAccessType.FIELD)
   @JsonIgnoreProperties(value = {"uri"}, allowGetters = true)
   public static class Index extends CacheElement
-      implements RestfulEndpoint, RespondsWith<Index> {
+      implements RestfulEndpoint, RespondsWith<RuntimeInfo> {
     @XmlAttribute(name = "name", required = true)
     protected String name;
     @XmlAttribute(name = "expression")
diff --git a/geode-management/src/main/java/org/apache/geode/management/api/ClusterManagementResult.java b/geode-management/src/main/java/org/apache/geode/management/api/ClusterManagementResult.java
index 63e67b8..ab19d13 100644
--- a/geode-management/src/main/java/org/apache/geode/management/api/ClusterManagementResult.java
+++ b/geode-management/src/main/java/org/apache/geode/management/api/ClusterManagementResult.java
@@ -16,6 +16,7 @@ package org.apache.geode.management.api;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonInclude;
@@ -23,9 +24,10 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.configuration.CacheElement;
+import org.apache.geode.management.runtime.RuntimeInfo;
 
 @Experimental
-public class ClusterManagementResult<R extends CacheElement> {
+public class ClusterManagementResult<T extends CacheElement & RespondsWith<R>, R extends RuntimeInfo> {
   // this error code should include a one-to-one mapping to the http status code returned
   // by the controller
   public enum StatusCode {
@@ -58,11 +60,7 @@ public class ClusterManagementResult<R extends CacheElement> {
   // we will always have statusCode when the object is created
   private StatusCode statusCode = StatusCode.OK;
   private String statusMessage;
-
-  // Override the mapper setting so that we always show result
-  @JsonInclude
-  @JsonProperty
-  private List<R> result = new ArrayList<>();
+  private String uri;
 
   public ClusterManagementResult() {}
 
@@ -108,6 +106,14 @@ public class ClusterManagementResult<R extends CacheElement> {
     return statusMessage;
   }
 
+  public String getUri() {
+    return uri;
+  }
+
+  public void setUri(String uri) {
+    this.uri = uri;
+  }
+
   @JsonIgnore
   public boolean isSuccessful() {
     return statusCode == StatusCode.OK;
@@ -117,11 +123,26 @@ public class ClusterManagementResult<R extends CacheElement> {
     return statusCode;
   }
 
-  public List<R> getResult() {
+  // Override the mapper setting so that we always show result
+  @JsonInclude
+  @JsonProperty
+  private List<Response<T, R>> result = new ArrayList<>();
+
+  public List<Response<T, R>> getResult() {
     return result;
   }
 
-  public void setResult(List<R> result) {
+  @JsonIgnore
+  public List<T> getConfigResult() {
+    return result.stream().map(Response::getConfig).collect(Collectors.toList());
+  }
+
+  @JsonIgnore
+  public List<R> getRuntimeResult() {
+    return result.stream().flatMap(r -> r.getRuntimeInfo().stream()).collect(Collectors.toList());
+  }
+
+  public void setResult(List<Response<T, R>> result) {
     this.result = result;
   }
 }
diff --git a/geode-management/src/main/java/org/apache/geode/management/api/ClusterManagementService.java b/geode-management/src/main/java/org/apache/geode/management/api/ClusterManagementService.java
index 5286123..e4dade8 100644
--- a/geode-management/src/main/java/org/apache/geode/management/api/ClusterManagementService.java
+++ b/geode-management/src/main/java/org/apache/geode/management/api/ClusterManagementService.java
@@ -17,6 +17,7 @@ package org.apache.geode.management.api;
 
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.configuration.CacheElement;
+import org.apache.geode.management.runtime.RuntimeInfo;
 
 /**
  * this is responsible for applying and persisting cache configuration changes on locators and/or
@@ -35,8 +36,7 @@ public interface ClusterManagementService {
    *        cluster, as well as the group this config belongs to
    * @see CacheElement
    */
-  <T extends CacheElement & RespondsWith<R>, R extends CacheElement> ClusterManagementResult<T> create(
-      T config);
+  <T extends CacheElement> ClusterManagementResult<?, ?> create(T config);
 
   /**
    * This method will delete the element on all the applicable members in the cluster and update the
@@ -47,8 +47,7 @@ public interface ClusterManagementService {
    * @throws IllegalArgumentException, NoMemberException, EntityExistsException
    * @see CacheElement
    */
-  <T extends CacheElement & RespondsWith<R>, R extends CacheElement> ClusterManagementResult<T> delete(
-      T config);
+  <T extends CacheElement> ClusterManagementResult<?, ?> delete(T config);
 
   /**
    * This method will update the element on all the applicable members in the cluster and persist
@@ -59,13 +58,12 @@ public interface ClusterManagementService {
    * @throws IllegalArgumentException, NoMemberException, EntityExistsException
    * @see CacheElement
    */
-  <T extends CacheElement & RespondsWith<R>, R extends CacheElement> ClusterManagementResult<T> update(
-      T config);
+  <T extends CacheElement> ClusterManagementResult<?, ?> update(T config);
 
-  <T extends CacheElement & RespondsWith<R>, R extends CacheElement> ClusterManagementResult<R> list(
+  <T extends CacheElement & RespondsWith<R>, R extends RuntimeInfo> ClusterManagementResult<T, R> list(
       T config);
 
-  <T extends CacheElement & RespondsWith<R>, R extends CacheElement> ClusterManagementResult<R> get(
+  <T extends CacheElement & RespondsWith<R>, R extends RuntimeInfo> ClusterManagementResult<T, R> get(
       T config);
 
   /**
diff --git a/geode-management/src/main/java/org/apache/geode/management/api/RespondsWith.java b/geode-management/src/main/java/org/apache/geode/management/api/RespondsWith.java
index a7417d3..b10b279 100644
--- a/geode-management/src/main/java/org/apache/geode/management/api/RespondsWith.java
+++ b/geode-management/src/main/java/org/apache/geode/management/api/RespondsWith.java
@@ -15,18 +15,52 @@
 
 package org.apache.geode.management.api;
 
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+
+import javax.xml.bind.annotation.XmlTransient;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
 import org.apache.geode.annotations.Experimental;
-import org.apache.geode.cache.configuration.CacheElement;
+import org.apache.geode.management.runtime.RuntimeInfo;
 
 /**
  * provides additional information about a restful service request beyond the minimum required in
  * {#link RestfulEndpoint}, namely the return type to expect when `list` or other operations are
  * performed
  */
-
-// "type parameter is never used" warning is suppressed, because actually it is used to create
-// the linkage between request and response type in the signature of ClusterManagementService.list
-@SuppressWarnings("unused")
 @Experimental
-public interface RespondsWith<R extends CacheElement> {
+public interface RespondsWith<R> {
+  @XmlTransient
+  @JsonIgnore
+  default Class<R> getRuntimeClass() {
+    Type[] genericInterfaces = getClass().getGenericInterfaces();
+
+    ParameterizedType type =
+        Arrays.stream(genericInterfaces).filter(ParameterizedType.class::isInstance)
+            .map(ParameterizedType.class::cast)
+            .findFirst().orElse(null);
+
+    if (type == null) {
+      return null;
+    }
+    return (Class<R>) type.getActualTypeArguments()[0];
+  };
+
+  default boolean hasRuntimeInfo() {
+    return !RuntimeInfo.class.equals(getRuntimeClass());
+  }
+
+  @XmlTransient
+  @JsonIgnore
+  /**
+   * this is to indicate when we need to go gather runtime information for this configuration,
+   * should we go to all members in the group, or just any member in the group
+   */
+  default boolean isGlobalRuntime() {
+    return false;
+  }
+
 }
diff --git a/geode-management/src/main/java/org/apache/geode/management/api/RespondsWith.java b/geode-management/src/main/java/org/apache/geode/management/api/Response.java
similarity index 58%
copy from geode-management/src/main/java/org/apache/geode/management/api/RespondsWith.java
copy to geode-management/src/main/java/org/apache/geode/management/api/Response.java
index a7417d3..64c12ea 100644
--- a/geode-management/src/main/java/org/apache/geode/management/api/RespondsWith.java
+++ b/geode-management/src/main/java/org/apache/geode/management/api/Response.java
@@ -15,18 +15,35 @@
 
 package org.apache.geode.management.api;
 
-import org.apache.geode.annotations.Experimental;
+import java.util.ArrayList;
+import java.util.List;
+
 import org.apache.geode.cache.configuration.CacheElement;
+import org.apache.geode.management.runtime.RuntimeInfo;
 
-/**
- * provides additional information about a restful service request beyond the minimum required in
- * {#link RestfulEndpoint}, namely the return type to expect when `list` or other operations are
- * performed
- */
+public class Response<T extends CacheElement & RespondsWith<R>, R extends RuntimeInfo> {
+  private T config;
+  private List<R> runtimeInfo = new ArrayList<>();
+
+  public Response() {}
+
+  public Response(T config) {
+    this.config = config;
+  }
+
+  public T getConfig() {
+    return config;
+  }
+
+  public void setConfig(T config) {
+    this.config = config;
+  }
+
+  public List<R> getRuntimeInfo() {
+    return runtimeInfo;
+  }
 
-// "type parameter is never used" warning is suppressed, because actually it is used to create
-// the linkage between request and response type in the signature of ClusterManagementService.list
-@SuppressWarnings("unused")
-@Experimental
-public interface RespondsWith<R extends CacheElement> {
+  public void setRuntimeInfo(List<R> runtimeInfo) {
+    this.runtimeInfo = runtimeInfo;
+  }
 }
diff --git a/geode-management/src/main/java/org/apache/geode/management/api/RestfulEndpoint.java b/geode-management/src/main/java/org/apache/geode/management/api/RestfulEndpoint.java
index 7365806..956dbd2 100644
--- a/geode-management/src/main/java/org/apache/geode/management/api/RestfulEndpoint.java
+++ b/geode-management/src/main/java/org/apache/geode/management/api/RestfulEndpoint.java
@@ -31,7 +31,7 @@ import org.apache.geode.lang.Identifiable;
  */
 @Experimental
 public interface RestfulEndpoint extends Identifiable<String> {
-  String URI_CONTEXT = "/geode-management";
+  String URI_CONTEXT = "/management";
   String URI_VERSION = "/v2";
 
   /**
@@ -69,6 +69,9 @@ public interface RestfulEndpoint extends Identifiable<String> {
 
   @XmlTransient
   default String getUri() {
+    if (getIdentityEndPoint() == null) {
+      return null;
+    }
     return URI_CONTEXT + URI_VERSION + getIdentityEndPoint();
   }
 }
diff --git a/geode-management/src/main/java/org/apache/geode/management/configuration/MemberConfig.java b/geode-management/src/main/java/org/apache/geode/management/configuration/MemberConfig.java
index 8647a8b..28019a3 100644
--- a/geode-management/src/main/java/org/apache/geode/management/configuration/MemberConfig.java
+++ b/geode-management/src/main/java/org/apache/geode/management/configuration/MemberConfig.java
@@ -21,11 +21,12 @@ import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.configuration.CacheElement;
 import org.apache.geode.management.api.RespondsWith;
 import org.apache.geode.management.api.RestfulEndpoint;
+import org.apache.geode.management.runtime.MemberInformation;
 
 @Experimental
 @JsonIgnoreProperties(value = {"uri"}, allowGetters = true)
 public class MemberConfig extends CacheElement implements RestfulEndpoint,
-    RespondsWith<RuntimeMemberConfig> {
+    RespondsWith<MemberInformation> {
 
   public static final String MEMBER_CONFIG_ENDPOINT = "/members";
 
diff --git a/geode-management/src/main/java/org/apache/geode/management/configuration/RuntimeMemberConfig.java b/geode-management/src/main/java/org/apache/geode/management/configuration/RuntimeMemberConfig.java
deleted file mode 100644
index 2806065..0000000
--- a/geode-management/src/main/java/org/apache/geode/management/configuration/RuntimeMemberConfig.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
- * agreements. See the NOTICE file distributed with this work for additional information regarding
- * copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance with the License. You may obtain a
- * copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the License
- * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
- * or implied. See the License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package org.apache.geode.management.configuration;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-
-import org.apache.geode.annotations.Experimental;
-
-@Experimental
-public class RuntimeMemberConfig extends MemberConfig {
-  private boolean isLocator;
-  private boolean isCoordinator;
-  private String host;
-  private String status;
-  private int pid;
-  // Only relevant for locators - will be suppressed if null
-  private Integer port;
-  // Only relevant for servers - will be suppressed if empty
-  private List<CacheServerConfig> cacheServers = new ArrayList<>();
-  private long maxHeap;
-  private long initialHeap;
-  private long usedHeap;
-  private String logFile;
-  private String workingDirectory;
-  private int clientConnections;
-
-  public static class CacheServerConfig {
-    private int port;
-    private int maxConnections;
-    private int maxThreads;
-
-    public CacheServerConfig() {}
-
-    public int getPort() {
-      return port;
-    }
-
-    public void setPort(int port) {
-      this.port = port;
-    }
-
-    public int getMaxConnections() {
-      return maxConnections;
-    }
-
-    public void setMaxConnections(int maxConnections) {
-      this.maxConnections = maxConnections;
-    }
-
-    public int getMaxThreads() {
-      return maxThreads;
-    }
-
-    public void setMaxThreads(int maxThreads) {
-      this.maxThreads = maxThreads;
-    }
-  }
-
-  public boolean isLocator() {
-    return isLocator;
-  }
-
-  public void setLocator(boolean locator) {
-    isLocator = locator;
-  }
-
-  public boolean isCoordinator() {
-    return isCoordinator;
-  }
-
-  public void setCoordinator(boolean coordinator) {
-    isCoordinator = coordinator;
-  }
-
-  public String getHost() {
-    return host;
-  }
-
-  public void setHost(String host) {
-    this.host = host;
-  }
-
-  public String getStatus() {
-    return status;
-  }
-
-  public void setStatus(String status) {
-    this.status = status;
-  }
-
-  public int getPid() {
-    return pid;
-  }
-
-  public void setPid(int pid) {
-    this.pid = pid;
-  }
-
-  @JsonInclude(value = JsonInclude.Include.NON_NULL)
-  public Integer getPort() {
-    return port;
-  }
-
-  public void setPort(Integer port) {
-    this.port = port;
-  }
-
-  @JsonInclude(value = JsonInclude.Include.NON_EMPTY)
-  public List<CacheServerConfig> getCacheServers() {
-    return cacheServers;
-  }
-
-  public void addCacheServer(CacheServerConfig cacheServer) {
-    cacheServers.add(cacheServer);
-  }
-
-  public void setGroups(List<String> groups) {
-    this.groups = groups;
-  }
-
-  public long getMaxHeap() {
-    return maxHeap;
-  }
-
-  public void setMaxHeap(long maxHeap) {
-    this.maxHeap = maxHeap;
-  }
-
-  public long getInitialHeap() {
-    return initialHeap;
-  }
-
-  public void setInitialHeap(long initialHeap) {
-    this.initialHeap = initialHeap;
-  }
-
-  public long getUsedHeap() {
-    return usedHeap;
-  }
-
-  public void setUsedHeap(long usedHeap) {
-    this.usedHeap = usedHeap;
-  }
-
-  public String getLogFile() {
-    return logFile;
-  }
-
-  public void setLogFile(String logFile) {
-    this.logFile = logFile;
-  }
-
-  public String getWorkingDirectory() {
-    return workingDirectory;
-  }
-
-  public void setWorkingDirectory(String workingDirectory) {
-    this.workingDirectory = workingDirectory;
-  }
-
-  public int getClientConnections() {
-    return clientConnections;
-  }
-
-  public void setClientConnections(int clientConnections) {
-    this.clientConnections = clientConnections;
-  }
-}
diff --git a/geode-management/src/main/java/org/apache/geode/management/internal/ClientClusterManagementService.java b/geode-management/src/main/java/org/apache/geode/management/internal/ClientClusterManagementService.java
index 051d106..713f7c3 100644
--- a/geode-management/src/main/java/org/apache/geode/management/internal/ClientClusterManagementService.java
+++ b/geode-management/src/main/java/org/apache/geode/management/internal/ClientClusterManagementService.java
@@ -25,6 +25,7 @@ import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.api.ClusterManagementService;
 import org.apache.geode.management.api.RespondsWith;
 import org.apache.geode.management.api.RestfulEndpoint;
+import org.apache.geode.management.runtime.RuntimeInfo;
 
 /**
  * Implementation of {@link ClusterManagementService} interface which represents the cluster
@@ -54,8 +55,7 @@ public class ClientClusterManagementService implements ClusterManagementService
 
   @Override
   @SuppressWarnings("unchecked")
-  public <T extends CacheElement & RespondsWith<R>, R extends CacheElement> ClusterManagementResult<T> create(
-      T config) {
+  public <T extends CacheElement> ClusterManagementResult<?, ?> create(T config) {
     String endPoint = getEndpoint(config);
     // the response status code info is represented by the ClusterManagementResult.errorCode already
     return restTemplate
@@ -65,7 +65,7 @@ public class ClientClusterManagementService implements ClusterManagementService
 
   @Override
   @SuppressWarnings("unchecked")
-  public <T extends CacheElement & RespondsWith<R>, R extends CacheElement> ClusterManagementResult<T> delete(
+  public <T extends CacheElement> ClusterManagementResult<?, ?> delete(
       T config) {
     String uri = getIdentityEndPoint(config);
     return restTemplate
@@ -78,14 +78,14 @@ public class ClientClusterManagementService implements ClusterManagementService
   }
 
   @Override
-  public <T extends CacheElement & RespondsWith<R>, R extends CacheElement> ClusterManagementResult<T> update(
+  public <T extends CacheElement> ClusterManagementResult<?, ?> update(
       T config) {
     throw new NotImplementedException("Not Implemented");
   }
 
   @Override
   @SuppressWarnings("unchecked")
-  public <T extends CacheElement & RespondsWith<R>, R extends CacheElement> ClusterManagementResult<R> list(
+  public <T extends CacheElement & RespondsWith<R>, R extends RuntimeInfo> ClusterManagementResult<T, R> list(
       T config) {
     String endPoint = getEndpoint(config);
     return restTemplate
@@ -96,7 +96,7 @@ public class ClientClusterManagementService implements ClusterManagementService
 
   @Override
   @SuppressWarnings("unchecked")
-  public <T extends CacheElement & RespondsWith<R>, R extends CacheElement> ClusterManagementResult<R> get(
+  public <T extends CacheElement & RespondsWith<R>, R extends RuntimeInfo> ClusterManagementResult<T, R> get(
       T config) {
     return restTemplate
         .getForEntity(getIdentityEndPoint(config), ClusterManagementResult.class)
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/domain/CacheServerInfo.java b/geode-management/src/main/java/org/apache/geode/management/runtime/CacheServerInfo.java
similarity index 78%
rename from geode-core/src/main/java/org/apache/geode/management/internal/cli/domain/CacheServerInfo.java
rename to geode-management/src/main/java/org/apache/geode/management/runtime/CacheServerInfo.java
index 9088811..e30ea72 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/domain/CacheServerInfo.java
+++ b/geode-management/src/main/java/org/apache/geode/management/runtime/CacheServerInfo.java
@@ -12,12 +12,10 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package org.apache.geode.management.internal.cli.domain;
+package org.apache.geode.management.runtime;
 
 import java.io.Serializable;
 
-import org.apache.geode.cache.server.CacheServer;
-
 public class CacheServerInfo implements Serializable {
 
   private static final long serialVersionUID = 1L;
@@ -28,14 +26,6 @@ public class CacheServerInfo implements Serializable {
   private int maxConnections;
   private int maxThreads;
 
-  public CacheServerInfo(CacheServer cacheServer) {
-    bindAddress = cacheServer.getBindAddress();
-    port = cacheServer.getPort();
-    isRunning = cacheServer.isRunning();
-    maxConnections = cacheServer.getMaxConnections();
-    maxThreads = cacheServer.getMaxThreads();
-  }
-
   public String getBindAddress() {
     return bindAddress;
   }
@@ -56,6 +46,26 @@ public class CacheServerInfo implements Serializable {
     return isRunning;
   }
 
+  public void setBindAddress(String bindAddress) {
+    this.bindAddress = bindAddress;
+  }
+
+  public void setPort(int port) {
+    this.port = port;
+  }
+
+  public void setRunning(boolean running) {
+    isRunning = running;
+  }
+
+  public void setMaxConnections(int maxConnections) {
+    this.maxConnections = maxConnections;
+  }
+
+  public void setMaxThreads(int maxThreads) {
+    this.maxThreads = maxThreads;
+  }
+
   public String toString() {
     StringBuilder sb = new StringBuilder();
     sb.append("Bind Address :");
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/domain/MemberInformation.java b/geode-management/src/main/java/org/apache/geode/management/runtime/MemberInformation.java
similarity index 91%
rename from geode-core/src/main/java/org/apache/geode/management/internal/cli/domain/MemberInformation.java
rename to geode-management/src/main/java/org/apache/geode/management/runtime/MemberInformation.java
index 7b35008..1e343dc 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/domain/MemberInformation.java
+++ b/geode-management/src/main/java/org/apache/geode/management/runtime/MemberInformation.java
@@ -12,20 +12,23 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package org.apache.geode.management.internal.cli.domain;
+package org.apache.geode.management.runtime;
 
-import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+
+import org.apache.geode.lang.Identifiable;
 
 
 /***
  * Data class to hold the information of the member Used in describe member command
  *
  */
-public class MemberInformation implements Serializable {
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "class")
+public class MemberInformation implements Identifiable<String>, RuntimeInfo {
   private static final long serialVersionUID = 1L;
   private String name;
   private String id;
@@ -53,6 +56,7 @@ public class MemberInformation implements Serializable {
   private String offHeapMemorySize;
   private boolean webSSL;
   private boolean isSecured;
+  private boolean isCoordinator;
 
   public boolean isSecured() {
     return isSecured;
@@ -222,7 +226,7 @@ public class MemberInformation implements Serializable {
     this.isServer = isServer;
   }
 
-  public List<CacheServerInfo> getCacheServeInfo() {
+  public List<CacheServerInfo> getCacheServerInfo() {
     return cacheServerList;
   }
 
@@ -263,4 +267,12 @@ public class MemberInformation implements Serializable {
   public void setWebSSL(boolean webSSL) {
     this.webSSL = webSSL;
   }
+
+  public boolean isCoordinator() {
+    return isCoordinator;
+  }
+
+  public void setCoordinator(boolean coordinator) {
+    isCoordinator = coordinator;
+  }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/CacheElementOperation.java b/geode-management/src/main/java/org/apache/geode/management/runtime/RuntimeInfo.java
similarity index 76%
copy from geode-core/src/main/java/org/apache/geode/management/internal/CacheElementOperation.java
copy to geode-management/src/main/java/org/apache/geode/management/runtime/RuntimeInfo.java
index e9b07ff..3142aaf 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/CacheElementOperation.java
+++ b/geode-management/src/main/java/org/apache/geode/management/runtime/RuntimeInfo.java
@@ -13,8 +13,12 @@
  * the License.
  */
 
-package org.apache.geode.management.internal;
+package org.apache.geode.management.runtime;
 
-public enum CacheElementOperation {
-  CREATE, DELETE, UPDATE, LIST
+import java.io.Serializable;
+
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "class")
+public interface RuntimeInfo extends Serializable {
 }
diff --git a/geode-management/src/main/java/org/apache/geode/management/configuration/RuntimeRegionConfig.java b/geode-management/src/main/java/org/apache/geode/management/runtime/RuntimeRegionInfo.java
similarity index 57%
rename from geode-management/src/main/java/org/apache/geode/management/configuration/RuntimeRegionConfig.java
rename to geode-management/src/main/java/org/apache/geode/management/runtime/RuntimeRegionInfo.java
index a76bfc0..463e6fe 100644
--- a/geode-management/src/main/java/org/apache/geode/management/configuration/RuntimeRegionConfig.java
+++ b/geode-management/src/main/java/org/apache/geode/management/runtime/RuntimeRegionInfo.java
@@ -13,28 +13,18 @@
  * the License.
  */
 
-package org.apache.geode.management.configuration;
+package org.apache.geode.management.runtime;
 
 
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import org.apache.commons.lang3.StringUtils;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
 
 import org.apache.geode.annotations.Experimental;
-import org.apache.geode.cache.configuration.RegionConfig;
 
 @Experimental
-public class RuntimeRegionConfig extends RegionConfig {
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "class")
+public class RuntimeRegionInfo implements RuntimeInfo {
   private long entryCount;
 
-  public RuntimeRegionConfig() {}
-
-  public RuntimeRegionConfig(RegionConfig config) {
-    super(config);
-  }
-
   public long getEntryCount() {
     return entryCount;
   }
@@ -42,15 +32,4 @@ public class RuntimeRegionConfig extends RegionConfig {
   public void setEntryCount(long entrySize) {
     this.entryCount = entrySize;
   }
-
-  public List<Index> getIndexes(String indexId) {
-    Stream<Index> stream = getIndexes().stream();
-    if (StringUtils.isNotBlank(indexId)) {
-      stream = stream.filter(i -> i.getId().equals(indexId));
-    }
-    return stream.map(index -> {
-      index.setRegionName(getName());
-      return index;
-    }).collect(Collectors.toList());
-  }
 }
diff --git a/geode-management/src/test/java/org/apache/geode/cache/configuration/CacheElementJsonMappingTest.java b/geode-management/src/test/java/org/apache/geode/cache/configuration/CacheElementJsonMappingTest.java
index 0f1b2fd..1ed0fad 100644
--- a/geode-management/src/test/java/org/apache/geode/cache/configuration/CacheElementJsonMappingTest.java
+++ b/geode-management/src/test/java/org/apache/geode/cache/configuration/CacheElementJsonMappingTest.java
@@ -17,33 +17,34 @@ package org.apache.geode.cache.configuration;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import org.apache.geode.management.api.ClusterManagementResult;
-import org.apache.geode.management.configuration.MemberConfig;
-import org.apache.geode.management.configuration.RuntimeMemberConfig;
-import org.apache.geode.management.configuration.RuntimeRegionConfig;
+import org.apache.geode.management.runtime.MemberInformation;
+import org.apache.geode.management.runtime.RuntimeRegionInfo;
 import org.apache.geode.util.internal.GeodeJsonMapper;
 
 public class CacheElementJsonMappingTest {
   private static ObjectMapper mapper = GeodeJsonMapper.getMapper();
 
-  private static RuntimeMemberConfig member;
-  private static RuntimeRegionConfig region;
+  private static MemberInformation member;
+  private static RegionConfig region;
+  private static RuntimeRegionInfo runtimeRegionInfo;
 
   @BeforeClass
   public static void beforeClass() {
-    member = new RuntimeMemberConfig();
+    member = new MemberInformation();
     member.setId("server");
-    member.setPid(123);
+    member.setProcessId(123);
 
-    region = new RuntimeRegionConfig();
+    region = new RegionConfig();
     region.setName("test");
+
+    runtimeRegionInfo = new RuntimeRegionInfo();
+    runtimeRegionInfo.setEntryCount(100);
   }
 
   @Test
@@ -74,31 +75,11 @@ public class CacheElementJsonMappingTest {
     System.out.println(json);
     assertThat(json).contains("class").contains("\"id\":\"server\"");
 
-    MemberConfig config = mapper.readValue(json, MemberConfig.class);
+    MemberInformation config = mapper.readValue(json, MemberInformation.class);
     assertThat(config.getId()).isEqualTo(member.getId());
   }
 
   @Test
-  public void serializeResult() throws Exception {
-    ClusterManagementResult<CacheElement> result = new ClusterManagementResult<>();
-    List<CacheElement> elements = new ArrayList<>();
-    elements.add(region);
-    elements.add(member);
-    result.setResult(elements);
-
-    String json = mapper.writeValueAsString(result);
-    System.out.println(json);
-
-    ClusterManagementResult<?> result1 =
-        mapper.readValue(json, ClusterManagementResult.class);
-    assertThat(result1.getResult()).hasSize(2);
-    assertThat(result1.getResult().get(0))
-        .isInstanceOf(RegionConfig.class);
-    assertThat(result1.getResult().get(1))
-        .isInstanceOf(MemberConfig.class);
-  }
-
-  @Test
   public void deserializeWithoutTypeInfo() throws Exception {
     String json = "{'name':'test'}";
     RegionConfig config = mapper.readValue(json, RegionConfig.class);
@@ -124,7 +105,7 @@ public class CacheElementJsonMappingTest {
   @Test
   public void groups() throws Exception {
     String json = "{'name':'test','groups':['group1','group2']}";
-    RuntimeRegionConfig regionConfig = mapper.readValue(json, RuntimeRegionConfig.class);
+    RegionConfig regionConfig = mapper.readValue(json, RegionConfig.class);
     assertThat(regionConfig.getGroups()).containsExactlyInAnyOrder("group1", "group2");
   }
 
@@ -141,7 +122,7 @@ public class CacheElementJsonMappingTest {
 
   @Test
   public void serializeMultipleGroup() throws Exception {
-    RuntimeRegionConfig config = new RuntimeRegionConfig();
+    RegionConfig config = new RegionConfig();
     config.setName("test");
     config.getGroups().add("group1");
     config.getGroups().add("group2");
@@ -162,15 +143,14 @@ public class CacheElementJsonMappingTest {
     index.setRegionName("region1");
     index.setExpression("id");
     config.getIndexes().add(index);
-    RuntimeRegionConfig runtimeConfig = new RuntimeRegionConfig(config);
-    String json = mapper.writeValueAsString(runtimeConfig);
+    String json = mapper.writeValueAsString(config);
     System.out.println(json);
 
-    runtimeConfig = mapper.readValue(json, RuntimeRegionConfig.class);
-    assertThat(runtimeConfig.getGroups()).containsExactly("group1");
-    List<RegionConfig.Index> runtimeIndexes = runtimeConfig.getIndexes(null);
-    assertThat(runtimeIndexes).hasSize(1);
-    assertThat(runtimeIndexes.get(0).getRegionName()).isEqualTo("region1");
+    RegionConfig config1 = mapper.readValue(json, RegionConfig.class);
+    assertThat(config1.getGroups()).containsExactly("group1");
+    List<RegionConfig.Index> indexes = config1.getIndexes();
+    assertThat(indexes).hasSize(1);
+    assertThat(indexes.get(0).getRegionName()).isEqualTo("region1");
   }
 
   @Test
diff --git a/geode-management/src/test/java/org/apache/geode/cache/configuration/CacheElementTest.java b/geode-management/src/test/java/org/apache/geode/cache/configuration/CacheElementTest.java
index 6df10c6..73b0b55 100644
--- a/geode-management/src/test/java/org/apache/geode/cache/configuration/CacheElementTest.java
+++ b/geode-management/src/test/java/org/apache/geode/cache/configuration/CacheElementTest.java
@@ -22,13 +22,12 @@ import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import org.apache.geode.management.configuration.RuntimeRegionConfig;
 import org.apache.geode.util.internal.GeodeJsonMapper;
 
 public class CacheElementTest {
 
   private CacheElement element;
-  private RuntimeRegionConfig runtime;
+  private RegionConfig runtime;
 
   private static ObjectMapper mapper;
   private String json;
@@ -41,7 +40,7 @@ public class CacheElementTest {
   @Before
   public void before() throws Exception {
     element = new RegionConfig();
-    runtime = new RuntimeRegionConfig();
+    runtime = new RegionConfig();
   }
 
   @Test
@@ -83,15 +82,6 @@ public class CacheElementTest {
   }
 
   @Test
-  public void copy() throws Exception {
-    RegionConfig config = new RegionConfig();
-    config.setName("test");
-    runtime = new RuntimeRegionConfig(config);
-    assertThat(runtime.getGroup()).isNull();
-    assertThat(runtime.getGroups()).hasSize(0);
-  }
-
-  @Test
   public void setGroup() throws Exception {
     element.setGroup("group1");
     assertThat(element.getGroup()).isEqualTo("group1");
diff --git a/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/ClientClusterManagementServiceDUnitTest.java b/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/ClientClusterManagementServiceDUnitTest.java
index d7262d2..f6ba47f 100644
--- a/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/ClientClusterManagementServiceDUnitTest.java
+++ b/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/ClientClusterManagementServiceDUnitTest.java
@@ -38,9 +38,9 @@ import org.apache.geode.cache.configuration.RegionType;
 import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.api.ClusterManagementService;
 import org.apache.geode.management.api.RealizationResult;
-import org.apache.geode.management.configuration.RuntimeRegionConfig;
 import org.apache.geode.management.internal.rest.LocatorWebContext;
 import org.apache.geode.management.internal.rest.PlainLocatorContextLoader;
+import org.apache.geode.management.runtime.RuntimeRegionInfo;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 
 @RunWith(SpringRunner.class)
@@ -72,16 +72,16 @@ public class ClientClusterManagementServiceDUnitTest {
 
   @After
   public void deleteAllRegions() {
-    List<RuntimeRegionConfig> regions = client.list(new RegionConfig())
-        .getResult();
+    List<RegionConfig> regions = client.list(new RegionConfig())
+        .getConfigResult();
 
     regions.forEach(r -> {
       r.setGroup(null);
       client.delete(r);
     });
 
-    List<RuntimeRegionConfig> moreRegions = client.list(new RegionConfig())
-        .getResult();
+    List<RegionConfig> moreRegions = client.list(new RegionConfig())
+        .getConfigResult();
     assertThat(moreRegions).isEmpty();
   }
 
@@ -92,14 +92,15 @@ public class ClientClusterManagementServiceDUnitTest {
     region.setName("customer");
     region.setType(RegionType.REPLICATE);
 
-    ClusterManagementResult<RegionConfig> createResult = client.create(region);
+    ClusterManagementResult<?, ?> createResult = client.create(region);
     assertManagementResult(createResult).hasStatusCode(ClusterManagementResult.StatusCode.OK);
 
-    ClusterManagementResult<RegionConfig> deleteResult = client.delete(region);
+    ClusterManagementResult<?, ?> deleteResult = client.delete(region);
     assertManagementResult(deleteResult)
         .hasStatusCode(ClusterManagementResult.StatusCode.OK);
 
-    ClusterManagementResult<RuntimeRegionConfig> listResult = client.list(new RegionConfig());
+    ClusterManagementResult<RegionConfig, RuntimeRegionInfo> listResult =
+        client.list(new RegionConfig());
     assertManagementResult(listResult)
         .hasStatusCode(ClusterManagementResult.StatusCode.OK)
         .hasListResult()
@@ -114,15 +115,16 @@ public class ClientClusterManagementServiceDUnitTest {
     region.setGroup("group1");
     region.setType(RegionType.REPLICATE);
 
-    ClusterManagementResult<RegionConfig> createResult = client.create(region);
+    ClusterManagementResult<?, ?> createResult = client.create(region);
     assertManagementResult(createResult).hasStatusCode(ClusterManagementResult.StatusCode.OK);
 
     region.setGroup(null);
-    ClusterManagementResult<RegionConfig> deleteResult = client.delete(region);
+    ClusterManagementResult<?, ?> deleteResult = client.delete(region);
     assertManagementResult(deleteResult)
         .hasStatusCode(ClusterManagementResult.StatusCode.OK);
 
-    ClusterManagementResult<RuntimeRegionConfig> listResult = client.list(new RegionConfig());
+    ClusterManagementResult<RegionConfig, RuntimeRegionInfo> listResult =
+        client.list(new RegionConfig());
     assertManagementResult(listResult)
         .hasStatusCode(ClusterManagementResult.StatusCode.OK)
         .hasListResult()
@@ -137,7 +139,7 @@ public class ClientClusterManagementServiceDUnitTest {
     region.setGroup("group1");
     region.setType(RegionType.REPLICATE);
 
-    ClusterManagementResult<RegionConfig> result = client.create(region);
+    ClusterManagementResult<?, ?> result = client.create(region);
     assertManagementResult(result).isSuccessful().hasMemberStatus()
         .extracting(RealizationResult::getMemberName)
         .containsExactlyInAnyOrder("server-1",
@@ -158,7 +160,7 @@ public class ClientClusterManagementServiceDUnitTest {
     region.setGroup("group1");
     region.setType(RegionType.REPLICATE);
 
-    ClusterManagementResult<RegionConfig> result = client.create(region);
+    ClusterManagementResult<?, ?> result = client.create(region);
     assertManagementResult(result).isSuccessful().hasMemberStatus()
         .extracting(RealizationResult::getMemberName)
         .containsExactlyInAnyOrder("server-1",
@@ -170,12 +172,12 @@ public class ClientClusterManagementServiceDUnitTest {
         ClusterManagementResult.StatusCode.ENTITY_EXISTS);
 
     region.setGroup(null);
-    ClusterManagementResult<RegionConfig> deleteResult = client.delete(region);
+    ClusterManagementResult<?, ?> deleteResult = client.delete(region);
 
     assertManagementResult(deleteResult).isSuccessful();
 
-    List<RuntimeRegionConfig> listResult = client.list(new RegionConfig())
-        .getResult();
+    List<RuntimeRegionInfo> listResult = client.list(new RegionConfig())
+        .getRuntimeResult();
 
     assertThat(listResult).hasSize(0);
   }
@@ -189,7 +191,7 @@ public class ClientClusterManagementServiceDUnitTest {
     region.setGroup("group1");
     region.setType(RegionType.REPLICATE);
 
-    ClusterManagementResult<RegionConfig> result = client.create(region);
+    ClusterManagementResult<?, ?> result = client.create(region);
     assertManagementResult(result).isSuccessful().hasMemberStatus()
         .extracting(RealizationResult::getMemberName)
         .containsExactlyInAnyOrder("server-1",
@@ -206,7 +208,7 @@ public class ClientClusterManagementServiceDUnitTest {
     RegionConfig region = new RegionConfig();
     region.setName("unknown");
 
-    ClusterManagementResult<RegionConfig> result = client.delete(region);
+    ClusterManagementResult<?, ?> result = client.delete(region);
     assertManagementResult(result).failed()
         .hasStatusCode(ClusterManagementResult.StatusCode.ENTITY_NOT_FOUND);
   }
@@ -219,7 +221,7 @@ public class ClientClusterManagementServiceDUnitTest {
     region.setGroup("group1");
     region.setType(RegionType.REPLICATE);
 
-    ClusterManagementResult<RegionConfig> result = client.create(region);
+    ClusterManagementResult<?, ?> result = client.create(region);
     assertManagementResult(result).isSuccessful().hasMemberStatus()
         .extracting(RealizationResult::getMemberName)
         .containsExactlyInAnyOrder("server-1",
@@ -239,11 +241,12 @@ public class ClientClusterManagementServiceDUnitTest {
     assertManagementResult(result)
         .hasStatusCode(ClusterManagementResult.StatusCode.OK);
 
-    ClusterManagementResult<RuntimeRegionConfig> listResult = client.list(new RegionConfig());
+    ClusterManagementResult<RegionConfig, RuntimeRegionInfo> listResult =
+        client.list(new RegionConfig());
     assertManagementResult(listResult)
         .hasStatusCode(ClusterManagementResult.StatusCode.OK)
         .hasListResult()
-        .extracting(RegionConfig::getId)
+        .extracting(r -> r.getConfig().getId())
         .containsExactly("region1");
   }
 
diff --git a/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/ConfigurePDXDUnitTest.java b/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/ConfigurePDXDUnitTest.java
index c81b1cd..3b591d4 100644
--- a/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/ConfigurePDXDUnitTest.java
+++ b/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/ConfigurePDXDUnitTest.java
@@ -18,8 +18,6 @@ package org.apache.geode.management.client;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import java.util.List;
-
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
@@ -79,7 +77,7 @@ public class ConfigurePDXDUnitTest {
   @Test
   public void configurePdx() {
     PdxType pdxType = new PdxType();
-    ClusterManagementResult<PdxType> result = client.create(pdxType);
+    ClusterManagementResult<?, ?> result = client.create(pdxType);
 
     // needed to pass StressNewTest since we haven't yet implemented delete(PdxType)
     if (result.getStatusCode() == ClusterManagementResult.StatusCode.ENTITY_EXISTS)
@@ -87,12 +85,7 @@ public class ConfigurePDXDUnitTest {
 
     assertThat(result.isSuccessful()).isTrue();
     assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.OK);
-
-    List<PdxType> list = result.getResult();
-    assertThat(list.size()).isEqualTo(1);
-    PdxType pdxResult = list.get(0);
-    assertThat(pdxResult.getGroup()).isNull();
-    assertThat(pdxResult.getUri()).isEqualTo("/geode-management/v2/configurations/pdx");
+    assertThat(result.getUri()).isEqualTo("/management/v2/configurations/pdx");
 
     RealizationResult status = result.getMemberStatuses().get(0);
     assertThat(status.getMemberName()).isEqualTo("server-1");
diff --git a/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/MemberManagementServiceDUnitTest.java b/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/MemberManagementServiceDUnitTest.java
index ad2cc34..40e3e4e 100644
--- a/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/MemberManagementServiceDUnitTest.java
+++ b/geode-web-management/src/distributedTest/java/org/apache/geode/management/client/MemberManagementServiceDUnitTest.java
@@ -39,9 +39,9 @@ import org.springframework.web.context.WebApplicationContext;
 import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.api.ClusterManagementService;
 import org.apache.geode.management.configuration.MemberConfig;
-import org.apache.geode.management.configuration.RuntimeMemberConfig;
 import org.apache.geode.management.internal.rest.LocatorLauncherContextLoader;
 import org.apache.geode.management.internal.rest.LocatorWebContext;
+import org.apache.geode.management.runtime.MemberInformation;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 
 @RunWith(SpringRunner.class)
@@ -72,28 +72,31 @@ public class MemberManagementServiceDUnitTest {
   @WithMockUser
   public void listAllMembers() {
     MemberConfig memberConfig = new MemberConfig();
-    ClusterManagementResult<RuntimeMemberConfig> result = client.list(memberConfig);
+    ClusterManagementResult<MemberConfig, MemberInformation> result = client.list(memberConfig);
 
     assertThat(result.isSuccessful()).isTrue();
     assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.OK);
 
-    List<RuntimeMemberConfig> members = result.getResult();
+    List<MemberInformation> members = result.getRuntimeResult();
     assertThat(members.size()).isEqualTo(2);
-    assertThat(members.stream().map(MemberConfig::getId).collect(Collectors.toList()))
+    assertThat(members.stream().map(MemberInformation::getName).collect(Collectors.toList()))
         .containsExactlyInAnyOrder("locator-0", "server-1");
-    for (RuntimeMemberConfig oneMember : members) {
-      if (oneMember.isLocator()) {
-        assertThat(oneMember.getPort())
+    for (MemberInformation oneMember : members) {
+      if (!oneMember.isServer()) {
+        assertThat(oneMember.isCoordinator()).isTrue();
+        assertThat(oneMember.getLocatorPort())
             .as("port for locator member should not be null").isNotNull().isGreaterThan(0);
-        assertThat(oneMember.getCacheServers().size())
+        assertThat(oneMember.getCacheServerInfo().size())
             .as("locators should not have cache servers").isEqualTo(0);
       } else {
-        assertThat(oneMember.getPort()).as("port for server member should be null").isNull();
-        assertThat(oneMember.getCacheServers().size())
+        assertThat(oneMember.isCoordinator()).isFalse();
+        assertThat(oneMember.getLocatorPort()).as("port for server member should be 0")
+            .isEqualTo(0);
+        assertThat(oneMember.getCacheServerInfo().size())
             .as("server should have one cache server").isEqualTo(1);
-        assertThat(oneMember.getCacheServers().get(0).getPort()).isGreaterThan(0);
-        assertThat(oneMember.getCacheServers().get(0).getMaxConnections()).isGreaterThan(0);
-        assertThat(oneMember.getCacheServers().get(0).getMaxThreads()).isEqualTo(0);
+        assertThat(oneMember.getCacheServerInfo().get(0).getPort()).isGreaterThan(0);
+        assertThat(oneMember.getCacheServerInfo().get(0).getMaxConnections()).isGreaterThan(0);
+        assertThat(oneMember.getCacheServerInfo().get(0).getMaxThreads()).isEqualTo(0);
       }
     }
   }
@@ -103,12 +106,12 @@ public class MemberManagementServiceDUnitTest {
   public void getOneMember() {
     MemberConfig config = new MemberConfig();
     config.setId("server-1");
-    ClusterManagementResult<RuntimeMemberConfig> result = client.list(config);
+    ClusterManagementResult<MemberConfig, MemberInformation> result = client.list(config);
 
     assertThat(result.isSuccessful()).isTrue();
     assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.OK);
 
-    List<RuntimeMemberConfig> memberConfig = result.getResult();
+    List<MemberInformation> memberConfig = result.getRuntimeResult();
     assertThat(memberConfig.size()).isEqualTo(1);
   }
 
@@ -117,16 +120,16 @@ public class MemberManagementServiceDUnitTest {
   public void getMemberStatus() {
     MemberConfig config = new MemberConfig();
     config.setId("locator-0");
-    ClusterManagementResult<RuntimeMemberConfig> result = client.list(config);
+    ClusterManagementResult<MemberConfig, MemberInformation> result = client.list(config);
     assertThat(result.isSuccessful()).isTrue();
     assertThat(result.getStatusCode()).isEqualTo(ClusterManagementResult.StatusCode.OK);
 
-    List<RuntimeMemberConfig> members = result.getResult();
+    List<MemberInformation> members = result.getRuntimeResult();
     assertThat(members.size()).isEqualTo(1);
 
-    RuntimeMemberConfig memberConfig = members.get(0);
-    assertThat(memberConfig.getInitialHeap()).isGreaterThan(0);
-    assertThat(memberConfig.getMaxHeap()).isGreaterThan(0);
+    MemberInformation memberConfig = members.get(0);
+    assertThat(memberConfig.getInitHeapSize()).isGreaterThan(0);
+    assertThat(memberConfig.getMaxHeapSize()).isGreaterThan(0);
     assertThat(memberConfig.getStatus()).isEqualTo("online");
   }
 
@@ -136,11 +139,12 @@ public class MemberManagementServiceDUnitTest {
     MemberConfig config = new MemberConfig();
     // look for a member with a non-existent id
     config.setId("server");
-    ClusterManagementResult<RuntimeMemberConfig> result = client.list(config);
+    ClusterManagementResult<MemberConfig, MemberInformation> result = client.list(config);
     assertThat(result.isSuccessful()).isTrue();
     assertThat(result.getStatusCode())
         .isEqualTo(ClusterManagementResult.StatusCode.OK);
-    assertThat(result.getResult().size()).isEqualTo(0);
+    assertThat(result.getResult().size()).isEqualTo(1);
+    assertThat(result.getRuntimeResult().size()).isEqualTo(0);
   }
 
   @Test
@@ -158,6 +162,6 @@ public class MemberManagementServiceDUnitTest {
         .andExpect(status().isNotFound())
         .andExpect(jsonPath("$.statusCode", is("ENTITY_NOT_FOUND")))
         .andExpect(jsonPath("$.statusMessage",
-            is("MemberConfig with id = server not found.")));
+            is("Member with id = server not found.")));
   }
 }
diff --git a/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/GatewayManagementIntegrationTest.java b/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/GatewayManagementIntegrationTest.java
index 28086b7..c932a56 100644
--- a/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/GatewayManagementIntegrationTest.java
+++ b/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/GatewayManagementIntegrationTest.java
@@ -34,7 +34,9 @@ import org.apache.geode.cache.configuration.GatewayReceiverConfig;
 import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
 import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.api.ClusterManagementService;
+import org.apache.geode.management.api.Response;
 import org.apache.geode.management.client.ClusterManagementServiceBuilder;
+import org.apache.geode.management.runtime.RuntimeInfo;
 import org.apache.geode.test.junit.rules.LocatorStarterRule;
 
 @RunWith(SpringRunner.class)
@@ -63,7 +65,7 @@ public class GatewayManagementIntegrationTest {
 
   @Test
   public void listEmptyGatewayReceivers() {
-    ClusterManagementResult<GatewayReceiverConfig> result = client.list(receiver);
+    ClusterManagementResult<GatewayReceiverConfig, RuntimeInfo> result = client.list(receiver);
     assertThat(result.isSuccessful()).isTrue();
     assertThat(result.getResult().size()).isEqualTo(0);
   }
@@ -85,11 +87,11 @@ public class GatewayManagementIntegrationTest {
       return cacheConfig;
     });
 
-    ClusterManagementResult<GatewayReceiverConfig> results = client.list(receiver);
+    ClusterManagementResult<GatewayReceiverConfig, RuntimeInfo> results = client.list(receiver);
     assertThat(results.isSuccessful()).isTrue();
-    List<GatewayReceiverConfig> receivers = results.getResult();
+    List<Response<GatewayReceiverConfig, RuntimeInfo>> receivers = results.getResult();
     assertThat(receivers.size()).isEqualTo(1);
-    GatewayReceiverConfig result = receivers.get(0);
+    GatewayReceiverConfig result = receivers.get(0).getConfig();
     assertThat(result.getBindAddress()).isEqualTo("localhost");
     assertThat(result.isManualStart()).isFalse();
     assertThat(result.getStartPort()).isEqualTo("5000");
diff --git a/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/MemberManagementServiceRestIntegrationTest.java b/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/MemberManagementServiceRestIntegrationTest.java
index 0ad6bb4..0043007 100644
--- a/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/MemberManagementServiceRestIntegrationTest.java
+++ b/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/MemberManagementServiceRestIntegrationTest.java
@@ -73,14 +73,14 @@ public class MemberManagementServiceRestIntegrationTest {
         .andExpect(status().isOk())
         .andExpect(jsonPath("$.memberStatuses").doesNotExist())
         .andExpect(jsonPath("$.statusCode", is("OK")))
-        .andExpect(jsonPath("$.result[*].id", contains("locator-0")))
-        .andExpect(jsonPath("$.result[0].port", greaterThan(0)))
-        .andExpect(jsonPath("$.result[0].locator", is(true)))
-        .andExpect(jsonPath("$.result[0].status", is("online")))
-        .andExpect(jsonPath("$.result[0].cacheServers").doesNotExist())
-        .andExpect(jsonPath("$.result[0].logFile", endsWith("locator-0.log")))
-        .andExpect(jsonPath("$.result[0].workingDirectory", notNullValue()))
-        .andExpect(jsonPath("$.result[0].usedHeap", greaterThan(0)));
+        .andExpect(jsonPath("$.result[0].runtimeInfo[*].name", contains("locator-0")))
+        .andExpect(jsonPath("$.result[0].runtimeInfo[0].locatorPort", greaterThan(0)))
+        .andExpect(jsonPath("$.result[0].runtimeInfo[0].server", is(false)))
+        .andExpect(jsonPath("$.result[0].runtimeInfo[0].status", is("online")))
+        .andExpect(jsonPath("$.result[0].runtimeInfo[0].cacheServerInfo").doesNotExist())
+        .andExpect(jsonPath("$.result[0].runtimeInfo[0].logFilePath", endsWith("locator-0.log")))
+        .andExpect(jsonPath("$.result[0].runtimeInfo[0].workingDirPath", notNullValue()))
+        .andExpect(jsonPath("$.result[0].runtimeInfo[0].heapUsage", greaterThan(0)));
   }
 
   @Test
@@ -91,17 +91,18 @@ public class MemberManagementServiceRestIntegrationTest {
         .andExpect(status().isOk())
         .andExpect(jsonPath("$.memberStatuses").doesNotExist())
         .andExpect(jsonPath("$.statusCode", is("OK")))
-        .andExpect(jsonPath("$.result[*].id", contains("server-1")))
-        .andExpect(jsonPath("$.result[0].port").doesNotExist())
-        .andExpect(jsonPath("$.result[0].locator", is(false)))
-        .andExpect(jsonPath("$.result[0].cacheServers[0].port", greaterThan(0)))
-        .andExpect(jsonPath("$.result[0].cacheServers[0].maxConnections", equalTo(800)))
-        .andExpect(jsonPath("$.result[0].cacheServers[0].maxThreads", equalTo(0)))
-        .andExpect(jsonPath("$.result[0].groups", containsInAnyOrder("group-1", "group-2")))
-        .andExpect(jsonPath("$.result[0].logFile", endsWith("server-1.log")))
-        .andExpect(jsonPath("$.result[0].workingDirectory", endsWith("vm1")))
-        .andExpect(jsonPath("$.result[0].clientConnections", equalTo(0)))
-        .andExpect(jsonPath("$.result[0].usedHeap", greaterThan(0)));
+        .andExpect(jsonPath("$.result[0].runtimeInfo[*].name", contains("server-1")))
+        .andExpect(jsonPath("$.result[0].runtimeInfo[0].locatorPort", is(0)))
+        .andExpect(jsonPath("$.result[0].runtimeInfo[0].server", is(true)))
+        .andExpect(jsonPath("$.result[0].runtimeInfo[0].cacheServerInfo[0].port", greaterThan(0)))
+        .andExpect(
+            jsonPath("$.result[0].runtimeInfo[0].cacheServerInfo[0].maxConnections", equalTo(800)))
+        .andExpect(jsonPath("$.result[0].runtimeInfo[0].cacheServerInfo[0].maxThreads", equalTo(0)))
+        .andExpect(jsonPath("$.result[0].runtimeInfo[0].groups", equalTo("group-1,group-2")))
+        .andExpect(jsonPath("$.result[0].runtimeInfo[0].logFilePath", endsWith("server-1.log")))
+        .andExpect(jsonPath("$.result[0].runtimeInfo[0].workingDirPath", endsWith("vm1")))
+        .andExpect(jsonPath("$.result[0].runtimeInfo[0].clientCount", equalTo(0)))
+        .andExpect(jsonPath("$.result[0].runtimeInfo[0].heapUsage", greaterThan(0)));
   }
 
   @Test
@@ -111,6 +112,7 @@ public class MemberManagementServiceRestIntegrationTest {
         .andExpect(status().isOk())
         .andExpect(jsonPath("$.memberStatuses").doesNotExist())
         .andExpect(jsonPath("$.statusCode", is("OK")))
-        .andExpect(jsonPath("$.result[*].id", containsInAnyOrder("locator-0", "server-1")));
+        .andExpect(jsonPath("$.result[0].runtimeInfo[*].name",
+            containsInAnyOrder("locator-0", "server-1")));
   }
 }
diff --git a/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/PdxManagementTest.java b/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/PdxManagementTest.java
index 57d746d..feab637 100644
--- a/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/PdxManagementTest.java
+++ b/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/PdxManagementTest.java
@@ -65,8 +65,7 @@ public class PdxManagementTest {
         .andExpect(
             jsonPath("$.statusMessage", containsString("Successfully updated config for cluster")))
         .andExpect(jsonPath("$.statusCode", is("OK")))
-        .andExpect(jsonPath("$.result[0].readSerialized", is(true)))
-        .andExpect(jsonPath("$.result[0].uri", is("/geode-management/v2/configurations/pdx")));
+        .andExpect(jsonPath("$.uri", is("/management/v2/configurations/pdx")));
   }
 
   @Test
diff --git a/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/RegionManagementIntegrationTest.java b/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/RegionManagementIntegrationTest.java
index 4d21c79..82d885d 100644
--- a/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/RegionManagementIntegrationTest.java
+++ b/geode-web-management/src/integrationTest/java/org/apache/geode/management/internal/rest/RegionManagementIntegrationTest.java
@@ -34,7 +34,6 @@ import org.apache.geode.cache.configuration.RegionType;
 import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.api.ClusterManagementService;
 import org.apache.geode.management.client.ClusterManagementServiceBuilder;
-import org.apache.geode.management.configuration.RuntimeRegionConfig;
 
 @RunWith(SpringRunner.class)
 @ContextConfiguration(locations = {"classpath*:WEB-INF/management-servlet.xml"},
@@ -96,18 +95,6 @@ public class RegionManagementIntegrationTest {
   }
 
   @Test
-  public void invalidConfigObject() throws Exception {
-    RuntimeRegionConfig regionConfig = new RuntimeRegionConfig();
-    regionConfig.setName("customers");
-    regionConfig.setGroup("group1");
-
-    assertManagementResult(client.create(regionConfig))
-        .failed()
-        .hasStatusCode(ClusterManagementResult.StatusCode.ILLEGAL_ARGUMENT)
-        .containsStatusMessage("Configuration type RuntimeRegionConfig is not supported");
-  }
-
-  @Test
   @WithMockUser
   public void ping() throws Exception {
     context.perform(get("/v2/ping"))
diff --git a/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/GatewayManagementController.java b/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/GatewayManagementController.java
index aaf43b0..d16efe5 100644
--- a/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/GatewayManagementController.java
+++ b/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/GatewayManagementController.java
@@ -31,6 +31,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
 
 import org.apache.geode.cache.configuration.GatewayReceiverConfig;
 import org.apache.geode.management.api.ClusterManagementResult;
+import org.apache.geode.management.runtime.RuntimeInfo;
 
 @Controller("gatewayManagement")
 @RequestMapping(MANAGEMENT_API_VERSION)
@@ -39,7 +40,7 @@ public class GatewayManagementController extends AbstractManagementController {
   @PreAuthorize("@securityService.authorize('CLUSTER', 'READ')")
   @RequestMapping(method = RequestMethod.GET, value = GATEWAY_RECEIVERS_ENDPOINTS)
   @ResponseBody
-  public ClusterManagementResult<GatewayReceiverConfig> listGatewayReceivers(
+  public ClusterManagementResult<GatewayReceiverConfig, RuntimeInfo> listGatewayReceivers(
       @RequestParam(required = false) String group) {
     GatewayReceiverConfig filter = new GatewayReceiverConfig();
     if (StringUtils.isNotBlank(group)) {
@@ -50,9 +51,9 @@ public class GatewayManagementController extends AbstractManagementController {
 
   @PreAuthorize("@securityService.authorize('CLUSTER', 'MANAGE')")
   @RequestMapping(method = RequestMethod.POST, value = GATEWAY_RECEIVERS_ENDPOINTS)
-  public ResponseEntity<ClusterManagementResult<GatewayReceiverConfig>> createGatewayReceiver(
+  public ResponseEntity<ClusterManagementResult> createGatewayReceiver(
       @RequestBody GatewayReceiverConfig gatewayReceiverConfig) {
-    ClusterManagementResult<GatewayReceiverConfig> result =
+    ClusterManagementResult result =
         clusterManagementService.create(gatewayReceiverConfig);
     return new ResponseEntity<>(result,
         result.isSuccessful() ? HttpStatus.CREATED : HttpStatus.INTERNAL_SERVER_ERROR);
diff --git a/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/MemberManagementController.java b/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/MemberManagementController.java
index a182849..f68f727 100644
--- a/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/MemberManagementController.java
+++ b/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/MemberManagementController.java
@@ -30,18 +30,24 @@ import org.springframework.web.bind.annotation.RequestParam;
 
 import org.apache.geode.management.api.ClusterManagementResult;
 import org.apache.geode.management.configuration.MemberConfig;
-import org.apache.geode.management.configuration.RuntimeMemberConfig;
+import org.apache.geode.management.internal.exceptions.EntityNotFoundException;
+import org.apache.geode.management.runtime.MemberInformation;
 
 @Controller("members")
 @RequestMapping(MANAGEMENT_API_VERSION)
 public class MemberManagementController extends AbstractManagementController {
   @PreAuthorize("@securityService.authorize('CLUSTER', 'READ')")
   @RequestMapping(method = RequestMethod.GET, value = MEMBER_CONFIG_ENDPOINT + "/{id}")
-  public ResponseEntity<ClusterManagementResult<RuntimeMemberConfig>> getMember(
+  public ResponseEntity<ClusterManagementResult<MemberConfig, MemberInformation>> getMember(
       @PathVariable(name = "id") String id) {
     MemberConfig config = new MemberConfig();
     config.setId(id);
-    ClusterManagementResult<RuntimeMemberConfig> result = clusterManagementService.get(config);
+    ClusterManagementResult<MemberConfig, MemberInformation> result =
+        clusterManagementService.list(config);
+    if (result.getRuntimeResult().size() == 0) {
+      throw new EntityNotFoundException(
+          "Member with id = " + config.getId() + " not found.");
+    }
 
     return new ResponseEntity<>(result,
         result.isSuccessful() ? HttpStatus.OK : HttpStatus.INTERNAL_SERVER_ERROR);
@@ -49,13 +55,14 @@ public class MemberManagementController extends AbstractManagementController {
 
   @PreAuthorize("@securityService.authorize('CLUSTER', 'READ')")
   @RequestMapping(method = RequestMethod.GET, value = MEMBER_CONFIG_ENDPOINT)
-  public ResponseEntity<ClusterManagementResult<RuntimeMemberConfig>> listMembers(
+  public ResponseEntity<ClusterManagementResult<MemberConfig, MemberInformation>> listMembers(
       @RequestParam(required = false) String id, @RequestParam(required = false) String group) {
     MemberConfig filter = new MemberConfig();
     if (StringUtils.isNotBlank(id)) {
       filter.setId(id);
     }
-    ClusterManagementResult<RuntimeMemberConfig> result = clusterManagementService.list(filter);
+    ClusterManagementResult<MemberConfig, MemberInformation> result =
+        clusterManagementService.list(filter);
 
     return new ResponseEntity<>(result,
         result.isSuccessful() ? HttpStatus.OK : HttpStatus.INTERNAL_SERVER_ERROR);
diff --git a/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/PdxManagementController.java b/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/PdxManagementController.java
index 79e7a89..22de967 100644
--- a/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/PdxManagementController.java
+++ b/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/PdxManagementController.java
@@ -45,7 +45,7 @@ public class PdxManagementController extends AbstractManagementController {
   @RequestMapping(method = RequestMethod.POST, value = PDX_ENDPOINT)
   public ResponseEntity<ClusterManagementResult> configurePdx(
       @RequestBody PdxType pdxType) {
-    ClusterManagementResult<PdxType> result = clusterManagementService.create(pdxType);
+    ClusterManagementResult result = clusterManagementService.create(pdxType);
     return new ResponseEntity<>(result,
         result.isSuccessful() ? HttpStatus.CREATED : HttpStatus.INTERNAL_SERVER_ERROR);
   }
diff --git a/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/RegionManagementController.java b/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/RegionManagementController.java
index 5d4c520..4c18a86 100644
--- a/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/RegionManagementController.java
+++ b/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/controllers/RegionManagementController.java
@@ -18,7 +18,10 @@ package org.apache.geode.management.internal.rest.controllers;
 import static org.apache.geode.cache.configuration.RegionConfig.REGION_CONFIG_ENDPOINT;
 import static org.apache.geode.management.internal.rest.controllers.AbstractManagementController.MANAGEMENT_API_VERSION;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
@@ -37,8 +40,10 @@ import org.springframework.web.bind.annotation.ResponseBody;
 
 import org.apache.geode.cache.configuration.RegionConfig;
 import org.apache.geode.management.api.ClusterManagementResult;
-import org.apache.geode.management.configuration.RuntimeRegionConfig;
+import org.apache.geode.management.api.Response;
 import org.apache.geode.management.internal.exceptions.EntityNotFoundException;
+import org.apache.geode.management.runtime.RuntimeInfo;
+import org.apache.geode.management.runtime.RuntimeRegionInfo;
 import org.apache.geode.security.ResourcePermission.Operation;
 import org.apache.geode.security.ResourcePermission.Resource;
 
@@ -54,9 +59,9 @@ public class RegionManagementController extends AbstractManagementController {
       @ApiResponse(code = 500, message = "GemFire throws an error or exception.")})
   @PreAuthorize("@securityService.authorize('DATA', 'MANAGE')")
   @RequestMapping(method = RequestMethod.POST, value = REGION_CONFIG_ENDPOINT)
-  public ResponseEntity<ClusterManagementResult<RegionConfig>> createRegion(
+  public ResponseEntity<ClusterManagementResult> createRegion(
       @RequestBody RegionConfig regionConfig) {
-    ClusterManagementResult<RegionConfig> result =
+    ClusterManagementResult result =
         clusterManagementService.create(regionConfig);
     return new ResponseEntity<>(result,
         result.isSuccessful() ? HttpStatus.CREATED : HttpStatus.INTERNAL_SERVER_ERROR);
@@ -65,7 +70,7 @@ public class RegionManagementController extends AbstractManagementController {
   @PreAuthorize("@securityService.authorize('CLUSTER', 'READ')")
   @RequestMapping(method = RequestMethod.GET, value = REGION_CONFIG_ENDPOINT)
   @ResponseBody
-  public ClusterManagementResult<RuntimeRegionConfig> listRegion(
+  public ClusterManagementResult<RegionConfig, RuntimeRegionInfo> listRegion(
       @RequestParam(required = false) String id,
       @RequestParam(required = false) String group) {
     RegionConfig filter = new RegionConfig();
@@ -80,7 +85,7 @@ public class RegionManagementController extends AbstractManagementController {
 
   @RequestMapping(method = RequestMethod.GET, value = REGION_CONFIG_ENDPOINT + "/{id}")
   @ResponseBody
-  public ClusterManagementResult<RuntimeRegionConfig> getRegion(
+  public ClusterManagementResult<RegionConfig, RuntimeRegionInfo> getRegion(
       @PathVariable(name = "id") String id) {
     securityService.authorize(Resource.CLUSTER, Operation.READ, id);
     RegionConfig config = new RegionConfig();
@@ -91,7 +96,7 @@ public class RegionManagementController extends AbstractManagementController {
   @PreAuthorize("@securityService.authorize('DATA', 'MANAGE')")
   @RequestMapping(method = RequestMethod.DELETE, value = REGION_CONFIG_ENDPOINT + "/{id}")
   @ResponseBody
-  public ClusterManagementResult<RegionConfig> deleteRegion(
+  public ClusterManagementResult deleteRegion(
       @PathVariable(name = "id") String id,
       @RequestParam(required = false) String group) {
     RegionConfig config = new RegionConfig();
@@ -106,18 +111,30 @@ public class RegionManagementController extends AbstractManagementController {
       value = REGION_CONFIG_ENDPOINT + "/{regionName}/indexes")
   @ResponseBody
   @PreAuthorize("@securityService.authorize('CLUSTER', 'READ', 'QUERY')")
-  public ClusterManagementResult<RegionConfig.Index> listIndex(
+  public ClusterManagementResult<RegionConfig.Index, RuntimeInfo> listIndex(
       @PathVariable String regionName,
       @RequestParam(required = false) String id) {
 
-    ClusterManagementResult<RuntimeRegionConfig> result0 = getRegion(regionName);
-    RuntimeRegionConfig runtimeRegion = result0.getResult().get(0);
+    ClusterManagementResult<RegionConfig, RuntimeRegionInfo> result0 = getRegion(regionName);
+    RegionConfig regionConfig = result0.getResult().get(0).getConfig();
 
     // only send the index information back
-    List<RegionConfig.Index> runtimeIndexes = runtimeRegion.getIndexes(id);
-    ClusterManagementResult<RegionConfig.Index> result = new ClusterManagementResult<>();
-    result.setResult(runtimeIndexes);
+    List<RegionConfig.Index> indexList = regionConfig.getIndexes().stream().map(e -> {
+      if (StringUtils.isNotBlank(id) && !e.getId().equals(id)) {
+        return null;
+      }
+      e.setRegionName(regionName);
+      return e;
+    }).filter(Objects::nonNull).collect(Collectors.toList());
+
+    List<Response<RegionConfig.Index, RuntimeInfo>> responses = new ArrayList<>();
+    for (RegionConfig.Index index : indexList) {
+      responses.add(new Response<>(index));
+    }
 
+    ClusterManagementResult<RegionConfig.Index, RuntimeInfo> result =
+        new ClusterManagementResult<>();
+    result.setResult(responses);
     return result;
   }
 
@@ -125,11 +142,11 @@ public class RegionManagementController extends AbstractManagementController {
       value = REGION_CONFIG_ENDPOINT + "/{regionName}/indexes/{id}")
   @ResponseBody
   @PreAuthorize("@securityService.authorize('CLUSTER', 'READ', 'QUERY')")
-  public ClusterManagementResult<RegionConfig.Index> getIndex(
+  public ClusterManagementResult<RegionConfig.Index, RuntimeInfo> getIndex(
       @PathVariable String regionName,
       @PathVariable String id) {
-    ClusterManagementResult<RegionConfig.Index> result = listIndex(regionName, id);
-    List<RegionConfig.Index> indexList = result.getResult();
+    ClusterManagementResult<RegionConfig.Index, RuntimeInfo> result = listIndex(regionName, id);
+    List<Response<RegionConfig.Index, RuntimeInfo>> indexList = result.getResult();
 
     if (indexList.size() == 0) {
       throw new EntityNotFoundException("Index " + id + " not found.");
diff --git a/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/security/RestSecurityConfiguration.java b/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/security/RestSecurityConfiguration.java
index 935240d..ddcc1c8 100644
--- a/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/security/RestSecurityConfiguration.java
+++ b/geode-web-management/src/main/java/org/apache/geode/management/internal/rest/security/RestSecurityConfiguration.java
@@ -81,8 +81,8 @@ public class RestSecurityConfiguration extends WebSecurityConfigurerAdapter {
           response.addHeader("WWW-Authenticate", "Basic realm=\"GEODE\"");
           response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
           response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
-          ClusterManagementResult<?> result =
-              new ClusterManagementResult<>(ClusterManagementResult.StatusCode.UNAUTHENTICATED,
+          ClusterManagementResult result =
+              new ClusterManagementResult(ClusterManagementResult.StatusCode.UNAUTHENTICATED,
                   authException.getMessage());
           objectMapper.writeValue(response.getWriter(), result);
         }