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

[geode] branch develop updated: GEODE-5971: Refactor gateway receiver/gateway sender commands to extend SingleGfshCommand base type (#2769)

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

jensdeppe 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 2b4313a  GEODE-5971: Refactor gateway receiver/gateway sender commands to extend SingleGfshCommand base type (#2769)
2b4313a is described below

commit 2b4313aff2d418d73814f966fc8d207706cec6a0
Author: Aditya Anchuri <aa...@pivotal.io>
AuthorDate: Sat Nov 3 21:03:51 2018 -0700

    GEODE-5971: Refactor gateway receiver/gateway sender commands to extend SingleGfshCommand base type (#2769)
    
    * GEODE-5971 Refactor gateway receiver/gateway sender commands to extend SingleGfshCommand base type
    
    Signed-off-by: Aditya Anchuri <aa...@pivotal.io>
---
 .../geode/cache/configuration/CacheConfig.java     |   6 +-
 .../apache/geode/management/cli/GfshCommand.java   |   5 +
 .../geode/management/cli/SingleGfshCommand.java    |   4 +-
 .../cli/commands/CreateGatewaySenderCommand.java   | 101 ++++++++++++++++-----
 .../cli/commands/DestroyGatewaySenderCommand.java  |  36 +++-----
 .../cli/commands/GatewayCommandsUtils.java         |  29 ------
 .../commands/LoadBalanceGatewaySenderCommand.java  |  79 ++++++++--------
 .../cli/commands/PauseGatewaySenderCommand.java    |  34 +++----
 .../cli/commands/ResumeGatewaySenderCommand.java   |  36 ++++----
 .../cli/commands/StartGatewayReceiverCommand.java  |  32 +++----
 .../cli/commands/StartGatewaySenderCommand.java    |  32 +++----
 .../cli/commands/StatusGatewayReceiverCommand.java |  43 ++++-----
 .../cli/commands/StatusGatewaySenderCommand.java   |  40 ++++----
 .../cli/commands/StopGatewayReceiverCommand.java   |  32 +++----
 .../cli/commands/StopGatewaySenderCommand.java     |  29 +++---
 .../functions/GatewayReceiverCreateFunction.java   |   5 +-
 .../cli/functions/GatewaySenderCreateFunction.java |  15 ++-
 .../cli/functions/GatewaySenderFunctionArgs.java   |  76 +++++++++-------
 .../cli/result/model/TabularResultModel.java       |   8 ++
 .../sanctioned-geode-core-serializables.txt        |   2 +-
 .../commands/CreateGatewaySenderCommandTest.java   |  84 ++++++++++-------
 .../commands/DestroyGatewaySenderCommandTest.java  |  72 +++++----------
 ...CreateDestroyGatewaySenderCommandDUnitTest.java |  31 ++++---
 .../DestroyGatewaySenderCommandDUnitTest.java      |   8 +-
 .../PauseGatewaySenderCommandDUnitTest.java        |  35 +++----
 .../ResumeGatewaySenderCommandDUnitTest.java       |  35 +++----
 .../StartGatewayReceiverCommandDUnitTest.java      |  36 ++++----
 .../StartGatewaySenderCommandDUnitTest.java        |  52 +++++------
 .../StatusGatewayReceiverCommandDUnitTest.java     |  70 +++++++-------
 .../StatusGatewaySenderCommandDUnitTest.java       |  93 +++++++++----------
 .../StopGatewayReceiverCommandDUnitTest.java       |  35 +++----
 .../StopGatewaySenderCommandDUnitTest.java         |  36 ++++----
 32 files changed, 612 insertions(+), 619 deletions(-)

diff --git a/geode-core/src/main/java/org/apache/geode/cache/configuration/CacheConfig.java b/geode-core/src/main/java/org/apache/geode/cache/configuration/CacheConfig.java
index 899de35..285184f 100644
--- a/geode-core/src/main/java/org/apache/geode/cache/configuration/CacheConfig.java
+++ b/geode-core/src/main/java/org/apache/geode/cache/configuration/CacheConfig.java
@@ -437,7 +437,7 @@ public class CacheConfig {
    */
   public List<CacheConfig.GatewaySender> getGatewaySenders() {
     if (gatewaySenders == null) {
-      gatewaySenders = new ArrayList<CacheConfig.GatewaySender>();
+      gatewaySenders = new ArrayList<>();
     }
     return this.gatewaySenders;
   }
@@ -2870,7 +2870,7 @@ public class CacheConfig {
      */
     public List<DeclarableType> getGatewayEventFilters() {
       if (gatewayEventFilters == null) {
-        gatewayEventFilters = new ArrayList<DeclarableType>();
+        gatewayEventFilters = new ArrayList<>();
       }
       return this.gatewayEventFilters;
     }
@@ -2922,7 +2922,7 @@ public class CacheConfig {
      */
     public List<DeclarableType> getGatewayTransportFilters() {
       if (gatewayTransportFilters == null) {
-        gatewayTransportFilters = new ArrayList<DeclarableType>();
+        gatewayTransportFilters = new ArrayList<>();
       }
       return this.gatewayTransportFilters;
     }
diff --git a/geode-core/src/main/java/org/apache/geode/management/cli/GfshCommand.java b/geode-core/src/main/java/org/apache/geode/management/cli/GfshCommand.java
index 71565a2..c3f0665 100644
--- a/geode-core/src/main/java/org/apache/geode/management/cli/GfshCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/cli/GfshCommand.java
@@ -32,6 +32,7 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.distributed.internal.InternalLocator;
 import org.apache.geode.internal.Version;
 import org.apache.geode.internal.cache.InternalCache;
+import org.apache.geode.management.ManagementService;
 import org.apache.geode.management.internal.cli.CliUtil;
 import org.apache.geode.management.internal.cli.exceptions.EntityNotFoundException;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
@@ -78,6 +79,10 @@ public abstract class GfshCommand implements CommandMarker {
     return cache;
   }
 
+  public <T extends ManagementService> T getManagementService() {
+    return (T) ManagementService.getExistingManagementService(cache);
+  }
+
   public ConfigurationPersistenceService getConfigurationPersistenceService() {
     InternalLocator locator = InternalLocator.getLocator();
     return locator == null ? null : locator.getConfigurationPersistenceService();
diff --git a/geode-core/src/main/java/org/apache/geode/management/cli/SingleGfshCommand.java b/geode-core/src/main/java/org/apache/geode/management/cli/SingleGfshCommand.java
index ef5c1bc..edcf3e9 100644
--- a/geode-core/src/main/java/org/apache/geode/management/cli/SingleGfshCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/cli/SingleGfshCommand.java
@@ -41,5 +41,7 @@ public abstract class SingleGfshCommand extends GfshCommand {
    *
    *        it should throw some RuntimeException if update failed.
    */
-  public abstract void updateClusterConfig(String group, CacheConfig config, Object configObject);
+  public void updateClusterConfig(String group, CacheConfig config, Object configObject) {
+    // Default is a no-op
+  }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateGatewaySenderCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateGatewaySenderCommand.java
index c428574..078054a 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateGatewaySenderCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/CreateGatewaySenderCommand.java
@@ -15,39 +15,43 @@
 
 package org.apache.geode.management.internal.cli.commands;
 
+import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.springframework.shell.core.annotation.CliCommand;
 import org.springframework.shell.core.annotation.CliOption;
 
+import org.apache.geode.cache.configuration.CacheConfig;
+import org.apache.geode.cache.configuration.DeclarableType;
 import org.apache.geode.cache.wan.GatewaySender.OrderPolicy;
 import org.apache.geode.distributed.DistributedMember;
-import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.internal.Version;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
 import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.cli.SingleGfshCommand;
 import org.apache.geode.management.internal.cli.AbstractCliAroundInterceptor;
 import org.apache.geode.management.internal.cli.GfshParseResult;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.cli.functions.GatewaySenderCreateFunction;
 import org.apache.geode.management.internal.cli.functions.GatewaySenderFunctionArgs;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.CommandResult;
 import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.configuration.domain.XmlEntity;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
-public class CreateGatewaySenderCommand extends InternalGfshCommand {
+public class CreateGatewaySenderCommand extends SingleGfshCommand {
   @CliCommand(value = CliStrings.CREATE_GATEWAYSENDER, help = CliStrings.CREATE_GATEWAYSENDER__HELP)
   @CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN,
       interceptor = "org.apache.geode.management.internal.cli.commands.CreateGatewaySenderCommand$Interceptor")
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.MANAGE, target = ResourcePermission.Target.GATEWAY)
-  public Result createGatewaySender(@CliOption(key = {CliStrings.GROUP, CliStrings.GROUPS},
+  public ResultModel createGatewaySender(@CliOption(key = {CliStrings.GROUP, CliStrings.GROUPS},
       optionContext = ConverterHint.MEMBERGROUP,
       help = CliStrings.CREATE_GATEWAYSENDER__GROUP__HELP) String[] onGroups,
 
@@ -110,18 +114,20 @@ public class CreateGatewaySenderCommand extends InternalGfshCommand {
       @CliOption(key = CliStrings.CREATE_GATEWAYSENDER__GATEWAYTRANSPORTFILTER,
           help = CliStrings.CREATE_GATEWAYSENDER__GATEWAYTRANSPORTFILTER__HELP) String[] gatewayTransportFilter) {
 
-    GatewaySenderFunctionArgs gatewaySenderFunctionArgs =
-        new GatewaySenderFunctionArgs(id, remoteDistributedSystemId, parallel, manualStart,
+    CacheConfig.GatewaySender configuration =
+        buildConfiguration(id, remoteDistributedSystemId, parallel, manualStart,
             socketBufferSize, socketReadTimeout, enableBatchConflation, batchSize,
             batchTimeInterval, enablePersistence, diskStoreName, diskSynchronous, maxQueueMemory,
             alertThreshold, dispatcherThreads, orderPolicy == null ? null : orderPolicy.name(),
             gatewayEventFilters, gatewayTransportFilter);
 
+    GatewaySenderFunctionArgs gatewaySenderFunctionArgs =
+        new GatewaySenderFunctionArgs(configuration);
     Set<DistributedMember> membersToCreateGatewaySenderOn = getMembers(onGroups, onMember);
 
     // Don't allow sender to be created if all members are not the current version.
     if (!verifyAllCurrentVersion(membersToCreateGatewaySenderOn)) {
-      return ResultBuilder.createUserErrorResult(
+      return ResultModel.createError(
           CliStrings.CREATE_GATEWAYSENDER__MSG__CAN_NOT_CREATE_DIFFERENT_VERSIONS);
     }
 
@@ -129,24 +135,15 @@ public class CreateGatewaySenderCommand extends InternalGfshCommand {
         executeAndGetFunctionResult(GatewaySenderCreateFunction.INSTANCE, gatewaySenderFunctionArgs,
             membersToCreateGatewaySenderOn);
 
-    CommandResult result = ResultBuilder.buildResult(gatewaySenderCreateResults);
-    XmlEntity xmlEntity = findXmlEntity(gatewaySenderCreateResults);
-
-    // no xml needs to be updated, simply return
-    if (xmlEntity == null) {
-      return result;
-    }
+    ResultModel resultModel = ResultModel.createMemberStatusResult(gatewaySenderCreateResults);
+    resultModel.setConfigObject(configuration);
 
-    // has xml but unable to persist to cluster config, need to print warning message and return
-    if (onMember != null || getConfigurationPersistenceService() == null) {
-      result.setCommandPersisted(false);
-      return result;
-    }
+    return resultModel;
+  }
 
-    // update cluster config
-    ((InternalConfigurationPersistenceService) getConfigurationPersistenceService())
-        .addXmlEntity(xmlEntity, onGroups);
-    return result;
+  @Override
+  public void updateClusterConfig(String group, CacheConfig config, Object configObject) {
+    config.getGatewaySenders().add((CacheConfig.GatewaySender) configObject);
   }
 
   private boolean verifyAllCurrentVersion(Set<DistributedMember> members) {
@@ -154,6 +151,62 @@ public class CreateGatewaySenderCommand extends InternalGfshCommand {
         member -> ((InternalDistributedMember) member).getVersionObject().equals(Version.CURRENT));
   }
 
+  private CacheConfig.GatewaySender buildConfiguration(String id, Integer remoteDSId,
+      Boolean parallel,
+      Boolean manualStart,
+      Integer socketBufferSize,
+      Integer socketReadTimeout,
+      Boolean enableBatchConflation,
+      Integer batchSize,
+      Integer batchTimeInterval,
+      Boolean enablePersistence,
+      String diskStoreName,
+      Boolean diskSynchronous,
+      Integer maxQueueMemory,
+      Integer alertThreshold,
+      Integer dispatcherThreads,
+      String orderPolicy,
+      String[] gatewayEventFilters,
+      String[] gatewayTransportFilters) {
+    CacheConfig.GatewaySender sender = new CacheConfig.GatewaySender();
+    sender.setId(id);
+    sender.setRemoteDistributedSystemId(int2string(remoteDSId));
+    sender.setParallel(parallel);
+    sender.setManualStart(manualStart);
+    sender.setSocketBufferSize(int2string(socketBufferSize));
+    sender.setSocketReadTimeout(int2string(socketReadTimeout));
+    sender.setEnableBatchConflation(enableBatchConflation);
+    sender.setBatchSize(int2string(batchSize));
+    sender.setBatchTimeInterval(int2string(batchTimeInterval));
+    sender.setEnablePersistence(enablePersistence);
+    sender.setDiskStoreName(diskStoreName);
+    sender.setDiskSynchronous(diskSynchronous);
+    sender.setMaximumQueueMemory(int2string(maxQueueMemory));
+    sender.setAlertThreshold(int2string(alertThreshold));
+    sender.setDispatcherThreads(int2string(dispatcherThreads));
+    sender.setOrderPolicy(orderPolicy);
+    if (gatewayEventFilters != null) {
+      sender.getGatewayEventFilters().addAll((stringsToDeclarableTypes(gatewayEventFilters)));
+    }
+    if (gatewayTransportFilters != null) {
+      sender.getGatewayTransportFilters().addAll(stringsToDeclarableTypes(gatewayTransportFilters));
+    }
+
+    return sender;
+  }
+
+  private List<DeclarableType> stringsToDeclarableTypes(String[] objects) {
+    return Arrays.stream(objects).map(fullyQualifiedClassName -> {
+      DeclarableType thisFilter = new DeclarableType();
+      thisFilter.setClassName(fullyQualifiedClassName);
+      return thisFilter;
+    }).collect(Collectors.toList());
+  }
+
+  private String int2string(Integer i) {
+    return Optional.ofNullable(i).map(in -> in.toString()).orElse(null);
+  }
+
   public static class Interceptor extends AbstractCliAroundInterceptor {
     @Override
     public Result preExecution(GfshParseResult parseResult) {
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyGatewaySenderCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyGatewaySenderCommand.java
index cc838f8..dd77207 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyGatewaySenderCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/DestroyGatewaySenderCommand.java
@@ -22,23 +22,21 @@ import org.apache.logging.log4j.Logger;
 import org.springframework.shell.core.annotation.CliCommand;
 import org.springframework.shell.core.annotation.CliOption;
 
+import org.apache.geode.cache.configuration.CacheConfig;
 import org.apache.geode.distributed.DistributedMember;
-import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
 import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
-import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.cli.SingleGfshCommand;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
 import org.apache.geode.management.internal.cli.functions.GatewaySenderDestroyFunction;
 import org.apache.geode.management.internal.cli.functions.GatewaySenderDestroyFunctionArgs;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.CommandResult;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.configuration.domain.XmlEntity;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
-public class DestroyGatewaySenderCommand extends InternalGfshCommand {
+public class DestroyGatewaySenderCommand extends SingleGfshCommand {
   private static final Logger logger = LogService.getLogger();
 
   @CliCommand(value = CliStrings.DESTROY_GATEWAYSENDER,
@@ -46,7 +44,7 @@ public class DestroyGatewaySenderCommand extends InternalGfshCommand {
   @CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.MANAGE, target = ResourcePermission.Target.GATEWAY)
-  public Result destroyGatewaySender(
+  public ResultModel destroyGatewaySender(
       @CliOption(key = {CliStrings.GROUP, CliStrings.GROUPS},
           optionContext = ConverterHint.MEMBERGROUP,
           help = CliStrings.DESTROY_GATEWAYSENDER__GROUP__HELP) String[] onGroups,
@@ -67,23 +65,13 @@ public class DestroyGatewaySenderCommand extends InternalGfshCommand {
     List<CliFunctionResult> functionResults = executeAndGetFunctionResult(
         GatewaySenderDestroyFunction.INSTANCE, gatewaySenderDestroyFunctionArgs, members);
 
-    CommandResult result = ResultBuilder.buildResult(functionResults);
-    XmlEntity xmlEntity = findXmlEntity(functionResults);
-
-    // no xml needs to be updated, simply return
-    if (xmlEntity == null) {
-      return result;
-    }
-
-    // has xml but unable to persist to cluster config, need to print warning message and return
-    if (onMember != null || getConfigurationPersistenceService() == null) {
-      result.setCommandPersisted(false);
-      return result;
-    }
+    ResultModel resultModel = ResultModel.createMemberStatusResult(functionResults);
+    resultModel.setConfigObject(id);
+    return resultModel;
+  }
 
-    // update cluster config
-    ((InternalConfigurationPersistenceService) getConfigurationPersistenceService())
-        .deleteXmlEntity(xmlEntity, onGroups);
-    return result;
+  @Override
+  public void updateClusterConfig(String group, CacheConfig config, Object id) {
+    config.getGatewaySenders().removeIf((sender) -> sender.getId().equals(id));
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/GatewayCommandsUtils.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/GatewayCommandsUtils.java
deleted file mode 100644
index 2e317cb..0000000
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/GatewayCommandsUtils.java
+++ /dev/null
@@ -1,29 +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.cli.commands;
-
-import org.apache.geode.management.internal.cli.result.TabularResultData;
-
-public class GatewayCommandsUtils {
-  public static void accumulateStartResult(TabularResultData resultData, String member,
-      String Status, String message) {
-    if (member != null) {
-      resultData.accumulate("Member", member);
-    }
-    resultData.accumulate("Result", Status);
-    resultData.accumulate("Message", message);
-  }
-}
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/LoadBalanceGatewaySenderCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/LoadBalanceGatewaySenderCommand.java
index 647fac6..ccb33ab 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/LoadBalanceGatewaySenderCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/LoadBalanceGatewaySenderCommand.java
@@ -27,68 +27,69 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.management.GatewaySenderMXBean;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
-import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.cli.SingleGfshCommand;
 import org.apache.geode.management.internal.SystemManagementService;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
-public class LoadBalanceGatewaySenderCommand extends InternalGfshCommand {
+public class LoadBalanceGatewaySenderCommand extends SingleGfshCommand {
 
   @CliCommand(value = CliStrings.LOAD_BALANCE_GATEWAYSENDER,
       help = CliStrings.LOAD_BALANCE_GATEWAYSENDER__HELP)
   @CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.MANAGE, target = ResourcePermission.Target.GATEWAY)
-  public Result loadBalanceGatewaySender(@CliOption(key = CliStrings.LOAD_BALANCE_GATEWAYSENDER__ID,
-      mandatory = true, optionContext = ConverterHint.GATEWAY_SENDER_ID,
-      help = CliStrings.LOAD_BALANCE_GATEWAYSENDER__ID__HELP) String senderId) {
+  public ResultModel loadBalanceGatewaySender(
+      @CliOption(key = CliStrings.LOAD_BALANCE_GATEWAYSENDER__ID,
+          mandatory = true, optionContext = ConverterHint.GATEWAY_SENDER_ID,
+          help = CliStrings.LOAD_BALANCE_GATEWAYSENDER__ID__HELP) String senderId) {
 
-    Result result;
     if (senderId != null) {
       senderId = senderId.trim();
     }
 
     Cache cache = getCache();
-    SystemManagementService service = (SystemManagementService) getManagementService();
-    TabularResultData resultData = ResultBuilder.createTabularResultData();
-    Set<DistributedMember> dsMembers = getAllNormalMembers();
+    SystemManagementService service = getManagementService();
 
+    Set<DistributedMember> dsMembers = getAllNormalMembers();
     if (dsMembers.isEmpty()) {
-      result = ResultBuilder.createInfoResult(CliStrings.GATEWAY_MSG_MEMBERS_NOT_FOUND);
-    } else {
-      boolean gatewaySenderExists = false;
-      for (DistributedMember member : dsMembers) {
-        GatewaySenderMXBean bean;
-        if (cache.getDistributedSystem().getDistributedMember().getId().equals(member.getId())) {
-          bean = service.getLocalGatewaySenderMXBean(senderId);
-        } else {
-          ObjectName objectName = service.getGatewaySenderMBeanName(member, senderId);
-          bean = service.getMBeanProxy(objectName, GatewaySenderMXBean.class);
-        }
-        if (bean != null) {
-          gatewaySenderExists = true;
-          bean.rebalance();
-          GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
-              CliStrings.GATEWAY_OK, CliStrings.format(
-                  CliStrings.GATEWAY_SENDER_0_IS_REBALANCED_ON_MEMBER_1, senderId, member.getId()));
-        } else {
-          GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
-              CliStrings.GATEWAY_ERROR,
-              CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_NOT_AVAILABLE_ON_MEMBER_1, senderId,
-                  member.getId()));
-        }
+      return ResultModel.createInfo(CliStrings.GATEWAY_MSG_MEMBERS_NOT_FOUND);
+    }
+
+    ResultModel resultModel = new ResultModel();
+    TabularResultModel resultData = resultModel.addTable(CliStrings.LOAD_BALANCE_GATEWAYSENDER);
+
+    boolean gatewaySenderExists = false;
+    for (DistributedMember member : dsMembers) {
+      GatewaySenderMXBean bean;
+      if (cache.getDistributedSystem().getDistributedMember().getId().equals(member.getId())) {
+        bean = service.getLocalGatewaySenderMXBean(senderId);
+      } else {
+        ObjectName objectName = service.getGatewaySenderMBeanName(member, senderId);
+        bean = service.getMBeanProxy(objectName, GatewaySenderMXBean.class);
       }
-      if (gatewaySenderExists) {
-        result = ResultBuilder.buildResult(resultData);
+      if (bean != null) {
+        gatewaySenderExists = true;
+        bean.rebalance();
+        resultData.addMemberStatusResultRow(member.getId(),
+            CliStrings.GATEWAY_OK, CliStrings.format(
+                CliStrings.GATEWAY_SENDER_0_IS_REBALANCED_ON_MEMBER_1, senderId, member.getId()));
       } else {
-        result = ResultBuilder.createInfoResult(CliStrings.format(
-            CliStrings.GATEWAY_SENDER_0_IS_NOT_FOUND_ON_ANY_MEMBER, new Object[] {senderId}));
+        resultData.addMemberStatusResultRow(member.getId(),
+            CliStrings.GATEWAY_ERROR,
+            CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_NOT_AVAILABLE_ON_MEMBER_1, senderId,
+                member.getId()));
       }
     }
 
-    return result;
+    if (!gatewaySenderExists) {
+      return ResultModel.createInfo(CliStrings.format(
+          CliStrings.GATEWAY_SENDER_0_IS_NOT_FOUND_ON_ANY_MEMBER, new Object[] {senderId}));
+    }
+
+    return resultModel;
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/PauseGatewaySenderCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/PauseGatewaySenderCommand.java
index 80e1f86..f7a5778 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/PauseGatewaySenderCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/PauseGatewaySenderCommand.java
@@ -27,21 +27,21 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.management.GatewaySenderMXBean;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
-import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.cli.SingleGfshCommand;
 import org.apache.geode.management.internal.SystemManagementService;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
-public class PauseGatewaySenderCommand extends InternalGfshCommand {
+public class PauseGatewaySenderCommand extends SingleGfshCommand {
 
   @CliCommand(value = CliStrings.PAUSE_GATEWAYSENDER, help = CliStrings.PAUSE_GATEWAYSENDER__HELP)
   @CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.MANAGE, target = ResourcePermission.Target.GATEWAY)
-  public Result pauseGatewaySender(@CliOption(key = CliStrings.PAUSE_GATEWAYSENDER__ID,
+  public ResultModel pauseGatewaySender(@CliOption(key = CliStrings.PAUSE_GATEWAYSENDER__ID,
       mandatory = true, optionContext = ConverterHint.GATEWAY_SENDER_ID,
       help = CliStrings.PAUSE_GATEWAYSENDER__ID__HELP) String senderId,
 
@@ -53,24 +53,21 @@ public class PauseGatewaySenderCommand extends InternalGfshCommand {
           optionContext = ConverterHint.MEMBERIDNAME,
           help = CliStrings.PAUSE_GATEWAYSENDER__MEMBER__HELP) String[] onMember) {
 
-    Result result;
     if (senderId != null) {
       senderId = senderId.trim();
     }
 
-    Cache cache = getCache();
-    SystemManagementService service = (SystemManagementService) getManagementService();
+    final Cache cache = getCache();
+    final SystemManagementService service = getManagementService();
 
     GatewaySenderMXBean bean;
-
-    TabularResultData resultData = ResultBuilder.createTabularResultData();
-
     Set<DistributedMember> dsMembers = findMembers(onGroup, onMember);
-
     if (dsMembers.isEmpty()) {
-      return ResultBuilder.createUserErrorResult(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
+      return ResultModel.createError(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
     }
 
+    ResultModel resultModel = new ResultModel();
+    TabularResultModel resultData = resultModel.addTable(CliStrings.PAUSE_GATEWAYSENDER);
     for (DistributedMember member : dsMembers) {
       if (cache.getDistributedSystem().getDistributedMember().getId().equals(member.getId())) {
         bean = service.getLocalGatewaySenderMXBean(senderId);
@@ -81,31 +78,30 @@ public class PauseGatewaySenderCommand extends InternalGfshCommand {
       if (bean != null) {
         if (bean.isRunning()) {
           if (bean.isPaused()) {
-            GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+            resultData.addMemberStatusResultRow(member.getId(),
                 CliStrings.GATEWAY_ERROR,
                 CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_ALREADY_PAUSED_ON_MEMBER_1,
                     senderId, member.getId()));
           } else {
             bean.pause();
-            GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+            resultData.addMemberStatusResultRow(member.getId(),
                 CliStrings.GATEWAY_OK, CliStrings.format(
                     CliStrings.GATEWAY_SENDER_0_IS_PAUSED_ON_MEMBER_1, senderId, member.getId()));
           }
         } else {
-          GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+          resultData.addMemberStatusResultRow(member.getId(),
               CliStrings.GATEWAY_ERROR,
               CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_NOT_RUNNING_ON_MEMBER_1, senderId,
                   member.getId()));
         }
       } else {
-        GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+        resultData.addMemberStatusResultRow(member.getId(),
             CliStrings.GATEWAY_ERROR,
             CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_NOT_AVAILABLE_ON_MEMBER_1, senderId,
                 member.getId()));
       }
     }
-    result = ResultBuilder.buildResult(resultData);
 
-    return result;
+    return resultModel;
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ResumeGatewaySenderCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ResumeGatewaySenderCommand.java
index 3203eab..41c13c3 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ResumeGatewaySenderCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/ResumeGatewaySenderCommand.java
@@ -27,21 +27,21 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.management.GatewaySenderMXBean;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
-import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.cli.SingleGfshCommand;
 import org.apache.geode.management.internal.SystemManagementService;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
-public class ResumeGatewaySenderCommand extends InternalGfshCommand {
+public class ResumeGatewaySenderCommand extends SingleGfshCommand {
 
   @CliCommand(value = CliStrings.RESUME_GATEWAYSENDER, help = CliStrings.RESUME_GATEWAYSENDER__HELP)
   @CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.MANAGE, target = ResourcePermission.Target.GATEWAY)
-  public Result resumeGatewaySender(@CliOption(key = CliStrings.RESUME_GATEWAYSENDER__ID,
+  public ResultModel resumeGatewaySender(@CliOption(key = CliStrings.RESUME_GATEWAYSENDER__ID,
       mandatory = true, optionContext = ConverterHint.GATEWAY_SENDER_ID,
       help = CliStrings.RESUME_GATEWAYSENDER__ID__HELP) String senderId,
 
@@ -52,24 +52,21 @@ public class ResumeGatewaySenderCommand extends InternalGfshCommand {
           optionContext = ConverterHint.MEMBERIDNAME,
           help = CliStrings.RESUME_GATEWAYSENDER__MEMBER__HELP) String[] onMember) {
 
-    Result result;
     if (senderId != null) {
       senderId = senderId.trim();
     }
 
-    Cache cache = getCache();
-    SystemManagementService service = (SystemManagementService) getManagementService();
-
-    GatewaySenderMXBean bean;
-
-    TabularResultData resultData = ResultBuilder.createTabularResultData();
+    final Cache cache = getCache();
+    final SystemManagementService service = getManagementService();
 
     Set<DistributedMember> dsMembers = findMembers(onGroup, onMember);
-
     if (dsMembers.isEmpty()) {
-      return ResultBuilder.createUserErrorResult(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
+      return ResultModel.createError(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
     }
 
+    GatewaySenderMXBean bean;
+    ResultModel resultModel = new ResultModel();
+    TabularResultModel resultData = resultModel.addTable(CliStrings.RESUME_GATEWAYSENDER);
     for (DistributedMember member : dsMembers) {
       if (cache.getDistributedSystem().getDistributedMember().getId().equals(member.getId())) {
         bean = service.getLocalGatewaySenderMXBean(senderId);
@@ -81,30 +78,29 @@ public class ResumeGatewaySenderCommand extends InternalGfshCommand {
         if (bean.isRunning()) {
           if (bean.isPaused()) {
             bean.resume();
-            GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+            resultData.addMemberStatusResultRow(member.getId(),
                 CliStrings.GATEWAY_OK, CliStrings.format(
                     CliStrings.GATEWAY_SENDER_0_IS_RESUMED_ON_MEMBER_1, senderId, member.getId()));
           } else {
-            GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+            resultData.addMemberStatusResultRow(member.getId(),
                 CliStrings.GATEWAY_ERROR,
                 CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_NOT_PAUSED_ON_MEMBER_1, senderId,
                     member.getId()));
           }
         } else {
-          GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+          resultData.addMemberStatusResultRow(member.getId(),
               CliStrings.GATEWAY_ERROR,
               CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_NOT_RUNNING_ON_MEMBER_1, senderId,
                   member.getId()));
         }
       } else {
-        GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+        resultData.addMemberStatusResultRow(member.getId(),
             CliStrings.GATEWAY_ERROR,
             CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_NOT_AVAILABLE_ON_MEMBER_1, senderId,
                 member.getId()));
       }
     }
-    result = ResultBuilder.buildResult(resultData);
 
-    return result;
+    return resultModel;
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartGatewayReceiverCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartGatewayReceiverCommand.java
index abf6e04..73936b4 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartGatewayReceiverCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartGatewayReceiverCommand.java
@@ -26,23 +26,23 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.management.GatewayReceiverMXBean;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
-import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.cli.SingleGfshCommand;
 import org.apache.geode.management.internal.MBeanJMXAdapter;
 import org.apache.geode.management.internal.SystemManagementService;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
-public class StartGatewayReceiverCommand extends InternalGfshCommand {
+public class StartGatewayReceiverCommand extends SingleGfshCommand {
 
   @CliCommand(value = CliStrings.START_GATEWAYRECEIVER,
       help = CliStrings.START_GATEWAYRECEIVER__HELP)
   @CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.MANAGE, target = ResourcePermission.Target.GATEWAY)
-  public Result startGatewayReceiver(@CliOption(key = {CliStrings.GROUP, CliStrings.GROUPS},
+  public ResultModel startGatewayReceiver(@CliOption(key = {CliStrings.GROUP, CliStrings.GROUPS},
       optionContext = ConverterHint.MEMBERGROUP,
       help = CliStrings.START_GATEWAYRECEIVER__GROUP__HELP) String[] onGroup,
 
@@ -50,20 +50,17 @@ public class StartGatewayReceiverCommand extends InternalGfshCommand {
           optionContext = ConverterHint.MEMBERIDNAME,
           help = CliStrings.START_GATEWAYRECEIVER__MEMBER__HELP) String[] onMember)
       throws Exception {
-    Result result;
-
-    SystemManagementService service = (SystemManagementService) getManagementService();
+    SystemManagementService service = getManagementService();
 
     GatewayReceiverMXBean receiverBean;
-
-    TabularResultData resultData = ResultBuilder.createTabularResultData();
-
     Set<DistributedMember> dsMembers = findMembers(onGroup, onMember);
 
     if (dsMembers.isEmpty()) {
-      return ResultBuilder.createUserErrorResult(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
+      return ResultModel.createError(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
     }
 
+    ResultModel resultModel = new ResultModel();
+    TabularResultModel resultData = resultModel.addTable(CliStrings.START_GATEWAYRECEIVER);
     for (DistributedMember member : dsMembers) {
       ObjectName gatewayReceiverObjectName = MBeanJMXAdapter.getGatewayReceiverMBeanName(member);
 
@@ -72,32 +69,31 @@ public class StartGatewayReceiverCommand extends InternalGfshCommand {
             service.getMBeanProxy(gatewayReceiverObjectName, GatewayReceiverMXBean.class);
         if (receiverBean != null) {
           if (receiverBean.isRunning()) {
-            GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+            resultData.addMemberStatusResultRow(member.getId(),
                 CliStrings.GATEWAY_ERROR,
                 CliStrings.format(CliStrings.GATEWAY_RECEIVER_IS_ALREADY_STARTED_ON_MEMBER_0,
                     new Object[] {member.getId()}));
           } else {
             receiverBean.start();
-            GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+            resultData.addMemberStatusResultRow(member.getId(),
                 CliStrings.GATEWAY_OK,
                 CliStrings.format(CliStrings.GATEWAY_RECEIVER_IS_STARTED_ON_MEMBER_0,
                     new Object[] {member.getId()}));
           }
         } else {
-          GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+          resultData.addMemberStatusResultRow(member.getId(),
               CliStrings.GATEWAY_ERROR,
               CliStrings.format(CliStrings.GATEWAY_RECEIVER_IS_NOT_AVAILABLE_ON_MEMBER_0,
                   new Object[] {member.getId()}));
         }
       } else {
-        GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+        resultData.addMemberStatusResultRow(member.getId(),
             CliStrings.GATEWAY_ERROR,
             CliStrings.format(CliStrings.GATEWAY_RECEIVER_IS_NOT_AVAILABLE_ON_MEMBER_0,
                 new Object[] {member.getId()}));
       }
     }
-    result = ResultBuilder.buildResult(resultData);
 
-    return result;
+    return resultModel;
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartGatewaySenderCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartGatewaySenderCommand.java
index a3c466f..f8923bf 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartGatewaySenderCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StartGatewaySenderCommand.java
@@ -35,21 +35,21 @@ import org.apache.geode.internal.logging.LoggingExecutors;
 import org.apache.geode.management.GatewaySenderMXBean;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
-import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.cli.SingleGfshCommand;
 import org.apache.geode.management.internal.SystemManagementService;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
-public class StartGatewaySenderCommand extends InternalGfshCommand {
+public class StartGatewaySenderCommand extends SingleGfshCommand {
 
   @CliCommand(value = CliStrings.START_GATEWAYSENDER, help = CliStrings.START_GATEWAYSENDER__HELP)
   @CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.MANAGE, target = ResourcePermission.Target.GATEWAY)
-  public Result startGatewaySender(@CliOption(key = CliStrings.START_GATEWAYSENDER__ID,
+  public ResultModel startGatewaySender(@CliOption(key = CliStrings.START_GATEWAYSENDER__ID,
       mandatory = true, optionContext = ConverterHint.GATEWAY_SENDER_ID,
       help = CliStrings.START_GATEWAYSENDER__ID__HELP) String senderId,
 
@@ -61,18 +61,15 @@ public class StartGatewaySenderCommand extends InternalGfshCommand {
           optionContext = ConverterHint.MEMBERIDNAME,
           help = CliStrings.START_GATEWAYSENDER__MEMBER__HELP) String[] onMember) {
 
-    Result result;
     final String id = senderId.trim();
 
     final Cache cache = getCache();
-    final SystemManagementService service = (SystemManagementService) getManagementService();
-
-    TabularResultData resultData = ResultBuilder.createTabularResultData();
+    final SystemManagementService service = getManagementService();
 
     Set<DistributedMember> dsMembers = findMembers(onGroup, onMember);
 
     if (dsMembers.isEmpty()) {
-      return ResultBuilder.createUserErrorResult(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
+      return ResultModel.createError(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
     }
 
     ExecutorService execService =
@@ -117,33 +114,36 @@ public class StartGatewaySenderCommand extends InternalGfshCommand {
     }
 
     Iterator<DistributedMember> memberIterator = dsMembers.iterator();
-    List<Future<List>> futures = null;
+    List<Future<List>> futures;
 
     try {
       futures = execService.invokeAll(callables);
     } catch (InterruptedException ite) {
-      GatewayCommandsUtils.accumulateStartResult(resultData, null, CliStrings.GATEWAY_ERROR,
+      return ResultModel.createError(
           CliStrings.format(CliStrings.GATEWAY_SENDER_0_COULD_NOT_BE_INVOKED_DUE_TO_1, id,
               ite.getMessage()));
+    } finally {
+      execService.shutdown();
     }
 
+    ResultModel resultModel = new ResultModel();
+    TabularResultModel resultData = resultModel.addTable(CliStrings.START_GATEWAYSENDER);
     for (Future<List> future : futures) {
       DistributedMember member = memberIterator.next();
       List<String> memberStatus;
       try {
         memberStatus = future.get();
-        GatewayCommandsUtils.accumulateStartResult(resultData, memberStatus.get(0),
+        resultData.addMemberStatusResultRow(memberStatus.get(0),
             memberStatus.get(1), memberStatus.get(2));
       } catch (InterruptedException | ExecutionException ite) {
-        GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+        resultData.addMemberStatusResultRow(member.getId(),
             CliStrings.GATEWAY_ERROR,
             CliStrings.format(CliStrings.GATEWAY_SENDER_0_COULD_NOT_BE_STARTED_ON_MEMBER_DUE_TO_1,
                 id, ite.getMessage()));
       }
     }
     execService.shutdown();
-    result = ResultBuilder.buildResult(resultData);
 
-    return result;
+    return resultModel;
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StatusGatewayReceiverCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StatusGatewayReceiverCommand.java
index 892b121..aea698f 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StatusGatewayReceiverCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StatusGatewayReceiverCommand.java
@@ -26,23 +26,22 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.management.GatewayReceiverMXBean;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
-import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.cli.SingleGfshCommand;
 import org.apache.geode.management.internal.MBeanJMXAdapter;
 import org.apache.geode.management.internal.SystemManagementService;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.CompositeResultData;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
-public class StatusGatewayReceiverCommand extends InternalGfshCommand {
+public class StatusGatewayReceiverCommand extends SingleGfshCommand {
   @CliCommand(value = CliStrings.STATUS_GATEWAYRECEIVER,
       help = CliStrings.STATUS_GATEWAYRECEIVER__HELP)
   @CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.READ)
-  public Result statusGatewayReceiver(@CliOption(key = {CliStrings.GROUP, CliStrings.GROUPS},
+  public ResultModel statusGatewayReceiver(@CliOption(key = {CliStrings.GROUP, CliStrings.GROUPS},
       optionContext = ConverterHint.MEMBERGROUP,
       help = CliStrings.STATUS_GATEWAYRECEIVER__GROUP__HELP) String[] onGroup,
 
@@ -50,25 +49,20 @@ public class StatusGatewayReceiverCommand extends InternalGfshCommand {
           optionContext = ConverterHint.MEMBERIDNAME,
           help = CliStrings.STATUS_GATEWAYRECEIVER__MEMBER__HELP) String[] onMember) {
 
-    Result result;
-
-    SystemManagementService service = (SystemManagementService) getManagementService();
-
-    CompositeResultData crd = ResultBuilder.createCompositeResultData();
-    TabularResultData availableReceiverData =
-        crd.addSection(CliStrings.SECTION_GATEWAY_RECEIVER_AVAILABLE)
-            .addTable(CliStrings.TABLE_GATEWAY_RECEIVER);
-
-    TabularResultData notAvailableReceiverData =
-        crd.addSection(CliStrings.SECTION_GATEWAY_RECEIVER_NOT_AVAILABLE)
-            .addTable(CliStrings.TABLE_GATEWAY_RECEIVER);
+    SystemManagementService service = getManagementService();
 
     Set<DistributedMember> dsMembers = findMembers(onGroup, onMember);
-
     if (dsMembers.isEmpty()) {
-      return ResultBuilder.createUserErrorResult(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
+      return ResultModel.createError(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
     }
 
+    ResultModel crd = new ResultModel();
+    TabularResultModel availableReceiverData =
+        crd.addTable(CliStrings.SECTION_GATEWAY_RECEIVER_AVAILABLE);
+
+    TabularResultModel notAvailableReceiverData =
+        crd.addTable(CliStrings.SECTION_GATEWAY_RECEIVER_NOT_AVAILABLE);
+
     for (DistributedMember member : dsMembers) {
       ObjectName gatewayReceiverObjectName = MBeanJMXAdapter.getGatewayReceiverMBeanName(member);
       if (gatewayReceiverObjectName != null) {
@@ -81,16 +75,15 @@ public class StatusGatewayReceiverCommand extends InternalGfshCommand {
       }
       buildReceiverStatus(member.getId(), null, notAvailableReceiverData);
     }
-    result = ResultBuilder.buildResult(crd);
 
-    return result;
+    return crd;
   }
 
-  private TabularResultData buildReceiverStatus(String memberId, GatewayReceiverMXBean bean,
-      TabularResultData resultData) {
+  private TabularResultModel buildReceiverStatus(String memberId, GatewayReceiverMXBean bean,
+      TabularResultModel resultData) {
     resultData.accumulate(CliStrings.RESULT_HOST_MEMBER, memberId);
     if (bean != null) {
-      resultData.accumulate(CliStrings.RESULT_PORT, bean.getPort());
+      resultData.accumulate(CliStrings.RESULT_PORT, Integer.toString(bean.getPort()));
       resultData.accumulate(CliStrings.RESULT_STATUS,
           bean.isRunning() ? CliStrings.GATEWAY_RUNNING : CliStrings.GATEWAY_NOT_RUNNING);
     } else {
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StatusGatewaySenderCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StatusGatewaySenderCommand.java
index 650bbe6..cb07ec3 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StatusGatewaySenderCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StatusGatewaySenderCommand.java
@@ -27,21 +27,20 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.management.GatewaySenderMXBean;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
-import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.cli.SingleGfshCommand;
 import org.apache.geode.management.internal.SystemManagementService;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.CompositeResultData;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
-public class StatusGatewaySenderCommand extends InternalGfshCommand {
+public class StatusGatewaySenderCommand extends SingleGfshCommand {
   @CliCommand(value = CliStrings.STATUS_GATEWAYSENDER, help = CliStrings.STATUS_GATEWAYSENDER__HELP)
   @CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.READ)
-  public Result statusGatewaySender(@CliOption(key = CliStrings.STATUS_GATEWAYSENDER__ID,
+  public ResultModel statusGatewaySender(@CliOption(key = CliStrings.STATUS_GATEWAYSENDER__ID,
       mandatory = true, optionContext = ConverterHint.GATEWAY_SENDER_ID,
       help = CliStrings.STATUS_GATEWAYSENDER__ID__HELP) String senderId,
 
@@ -53,31 +52,28 @@ public class StatusGatewaySenderCommand extends InternalGfshCommand {
           optionContext = ConverterHint.MEMBERIDNAME,
           help = CliStrings.STATUS_GATEWAYSENDER__MEMBER__HELP) String[] onMember) {
 
-    Result result;
     if (senderId != null) {
       senderId = senderId.trim();
     }
 
     Cache cache = getCache();
-    SystemManagementService service = (SystemManagementService) getManagementService();
+    SystemManagementService service = getManagementService();
 
     GatewaySenderMXBean bean;
 
-    CompositeResultData crd = ResultBuilder.createCompositeResultData();
-    TabularResultData availableSenderData =
-        crd.addSection(CliStrings.SECTION_GATEWAY_SENDER_AVAILABLE)
-            .addTable(CliStrings.TABLE_GATEWAY_SENDER);
-
-    TabularResultData notAvailableSenderData =
-        crd.addSection(CliStrings.SECTION_GATEWAY_SENDER_NOT_AVAILABLE)
-            .addTable(CliStrings.TABLE_GATEWAY_SENDER);
-
+    ResultModel crd = new ResultModel();
     Set<DistributedMember> dsMembers = findMembers(onGroup, onMember);
 
     if (dsMembers.isEmpty()) {
-      return ResultBuilder.createUserErrorResult(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
+      return ResultModel.createError(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
     }
 
+    TabularResultModel availableSenderData =
+        crd.addTable(CliStrings.SECTION_GATEWAY_SENDER_AVAILABLE);
+
+    TabularResultModel notAvailableSenderData =
+        crd.addTable(CliStrings.SECTION_GATEWAY_SENDER_NOT_AVAILABLE);
+
     for (DistributedMember member : dsMembers) {
       if (cache.getDistributedSystem().getDistributedMember().getId().equals(member.getId())) {
         bean = service.getLocalGatewaySenderMXBean(senderId);
@@ -91,12 +87,12 @@ public class StatusGatewaySenderCommand extends InternalGfshCommand {
         buildSenderStatus(member.getId(), bean, notAvailableSenderData);
       }
     }
-    result = ResultBuilder.buildResult(crd);
-    return result;
+
+    return crd;
   }
 
-  private TabularResultData buildSenderStatus(String memberId, GatewaySenderMXBean bean,
-      TabularResultData resultData) {
+  private TabularResultModel buildSenderStatus(String memberId, GatewaySenderMXBean bean,
+      TabularResultModel resultData) {
     resultData.accumulate(CliStrings.RESULT_HOST_MEMBER, memberId);
     if (bean != null) {
       resultData.accumulate(CliStrings.RESULT_TYPE,
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StopGatewayReceiverCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StopGatewayReceiverCommand.java
index 7fb20aa..8c5a046 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StopGatewayReceiverCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StopGatewayReceiverCommand.java
@@ -26,21 +26,21 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.management.GatewayReceiverMXBean;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
-import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.cli.SingleGfshCommand;
 import org.apache.geode.management.internal.MBeanJMXAdapter;
 import org.apache.geode.management.internal.SystemManagementService;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
-public class StopGatewayReceiverCommand extends InternalGfshCommand {
+public class StopGatewayReceiverCommand extends SingleGfshCommand {
   @CliCommand(value = CliStrings.STOP_GATEWAYRECEIVER, help = CliStrings.STOP_GATEWAYRECEIVER__HELP)
   @CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.MANAGE, target = ResourcePermission.Target.GATEWAY)
-  public Result stopGatewayReceiver(@CliOption(key = {CliStrings.GROUP, CliStrings.GROUPS},
+  public ResultModel stopGatewayReceiver(@CliOption(key = {CliStrings.GROUP, CliStrings.GROUPS},
       optionContext = ConverterHint.MEMBERGROUP,
       help = CliStrings.STOP_GATEWAYRECEIVER__GROUP__HELP) String[] onGroup,
 
@@ -49,20 +49,17 @@ public class StopGatewayReceiverCommand extends InternalGfshCommand {
           help = CliStrings.STOP_GATEWAYRECEIVER__MEMBER__HELP) String[] onMember)
       throws Exception {
 
-    Result result;
-
-    SystemManagementService service = (SystemManagementService) getManagementService();
+    SystemManagementService service = getManagementService();
 
     GatewayReceiverMXBean receiverBean;
 
-    TabularResultData resultData = ResultBuilder.createTabularResultData();
-
     Set<DistributedMember> dsMembers = findMembers(onGroup, onMember);
-
     if (dsMembers.isEmpty()) {
-      return ResultBuilder.createUserErrorResult(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
+      return ResultModel.createError(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
     }
 
+    ResultModel resultModel = new ResultModel();
+    TabularResultModel resultData = resultModel.addTable(CliStrings.STOP_GATEWAYRECEIVER);
     for (DistributedMember member : dsMembers) {
       ObjectName gatewayReceiverObjectName = MBeanJMXAdapter.getGatewayReceiverMBeanName(member);
 
@@ -72,31 +69,30 @@ public class StopGatewayReceiverCommand extends InternalGfshCommand {
         if (receiverBean != null) {
           if (receiverBean.isRunning()) {
             receiverBean.stop();
-            GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+            resultData.addMemberStatusResultRow(member.getId(),
                 CliStrings.GATEWAY_OK,
                 CliStrings.format(CliStrings.GATEWAY_RECEIVER_IS_STOPPED_ON_MEMBER_0,
                     new Object[] {member.getId()}));
           } else {
-            GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+            resultData.addMemberStatusResultRow(member.getId(),
                 CliStrings.GATEWAY_ERROR,
                 CliStrings.format(CliStrings.GATEWAY_RECEIVER_IS_NOT_RUNNING_ON_MEMBER_0,
                     new Object[] {member.getId()}));
           }
         } else {
-          GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+          resultData.addMemberStatusResultRow(member.getId(),
               CliStrings.GATEWAY_ERROR,
               CliStrings.format(CliStrings.GATEWAY_RECEIVER_IS_NOT_AVAILABLE_ON_MEMBER_0,
                   new Object[] {member.getId()}));
         }
       } else {
-        GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+        resultData.addMemberStatusResultRow(member.getId(),
             CliStrings.GATEWAY_ERROR,
             CliStrings.format(CliStrings.GATEWAY_RECEIVER_IS_NOT_AVAILABLE_ON_MEMBER_0,
                 new Object[] {member.getId()}));
       }
     }
-    result = ResultBuilder.buildResult(resultData);
 
-    return result;
+    return resultModel;
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StopGatewaySenderCommand.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StopGatewaySenderCommand.java
index f340e4e..6113933 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StopGatewaySenderCommand.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/commands/StopGatewaySenderCommand.java
@@ -27,21 +27,21 @@ import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.management.GatewaySenderMXBean;
 import org.apache.geode.management.cli.CliMetaData;
 import org.apache.geode.management.cli.ConverterHint;
-import org.apache.geode.management.cli.Result;
+import org.apache.geode.management.cli.SingleGfshCommand;
 import org.apache.geode.management.internal.SystemManagementService;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.cli.result.ResultBuilder;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.management.internal.security.ResourceOperation;
 import org.apache.geode.security.ResourcePermission;
 
-public class StopGatewaySenderCommand extends InternalGfshCommand {
+public class StopGatewaySenderCommand extends SingleGfshCommand {
 
   @CliCommand(value = CliStrings.STOP_GATEWAYSENDER, help = CliStrings.STOP_GATEWAYSENDER__HELP)
   @CliMetaData(relatedTopic = CliStrings.TOPIC_GEODE_WAN)
   @ResourceOperation(resource = ResourcePermission.Resource.CLUSTER,
       operation = ResourcePermission.Operation.MANAGE, target = ResourcePermission.Target.GATEWAY)
-  public Result stopGatewaySender(@CliOption(key = CliStrings.STOP_GATEWAYSENDER__ID,
+  public ResultModel stopGatewaySender(@CliOption(key = CliStrings.STOP_GATEWAYSENDER__ID,
       mandatory = true, optionContext = ConverterHint.GATEWAY_SENDER_ID,
       help = CliStrings.STOP_GATEWAYSENDER__ID__HELP) String senderId,
 
@@ -53,24 +53,22 @@ public class StopGatewaySenderCommand extends InternalGfshCommand {
           optionContext = ConverterHint.MEMBERIDNAME,
           help = CliStrings.STOP_GATEWAYSENDER__MEMBER__HELP) String[] onMember) {
 
-    Result result;
     if (senderId != null) {
       senderId = senderId.trim();
     }
 
     InternalCache cache = (InternalCache) getCache();
-    SystemManagementService service = (SystemManagementService) getManagementService();
+    SystemManagementService service = getManagementService();
 
     GatewaySenderMXBean bean;
 
-    TabularResultData resultData = ResultBuilder.createTabularResultData();
-
     Set<DistributedMember> dsMembers = findMembers(onGroup, onMember);
-
     if (dsMembers.isEmpty()) {
-      return ResultBuilder.createUserErrorResult(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
+      return ResultModel.createError(CliStrings.NO_MEMBERS_FOUND_MESSAGE);
     }
 
+    ResultModel resultModel = new ResultModel();
+    TabularResultModel resultData = resultModel.addTable(CliStrings.STOP_GATEWAYSENDER);
     for (DistributedMember member : dsMembers) {
       if (cache.getDistributedSystem().getDistributedMember().getId().equals(member.getId())) {
         bean = service.getLocalGatewaySenderMXBean(senderId);
@@ -81,25 +79,24 @@ public class StopGatewaySenderCommand extends InternalGfshCommand {
       if (bean != null) {
         if (bean.isRunning()) {
           bean.stop();
-          GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+          resultData.addMemberStatusResultRow(member.getId(),
               CliStrings.GATEWAY_OK, CliStrings.format(
                   CliStrings.GATEWAY_SENDER_0_IS_STOPPED_ON_MEMBER_1, senderId, member.getId()));
 
         } else {
-          GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+          resultData.addMemberStatusResultRow(member.getId(),
               CliStrings.GATEWAY_ERROR,
               CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_NOT_RUNNING_ON_MEMBER_1, senderId,
                   member.getId()));
         }
       } else {
-        GatewayCommandsUtils.accumulateStartResult(resultData, member.getId(),
+        resultData.addMemberStatusResultRow(member.getId(),
             CliStrings.GATEWAY_ERROR,
             CliStrings.format(CliStrings.GATEWAY_SENDER_0_IS_NOT_AVAILABLE_ON_MEMBER_1, senderId,
                 member.getId()));
       }
     }
-    result = ResultBuilder.buildResult(resultData);
 
-    return result;
+    return resultModel;
   }
 }
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 0a0a2e9..f37a46e 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
@@ -60,7 +60,7 @@ public class GatewayReceiverCreateFunction implements InternalFunction {
     if (gatewayReceiverExists(cache)) {
       CliFunctionResult result;
       if (gatewayReceiverCreateArgs.getIfNotExists()) {
-        result = new CliFunctionResult(memberNameOrId, true,
+        result = new CliFunctionResult(memberNameOrId, CliFunctionResult.StatusState.OK,
             "Skipping: " + A_GATEWAY_RECEIVER_ALREADY_EXISTS_ON_THIS_MEMBER);
       } else {
         Exception illegalState =
@@ -76,7 +76,8 @@ public class GatewayReceiverCreateFunction implements InternalFunction {
       GatewayReceiver createdGatewayReceiver =
           createGatewayReceiver(cache, gatewayReceiverCreateArgs);
 
-      resultSender.lastResult(new CliFunctionResult(memberNameOrId, true,
+      resultSender.lastResult(new CliFunctionResult(memberNameOrId,
+          CliFunctionResult.StatusState.OK,
           CliStrings.format(
               CliStrings.CREATE_GATEWAYRECEIVER__MSG__GATEWAYRECEIVER_CREATED_ON_0_ONPORT_1,
               memberNameOrId, Integer.toString(createdGatewayReceiver.getPort()))));
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GatewaySenderCreateFunction.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GatewaySenderCreateFunction.java
index 9945da9..d1942fb 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GatewaySenderCreateFunction.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GatewaySenderCreateFunction.java
@@ -14,6 +14,8 @@
  */
 package org.apache.geode.management.internal.cli.functions;
 
+import java.util.List;
+
 import org.apache.logging.log4j.Logger;
 
 import org.apache.geode.cache.Cache;
@@ -26,10 +28,8 @@ import org.apache.geode.cache.wan.GatewaySenderFactory;
 import org.apache.geode.cache.wan.GatewayTransportFilter;
 import org.apache.geode.internal.ClassPathLoader;
 import org.apache.geode.internal.cache.execute.InternalFunction;
-import org.apache.geode.internal.cache.xmlcache.CacheXml;
 import org.apache.geode.internal.logging.LogService;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.configuration.domain.XmlEntity;
 
 public class GatewaySenderCreateFunction implements InternalFunction {
 
@@ -54,10 +54,9 @@ public class GatewaySenderCreateFunction implements InternalFunction {
 
     try {
       GatewaySender createdGatewaySender = createGatewaySender(cache, gatewaySenderCreateArgs);
-      XmlEntity xmlEntity =
-          new XmlEntity(CacheXml.GATEWAY_SENDER, "id", gatewaySenderCreateArgs.getId());
-      resultSender.lastResult(new CliFunctionResult(memberNameOrId, xmlEntity,
-          CliStrings.format(CliStrings.CREATE_GATEWAYSENDER__MSG__GATEWAYSENDER_0_CREATED_ON_1,
+      resultSender.lastResult(new CliFunctionResult(memberNameOrId,
+          CliFunctionResult.StatusState.OK, CliStrings.format(
+              CliStrings.CREATE_GATEWAYSENDER__MSG__GATEWAYSENDER_0_CREATED_ON_1,
               new Object[] {createdGatewaySender.getId(), memberNameOrId})));
     } catch (Exception e) {
       logger.error(e.getMessage(), e);
@@ -141,7 +140,7 @@ public class GatewaySenderCreateFunction implements InternalFunction {
       gateway.setDiskSynchronous(isDiskSynchronous);
     }
 
-    String[] gatewayEventFilters = gatewaySenderCreateArgs.getGatewayEventFilter();
+    List<String> gatewayEventFilters = gatewaySenderCreateArgs.getGatewayEventFilter();
     if (gatewayEventFilters != null) {
       for (String gatewayEventFilter : gatewayEventFilters) {
         Class gatewayEventFilterKlass =
@@ -151,7 +150,7 @@ public class GatewaySenderCreateFunction implements InternalFunction {
       }
     }
 
-    String[] gatewayTransportFilters = gatewaySenderCreateArgs.getGatewayTransportFilter();
+    List<String> gatewayTransportFilters = gatewaySenderCreateArgs.getGatewayTransportFilter();
     if (gatewayTransportFilters != null) {
       for (String gatewayTransportFilter : gatewayTransportFilters) {
         Class gatewayTransportFilterKlass = forName(gatewayTransportFilter,
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GatewaySenderFunctionArgs.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GatewaySenderFunctionArgs.java
index 0e4f635..3a59b82 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GatewaySenderFunctionArgs.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/functions/GatewaySenderFunctionArgs.java
@@ -15,10 +15,16 @@
 package org.apache.geode.management.internal.cli.functions;
 
 import java.io.Serializable;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import org.apache.geode.cache.configuration.CacheConfig;
+import org.apache.geode.cache.configuration.DeclarableType;
 
 
 public class GatewaySenderFunctionArgs implements Serializable {
-  private static final long serialVersionUID = -5158224572470173267L;
+  private static final long serialVersionUID = 4636678328980816780L;
 
   private final String id;
   private final Integer remoteDSId;
@@ -37,34 +43,42 @@ public class GatewaySenderFunctionArgs implements Serializable {
   private final Integer dispatcherThreads;
   private final String orderPolicy;
   // array of fully qualified class names of the filters
-  private final String[] gatewayEventFilters;
-  private final String[] gatewayTransportFilters;
-
-  public GatewaySenderFunctionArgs(String id, Integer remoteDSId, Boolean parallel,
-      Boolean manualStart, Integer socketBufferSize, Integer socketReadTimeout,
-      Boolean enableBatchConflation, Integer batchSize, Integer batchTimeInterval,
-      Boolean enablePersistence, String diskStoreName, Boolean diskSynchronous,
-      Integer maxQueueMemory, Integer alertThreshold, Integer dispatcherThreads, String orderPolicy,
-      String[] gatewayEventFilters, String[] gatewayTransportFilters) {
-
-    this.id = id;
-    this.remoteDSId = remoteDSId;
-    this.parallel = parallel;
-    this.manualStart = manualStart;
-    this.socketBufferSize = socketBufferSize;
-    this.socketReadTimeout = socketReadTimeout;
-    this.enableBatchConflation = enableBatchConflation;
-    this.batchSize = batchSize;
-    this.batchTimeInterval = batchTimeInterval;
-    this.enablePersistence = enablePersistence;
-    this.diskStoreName = diskStoreName;
-    this.diskSynchronous = diskSynchronous;
-    this.maxQueueMemory = maxQueueMemory;
-    this.alertThreshold = alertThreshold;
-    this.dispatcherThreads = dispatcherThreads;
-    this.orderPolicy = orderPolicy;
-    this.gatewayEventFilters = gatewayEventFilters;
-    this.gatewayTransportFilters = gatewayTransportFilters;
+  private final List<String> gatewayEventFilters;
+  private final List<String> gatewayTransportFilters;
+
+  public GatewaySenderFunctionArgs(CacheConfig.GatewaySender sender) {
+    this.id = sender.getId();
+    this.remoteDSId = string2int(sender.getRemoteDistributedSystemId());
+    this.parallel = sender.isParallel();
+    this.manualStart = sender.isManualStart();
+    this.socketBufferSize = string2int(sender.getSocketBufferSize());
+    this.socketReadTimeout = string2int(sender.getSocketReadTimeout());
+    this.enableBatchConflation = sender.isEnableBatchConflation();
+    this.batchSize = string2int(sender.getBatchSize());
+    this.batchTimeInterval = string2int(sender.getBatchTimeInterval());
+    this.enablePersistence = sender.isEnablePersistence();
+    this.diskStoreName = sender.getDiskStoreName();
+    this.diskSynchronous = sender.isDiskSynchronous();
+    this.maxQueueMemory = string2int(sender.getMaximumQueueMemory());
+    this.alertThreshold = string2int(sender.getAlertThreshold());
+    this.dispatcherThreads = string2int(sender.getDispatcherThreads());
+    this.orderPolicy = sender.getOrderPolicy();
+    this.gatewayEventFilters =
+        Optional.of(sender.getGatewayEventFilters())
+            .map(filters -> filters
+                .stream().map(DeclarableType::getClassName)
+                .collect(Collectors.toList()))
+            .orElse(null);
+    this.gatewayTransportFilters =
+        Optional.of(sender.getGatewayTransportFilters())
+            .map(filters -> filters
+                .stream().map(DeclarableType::getClassName)
+                .collect(Collectors.toList()))
+            .orElse(null);
+  }
+
+  private Integer string2int(String x) {
+    return Optional.ofNullable(x).map(Integer::valueOf).orElse(null);
   }
 
   public String getId() {
@@ -131,11 +145,11 @@ public class GatewaySenderFunctionArgs implements Serializable {
     return this.orderPolicy;
   }
 
-  public String[] getGatewayEventFilter() {
+  public List<String> getGatewayEventFilter() {
     return this.gatewayEventFilters;
   }
 
-  public String[] getGatewayTransportFilter() {
+  public List<String> getGatewayTransportFilter() {
     return this.gatewayTransportFilters;
   }
 }
diff --git a/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/model/TabularResultModel.java b/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/model/TabularResultModel.java
index 9bd5fe5..47e2d19 100644
--- a/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/model/TabularResultModel.java
+++ b/geode-core/src/main/java/org/apache/geode/management/internal/cli/result/model/TabularResultModel.java
@@ -43,6 +43,14 @@ public class TabularResultModel extends AbstractResultModel {
     return this;
   }
 
+  public void addMemberStatusResultRow(String member, String result, String message) {
+    if (member != null) {
+      accumulate("Member", member);
+    }
+    accumulate("Result", result);
+    accumulate("Message", message);
+  }
+
   @Override
   public Map<String, List<String>> getContent() {
     return table;
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 e9874d0..6987220 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
@@ -561,7 +561,7 @@ org/apache/geode/management/internal/cli/functions/GatewayReceiverFunctionArgs,t
 org/apache/geode/management/internal/cli/functions/GatewaySenderCreateFunction,true,8746830191680509335
 org/apache/geode/management/internal/cli/functions/GatewaySenderDestroyFunction,true,1
 org/apache/geode/management/internal/cli/functions/GatewaySenderDestroyFunctionArgs,true,3848480256348119530,id:java/lang/String,ifExists:boolean
-org/apache/geode/management/internal/cli/functions/GatewaySenderFunctionArgs,true,-5158224572470173267,alertThreshold:java/lang/Integer,batchSize:java/lang/Integer,batchTimeInterval:java/lang/Integer,diskStoreName:java/lang/String,diskSynchronous:java/lang/Boolean,dispatcherThreads:java/lang/Integer,enableBatchConflation:java/lang/Boolean,enablePersistence:java/lang/Boolean,gatewayEventFilters:java/lang/String[],gatewayTransportFilters:java/lang/String[],id:java/lang/String,manualStart:j [...]
+org/apache/geode/management/internal/cli/functions/GatewaySenderFunctionArgs,true,4636678328980816780,alertThreshold:java/lang/Integer,batchSize:java/lang/Integer,batchTimeInterval:java/lang/Integer,diskStoreName:java/lang/String,diskSynchronous:java/lang/Boolean,dispatcherThreads:java/lang/Integer,enableBatchConflation:java/lang/Boolean,enablePersistence:java/lang/Boolean,gatewayEventFilters:java/util/List,gatewayTransportFilters:java/util/List,id:java/lang/String,manualStart:java/lang/ [...]
 org/apache/geode/management/internal/cli/functions/GetMemberConfigInformationFunction,true,1
 org/apache/geode/management/internal/cli/functions/GetMemberInformationFunction,true,1
 org/apache/geode/management/internal/cli/functions/GetRegionDescriptionFunction,true,1
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateGatewaySenderCommandTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateGatewaySenderCommandTest.java
index c15ae97..8e0567a 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateGatewaySenderCommandTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/CreateGatewaySenderCommandTest.java
@@ -19,7 +19,6 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 
@@ -32,15 +31,18 @@ import java.util.Set;
 import org.junit.Before;
 import org.junit.ClassRule;
 import org.junit.Test;
+import org.mockito.ArgumentCaptor;
 
+import org.apache.geode.cache.configuration.CacheConfig;
+import org.apache.geode.cache.wan.GatewaySender;
 import org.apache.geode.distributed.DistributedMember;
-import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
 import org.apache.geode.distributed.internal.membership.InternalDistributedMember;
 import org.apache.geode.internal.Version;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
+import org.apache.geode.management.internal.cli.functions.GatewaySenderFunctionArgs;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
-import org.apache.geode.management.internal.configuration.domain.XmlEntity;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
 import org.apache.geode.test.junit.rules.GfshParserRule;
 
 
@@ -51,21 +53,18 @@ public class CreateGatewaySenderCommandTest {
   private CreateGatewaySenderCommand command;
   private InternalCache cache;
   private List<CliFunctionResult> functionResults;
-  private InternalConfigurationPersistenceService ccService;
-  private CliFunctionResult result1, result2;
-  private XmlEntity xmlEntity;
+  private CliFunctionResult cliFunctionResult;
+  ArgumentCaptor<GatewaySenderFunctionArgs> argsArgumentCaptor =
+      ArgumentCaptor.forClass(GatewaySenderFunctionArgs.class);
 
   @Before
   public void before() {
     command = spy(CreateGatewaySenderCommand.class);
-    ccService = mock(InternalConfigurationPersistenceService.class);
-    xmlEntity = mock(XmlEntity.class);
     cache = mock(InternalCache.class);
     doReturn(cache).when(command).getCache();
-    doReturn(ccService).when(command).getConfigurationPersistenceService();
     functionResults = new ArrayList<>();
-    doReturn(functionResults).when(command).executeAndGetFunctionResult(any(), any(),
-        any(Set.class));
+    doReturn(functionResults).when(command).executeAndGetFunctionResult(any(),
+        any(), any(Set.class));
   }
 
   @Test
@@ -114,41 +113,56 @@ public class CreateGatewaySenderCommandTest {
   }
 
   @Test
-  public void whenNoCCService() {
+  public void whenCommandOnMember() {
     doReturn(mock(Set.class)).when(command).getMembers(any(), any());
-    doReturn(null).when(command).getConfigurationPersistenceService();
-    result1 = new CliFunctionResult("member", xmlEntity, "result1");
-    functionResults.add(result1);
+    cliFunctionResult = new CliFunctionResult("member",
+        CliFunctionResult.StatusState.OK, "cliFunctionResult");
+    functionResults.add(cliFunctionResult);
     gfsh.executeAndAssertThat(command,
-        "create gateway-sender --id=1  --remote-distributed-system-id=1").statusIsSuccess()
-        .hasFailToPersistError();
-    verify(ccService, never()).deleteXmlEntity(any(), any());
+        "create gateway-sender --member=xyz --id=1 --remote-distributed-system-id=1")
+        .statusIsSuccess();
   }
 
   @Test
-  public void whenCommandOnMember() {
+  public void testFunctionArgs() {
     doReturn(mock(Set.class)).when(command).getMembers(any(), any());
-    doReturn(ccService).when(command).getConfigurationPersistenceService();
-    result1 = new CliFunctionResult("member", xmlEntity, "result1");
-    functionResults.add(result1);
+    cliFunctionResult = new CliFunctionResult("member",
+        CliFunctionResult.StatusState.OK, "cliFunctionResult");
+    functionResults.add(cliFunctionResult);
     gfsh.executeAndAssertThat(command,
-        "create gateway-sender --member=xyz --id=1 --remote-distributed-system-id=1")
-        .statusIsSuccess().hasFailToPersistError();
-    verify(ccService, never()).deleteXmlEntity(any(), any());
+        "create gateway-sender --member=xyz --id=1 --remote-distributed-system-id=1"
+            + " --order-policy=thread --dispatcher-threads=2 "
+            + "--gateway-event-filter=test1,test2 --gateway-transport-filter=test1,test2")
+        .statusIsSuccess();
+    verify(command).executeAndGetFunctionResult(any(), argsArgumentCaptor.capture(),
+        any(Set.class));
+    assertThat(argsArgumentCaptor.getValue().getOrderPolicy()).isEqualTo(
+        GatewaySender.OrderPolicy.THREAD.toString());
+    assertThat(argsArgumentCaptor.getValue().getRemoteDistributedSystemId()).isEqualTo(1);
+    assertThat(argsArgumentCaptor.getValue().getDispatcherThreads()).isEqualTo(2);
+    assertThat(argsArgumentCaptor.getValue().getGatewayEventFilter()).containsExactly("test1",
+        "test2");
+    assertThat(argsArgumentCaptor.getValue().getGatewayTransportFilter()).containsExactly("test1",
+        "test2");
   }
 
   @Test
-  public void whenNoXml() {
+  public void testReturnsConfigInResultModel() {
     doReturn(mock(Set.class)).when(command).getMembers(any(), any());
-    doReturn(ccService).when(command).getConfigurationPersistenceService();
-    result1 = new CliFunctionResult("member", false, "result1");
-    functionResults.add(result1);
-
-    // does not delete because command failed, so hasNoFailToPersistError should still be true
-    gfsh.executeAndAssertThat(command,
-        "create gateway-sender --id=1 --remote-distributed-system-id=1").statusIsError()
-        .hasNoFailToPersistError();
-    verify(ccService, never()).deleteXmlEntity(any(), any());
+    cliFunctionResult = new CliFunctionResult("member", CliFunctionResult.StatusState.OK,
+        "cliFunctionResult");
+    functionResults.add(cliFunctionResult);
+    ResultModel resultModel = gfsh.executeAndAssertThat(command,
+        "create gateway-sender --group=xyz --id=1 --remote-distributed-system-id=1"
+            + " --order-policy=thread --dispatcher-threads=2 "
+            + "--gateway-event-filter=test1,test2 --gateway-transport-filter=test1,test2")
+        .getResultModel();
+
+    assertThat(resultModel.getConfigObject()).isNotNull();
+    CacheConfig.GatewaySender sender = (CacheConfig.GatewaySender) resultModel.getConfigObject();
+    assertThat(sender.getId()).isEqualTo("1");
+    assertThat(sender.getRemoteDistributedSystemId()).isEqualTo("1");
+    assertThat(sender.getOrderPolicy()).isEqualTo("THREAD");
   }
 
   @Test
diff --git a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyGatewaySenderCommandTest.java b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyGatewaySenderCommandTest.java
index 28daa69..6d53158 100644
--- a/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyGatewaySenderCommandTest.java
+++ b/geode-core/src/test/java/org/apache/geode/management/internal/cli/commands/DestroyGatewaySenderCommandTest.java
@@ -19,9 +19,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -31,10 +29,8 @@ import org.junit.Before;
 import org.junit.ClassRule;
 import org.junit.Test;
 
-import org.apache.geode.distributed.internal.InternalConfigurationPersistenceService;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.management.internal.cli.functions.CliFunctionResult;
-import org.apache.geode.management.internal.configuration.domain.XmlEntity;
 import org.apache.geode.test.junit.rules.GfshParserRule;
 
 
@@ -46,18 +42,13 @@ public class DestroyGatewaySenderCommandTest {
   private DestroyGatewaySenderCommand command;
   private InternalCache cache;
   private List<CliFunctionResult> functionResults;
-  private InternalConfigurationPersistenceService ccService;
   private CliFunctionResult result1, result2;
-  private XmlEntity xmlEntity;
 
   @Before
   public void before() throws Exception {
     command = spy(DestroyGatewaySenderCommand.class);
-    ccService = mock(InternalConfigurationPersistenceService.class);
-    xmlEntity = mock(XmlEntity.class);
     cache = mock(InternalCache.class);
     doReturn(cache).when(command).getCache();
-    doReturn(ccService).when(command).getConfigurationPersistenceService();
     functionResults = new ArrayList<>();
     doReturn(functionResults).when(command).executeAndGetFunctionResult(any(), any(),
         any(Set.class));
@@ -70,77 +61,58 @@ public class DestroyGatewaySenderCommandTest {
 
   @Test
   public void allFunctionReturnsOK() throws Exception {
-    result1 = new CliFunctionResult("member", xmlEntity, "result1");
-    result2 = new CliFunctionResult("member", xmlEntity, "result2");
+    result1 = new CliFunctionResult("member", CliFunctionResult.StatusState.OK,
+        "result1");
+    result2 = new CliFunctionResult("member", CliFunctionResult.StatusState.OK,
+        "result2");
     functionResults.add(result1);
     functionResults.add(result2);
 
     doReturn(mock(Set.class)).when(command).getMembers(any(), any());
     parser.executeAndAssertThat(command, "destroy gateway-sender --id=1").statusIsSuccess()
-        .tableHasColumnWithValuesContaining("Status", "result1", "result2");
-
-    verify(ccService).deleteXmlEntity(any(), any());
+        .tableHasColumnWithValuesContaining("Message", "result1", "result2");
   }
 
   @Test
   public void oneFunctionReturnsError() throws Exception {
-    result1 = new CliFunctionResult("member", true, "result1");
-    result2 = new CliFunctionResult("member", false, "result2");
+    result1 = new CliFunctionResult("member", CliFunctionResult.StatusState.OK,
+        "result1");
+    result2 = new CliFunctionResult("member", CliFunctionResult.StatusState.ERROR,
+        "result2");
     functionResults.add(result1);
     functionResults.add(result2);
 
     doReturn(mock(Set.class)).when(command).getMembers(any(), any());
     parser.executeAndAssertThat(command, "destroy gateway-sender --id=1").statusIsSuccess()
-        .tableHasColumnWithValuesContaining("Status", "result1", "ERROR: result2");
-
+        .tableHasColumnWithValuesContaining("Message", "result1", "result2");
   }
 
   @Test
   public void oneFunctionThrowsGeneralException() throws Exception {
-    result1 = new CliFunctionResult("member", true, "result1");
+    result1 = new CliFunctionResult("member", CliFunctionResult.StatusState.OK, "result1");
     result2 = new CliFunctionResult("member", new Exception("something happened"), null);
     functionResults.add(result1);
     functionResults.add(result2);
 
     doReturn(mock(Set.class)).when(command).getMembers(any(), any());
     parser.executeAndAssertThat(command, "destroy gateway-sender --id=1").statusIsSuccess()
-        .tableHasColumnWithValuesContaining("Status", "result1",
-            "ERROR: java.lang.Exception: something happened");
+        .tableHasColumnWithValuesContaining("Message", "result1",
+            "java.lang.Exception: something happened");
 
   }
 
   @Test
-  public void whenNoCCService() {
-    doReturn(mock(Set.class)).when(command).getMembers(any(), any());
-    doReturn(null).when(command).getConfigurationPersistenceService();
-    result1 = new CliFunctionResult("member", xmlEntity, "result1");
+  public void putsIdOfDestroyedSenderInResult() throws Exception {
+    result1 = new CliFunctionResult("member", CliFunctionResult.StatusState.OK,
+        "result1");
     functionResults.add(result1);
-    parser.executeAndAssertThat(command, "destroy gateway-sender --id=1").statusIsSuccess()
-        .hasFailToPersistError();
-    verify(ccService, never()).deleteXmlEntity(any(), any());
-  }
 
-  @Test
-  public void whenCommandOnMember() {
     doReturn(mock(Set.class)).when(command).getMembers(any(), any());
-    doReturn(ccService).when(command).getConfigurationPersistenceService();
-    result1 = new CliFunctionResult("member", xmlEntity, "result1");
-    functionResults.add(result1);
-    parser.executeAndAssertThat(command, "destroy gateway-sender --member=xyz --id=1")
-        .statusIsSuccess().hasFailToPersistError();
-    verify(ccService, never()).deleteXmlEntity(any(), any());
-  }
-
-  @Test
-  public void whenNoXml() {
-    doReturn(mock(Set.class)).when(command).getMembers(any(), any());
-    doReturn(ccService).when(command).getConfigurationPersistenceService();
-    result1 = new CliFunctionResult("member", false, "result1");
-    functionResults.add(result1);
-
-    // does not delete because command failed, so hasNoFailToPersistError should still be true
-    parser.executeAndAssertThat(command, "destroy gateway-sender --id=1").statusIsError()
-        .hasNoFailToPersistError();
-    verify(ccService, never()).deleteXmlEntity(any(), any());
+    String id = (String) parser
+        .executeAndAssertThat(command, "destroy gateway-sender --id=1")
+        .statusIsSuccess()
+        .getResultModel()
+        .getConfigObject();
+    assertThat(id).isEqualTo("1");
   }
 }
diff --git a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/CreateDestroyGatewaySenderCommandDUnitTest.java b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/CreateDestroyGatewaySenderCommandDUnitTest.java
index 6503b8b..f5000d2 100644
--- a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/CreateDestroyGatewaySenderCommandDUnitTest.java
+++ b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/CreateDestroyGatewaySenderCommandDUnitTest.java
@@ -96,7 +96,7 @@ public class CreateDestroyGatewaySenderCommandDUnitTest implements Serializable
   @Test
   public void testCreateDestroyGatewaySenderWithDefault() throws Exception {
     gfsh.executeAndAssertThat(CREATE).statusIsSuccess().tableHasColumnWithExactValuesInAnyOrder(
-        "Status", "GatewaySender \"ln\" created on \"" + SERVER_3 + "\"",
+        "Message", "GatewaySender \"ln\" created on \"" + SERVER_3 + "\"",
         "GatewaySender \"ln\" created on \"" + SERVER_4 + "\"",
         "GatewaySender \"ln\" created on \"" + SERVER_5 + "\"");
 
@@ -106,12 +106,13 @@ public class CreateDestroyGatewaySenderCommandDUnitTest implements Serializable
     locatorSite1.invoke(() -> {
       String xml = ClusterStartupRule.getLocator().getConfigurationPersistenceService()
           .getConfiguration("cluster").getCacheXmlContent();
-      assertThat(xml).contains("<gateway-sender id=\"ln\" remote-distributed-system-id=\"2\"/>");
+      assertThat(xml).contains("<gateway-sender id=\"ln\" remote-distributed-system-id=\"2\""
+          + " parallel=\"false\"/>");
     });
 
     // destroy gateway sender and verify AEQs cleaned up
     gfsh.executeAndAssertThat(DESTROY).statusIsSuccess().tableHasColumnWithExactValuesInAnyOrder(
-        "Status", "GatewaySender \"ln\" destroyed on \"" + SERVER_3 + "\"",
+        "Message", "GatewaySender \"ln\" destroyed on \"" + SERVER_3 + "\"",
         "GatewaySender \"ln\" destroyed on \"" + SERVER_4 + "\"",
         "GatewaySender \"ln\" destroyed on \"" + SERVER_5 + "\"");
 
@@ -147,7 +148,7 @@ public class CreateDestroyGatewaySenderCommandDUnitTest implements Serializable
         + CliStrings.CREATE_GATEWAYSENDER__DISPATCHERTHREADS + "=2" + " --"
         + CliStrings.CREATE_GATEWAYSENDER__ORDERPOLICY + "=THREAD";
     gfsh.executeAndAssertThat(command).statusIsSuccess().tableHasColumnWithExactValuesInAnyOrder(
-        "Status", "GatewaySender \"ln\" created on \"" + SERVER_3 + "\"",
+        "Message", "GatewaySender \"ln\" created on \"" + SERVER_3 + "\"",
         "GatewaySender \"ln\" created on \"" + SERVER_4 + "\"",
         "GatewaySender \"ln\" created on \"" + SERVER_5 + "\"");
 
@@ -159,7 +160,7 @@ public class CreateDestroyGatewaySenderCommandDUnitTest implements Serializable
 
     // destroy gateway sender and verify AEQs cleaned up
     gfsh.executeAndAssertThat(DESTROY).statusIsSuccess().tableHasColumnWithExactValuesInAnyOrder(
-        "Status", "GatewaySender \"ln\" destroyed on \"" + SERVER_3 + "\"",
+        "Message", "GatewaySender \"ln\" destroyed on \"" + SERVER_3 + "\"",
         "GatewaySender \"ln\" destroyed on \"" + SERVER_4 + "\"",
         "GatewaySender \"ln\" destroyed on \"" + SERVER_5 + "\"");
 
@@ -192,7 +193,7 @@ public class CreateDestroyGatewaySenderCommandDUnitTest implements Serializable
         + "=org.apache.geode.cache30.MyGatewayEventFilter1,org.apache.geode.cache30.MyGatewayEventFilter2";
 
     gfsh.executeAndAssertThat(command).statusIsSuccess().tableHasColumnWithExactValuesInAnyOrder(
-        "Status", "GatewaySender \"ln\" created on \"" + SERVER_3 + "\"",
+        "Message", "GatewaySender \"ln\" created on \"" + SERVER_3 + "\"",
         "GatewaySender \"ln\" created on \"" + SERVER_4 + "\"",
         "GatewaySender \"ln\" created on \"" + SERVER_5 + "\"");
 
@@ -208,7 +209,7 @@ public class CreateDestroyGatewaySenderCommandDUnitTest implements Serializable
 
     // destroy gateway sender and verify AEQs cleaned up
     gfsh.executeAndAssertThat(DESTROY).statusIsSuccess().tableHasColumnWithExactValuesInAnyOrder(
-        "Status", "GatewaySender \"ln\" destroyed on \"" + SERVER_3 + "\"",
+        "Message", "GatewaySender \"ln\" destroyed on \"" + SERVER_3 + "\"",
         "GatewaySender \"ln\" destroyed on \"" + SERVER_4 + "\"",
         "GatewaySender \"ln\" destroyed on \"" + SERVER_5 + "\"");
 
@@ -240,7 +241,7 @@ public class CreateDestroyGatewaySenderCommandDUnitTest implements Serializable
         + CliStrings.CREATE_GATEWAYSENDER__GATEWAYTRANSPORTFILTER
         + "=org.apache.geode.cache30.MyGatewayTransportFilter1";
     gfsh.executeAndAssertThat(command).statusIsSuccess().tableHasColumnWithExactValuesInAnyOrder(
-        "Status", "GatewaySender \"ln\" created on \"" + SERVER_3 + "\"",
+        "Message", "GatewaySender \"ln\" created on \"" + SERVER_3 + "\"",
         "GatewaySender \"ln\" created on \"" + SERVER_4 + "\"",
         "GatewaySender \"ln\" created on \"" + SERVER_5 + "\"");
 
@@ -255,7 +256,7 @@ public class CreateDestroyGatewaySenderCommandDUnitTest implements Serializable
 
     // destroy gateway sender and verify AEQs cleaned up
     gfsh.executeAndAssertThat(DESTROY).statusIsSuccess().tableHasColumnWithExactValuesInAnyOrder(
-        "Status", "GatewaySender \"ln\" destroyed on \"" + SERVER_3 + "\"",
+        "Message", "GatewaySender \"ln\" destroyed on \"" + SERVER_3 + "\"",
         "GatewaySender \"ln\" destroyed on \"" + SERVER_4 + "\"",
         "GatewaySender \"ln\" destroyed on \"" + SERVER_5 + "\"");
 
@@ -269,7 +270,7 @@ public class CreateDestroyGatewaySenderCommandDUnitTest implements Serializable
   @Test
   public void testCreateDestroyGatewaySender_OnMember() throws Exception {
     gfsh.executeAndAssertThat(CREATE + " --member=" + server1.getName()).statusIsSuccess()
-        .tableHasColumnWithExactValuesInAnyOrder("Status",
+        .tableHasColumnWithExactValuesInAnyOrder("Message",
             "GatewaySender \"ln\" created on \"" + SERVER_3 + "\"");
 
     server1.invoke(() -> {
@@ -279,7 +280,7 @@ public class CreateDestroyGatewaySenderCommandDUnitTest implements Serializable
     VMProvider.invokeInEveryMember(() -> verifySenderDoesNotExist("ln", false), server2, server3);
 
     gfsh.executeAndAssertThat(DESTROY + " --member=" + server1.getName()).statusIsSuccess()
-        .tableHasColumnWithExactValuesInAnyOrder("Status",
+        .tableHasColumnWithExactValuesInAnyOrder("Message",
             "GatewaySender \"ln\" destroyed on \"" + SERVER_3 + "\"");
 
     VMProvider.invokeInEveryMember(() -> verifySenderDoesNotExist("ln", false), server1);
@@ -291,7 +292,7 @@ public class CreateDestroyGatewaySenderCommandDUnitTest implements Serializable
   @Test
   public void testCreateDestroyGatewaySender_Group() throws Exception {
     gfsh.executeAndAssertThat(CREATE + " --group=senderGroup1").statusIsSuccess()
-        .tableHasColumnWithExactValuesInAnyOrder("Status",
+        .tableHasColumnWithExactValuesInAnyOrder("Message",
             "GatewaySender \"ln\" created on \"" + SERVER_3 + "\"");
 
     server1.invoke(() -> {
@@ -301,7 +302,7 @@ public class CreateDestroyGatewaySenderCommandDUnitTest implements Serializable
     VMProvider.invokeInEveryMember(() -> verifySenderDoesNotExist("ln", false), server2, server3);
 
     gfsh.executeAndAssertThat(DESTROY + " --group=senderGroup1").statusIsSuccess()
-        .tableHasColumnWithExactValuesInAnyOrder("Status",
+        .tableHasColumnWithExactValuesInAnyOrder("Message",
             "GatewaySender \"ln\" destroyed on \"" + SERVER_3 + "\"");
 
     VMProvider.invokeInEveryMember(() -> verifySenderDoesNotExist("ln", false), server1);
@@ -313,14 +314,14 @@ public class CreateDestroyGatewaySenderCommandDUnitTest implements Serializable
   @Test
   public void testCreateDestroyParallelGatewaySender() throws Exception {
     gfsh.executeAndAssertThat(CREATE + " --parallel").statusIsSuccess()
-        .tableHasColumnWithExactValuesInAnyOrder("Status",
+        .tableHasColumnWithExactValuesInAnyOrder("Message",
             "GatewaySender \"ln\" created on \"" + SERVER_3 + "\"",
             "GatewaySender \"ln\" created on \"" + SERVER_4 + "\"",
             "GatewaySender \"ln\" created on \"" + SERVER_5 + "\"");
 
     // destroy gateway sender and verify AEQs cleaned up
     gfsh.executeAndAssertThat(DESTROY).statusIsSuccess().tableHasColumnWithExactValuesInAnyOrder(
-        "Status", "GatewaySender \"ln\" destroyed on \"" + SERVER_3 + "\"",
+        "Message", "GatewaySender \"ln\" destroyed on \"" + SERVER_3 + "\"",
         "GatewaySender \"ln\" destroyed on \"" + SERVER_4 + "\"",
         "GatewaySender \"ln\" destroyed on \"" + SERVER_5 + "\"");
 
diff --git a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/DestroyGatewaySenderCommandDUnitTest.java b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/DestroyGatewaySenderCommandDUnitTest.java
index 8b5826f..82ee09e 100644
--- a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/DestroyGatewaySenderCommandDUnitTest.java
+++ b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/DestroyGatewaySenderCommandDUnitTest.java
@@ -72,13 +72,13 @@ public class DestroyGatewaySenderCommandDUnitTest {
   @Test
   public void testCreateDestroySerialGatewaySenderWithDefault() throws Exception {
     gfsh.executeAndAssertThat(CREATE).statusIsSuccess().tableHasColumnWithExactValuesInAnyOrder(
-        "Status", "GatewaySender \"sender\" created on \"happyserver1\"");
+        "Message", "GatewaySender \"sender\" created on \"happyserver1\"");
 
     locatorSite1.waitUntilGatewaySendersAreReadyOnExactlyThisManyServers(1);
 
     // destroy gateway sender and verify AEQs cleaned up
     gfsh.executeAndAssertThat(DESTROY).statusIsSuccess().tableHasColumnWithExactValuesInAnyOrder(
-        "Status", "GatewaySender \"sender\" destroyed on \"happyserver1\"");
+        "Message", "GatewaySender \"sender\" destroyed on \"happyserver1\"");
 
     locatorSite1.waitUntilGatewaySendersAreReadyOnExactlyThisManyServers(0);
 
@@ -89,14 +89,14 @@ public class DestroyGatewaySenderCommandDUnitTest {
   @Test
   public void testCreateDestroyParallellGatewaySenderWithDefault() throws Exception {
     gfsh.executeAndAssertThat(CREATE + " --parallel").statusIsSuccess()
-        .tableHasColumnWithExactValuesInAnyOrder("Status",
+        .tableHasColumnWithExactValuesInAnyOrder("Message",
             "GatewaySender \"sender\" created on \"happyserver1\"");
 
     locatorSite1.waitUntilGatewaySendersAreReadyOnExactlyThisManyServers(1);
 
     // destroy gateway sender and verify AEQs cleaned up
     gfsh.executeAndAssertThat(DESTROY).statusIsSuccess().tableHasColumnWithExactValuesInAnyOrder(
-        "Status", "GatewaySender \"sender\" destroyed on \"happyserver1\"");
+        "Message", "GatewaySender \"sender\" destroyed on \"happyserver1\"");
 
     locatorSite1.waitUntilGatewaySendersAreReadyOnExactlyThisManyServers(0);
 
diff --git a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/PauseGatewaySenderCommandDUnitTest.java b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/PauseGatewaySenderCommandDUnitTest.java
index 5b3c2db..4558c9b 100644
--- a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/PauseGatewaySenderCommandDUnitTest.java
+++ b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/PauseGatewaySenderCommandDUnitTest.java
@@ -37,7 +37,8 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.result.CommandResult;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
 import org.apache.geode.test.junit.categories.WanTest;
@@ -111,9 +112,11 @@ public class PauseGatewaySenderCommandDUnitTest implements Serializable {
     CommandResult cmdResult = gfsh.executeCommand(command);
     assertThat(cmdResult).isNotNull();
 
-    String strCmdResult = cmdResult.toString();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
-    assertThat(strCmdResult).contains("is paused on member");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.PAUSE_GATEWAYSENDER);
+    List<String> messages = resultData.getValuesInColumn("Message");
+    assertThat(messages.get(0)).contains("is paused on member");
 
     locatorSite1.invoke(
         () -> validateGatewaySenderMXBeanProxy(getMember(server1.getVM()), "ln", true, true));
@@ -155,10 +158,10 @@ public class PauseGatewaySenderCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(3);
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.PAUSE_GATEWAYSENDER);
+    List<String> status = resultData.getValuesInColumn("Result");
+    assertThat(status).containsExactlyInAnyOrder("OK", "OK", "OK");
 
     locatorSite1.invoke(
         () -> validateGatewaySenderMXBeanProxy(getMember(server1.getVM()), "ln", true, true));
@@ -210,11 +213,10 @@ public class PauseGatewaySenderCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(3);
-    assertThat(status).doesNotContain("Error");
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.PAUSE_GATEWAYSENDER);
+    List<String> status = resultData.getValuesInColumn("Result");
+    assertThat(status).containsExactlyInAnyOrder("OK", "OK", "OK");
 
     locatorSite1.invoke(
         () -> validateGatewaySenderMXBeanProxy(getMember(server1.getVM()), "ln", true, true));
@@ -278,11 +280,10 @@ public class PauseGatewaySenderCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(4);
-    assertThat(status).doesNotContain("Error");
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.PAUSE_GATEWAYSENDER);
+    List<String> status = resultData.getValuesInColumn("Result");
+    assertThat(status).containsExactlyInAnyOrder("OK", "OK", "OK", "OK");
 
     locatorSite1.invoke(
         () -> validateGatewaySenderMXBeanProxy(getMember(server1.getVM()), "ln", true, true));
diff --git a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/ResumeGatewaySenderCommandDUnitTest.java b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/ResumeGatewaySenderCommandDUnitTest.java
index be64ffd..f7e4651 100644
--- a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/ResumeGatewaySenderCommandDUnitTest.java
+++ b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/ResumeGatewaySenderCommandDUnitTest.java
@@ -38,7 +38,8 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.result.CommandResult;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
 import org.apache.geode.test.junit.categories.WanTest;
@@ -135,10 +136,10 @@ public class ResumeGatewaySenderCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(3);
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.RESUME_GATEWAYSENDER);
+    List<String> status = resultData.getValuesInColumn("Result");
+    assertThat(status).containsExactlyInAnyOrder("OK", "OK", "OK");
 
     locatorSite1.invoke(
         () -> validateGatewaySenderMXBeanProxy(getMember(server1.getVM()), "ln", true, false));
@@ -181,7 +182,11 @@ public class ResumeGatewaySenderCommandDUnitTest implements Serializable {
 
     String strCmdResult = cmdResult.toString();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
-    assertThat(strCmdResult).contains("is resumed on member");
+
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.RESUME_GATEWAYSENDER);
+    List<String> messages = resultData.getValuesInColumn("Message");
+    assertThat(messages.get(0)).contains("is resumed on member");
 
     locatorSite1.invoke(
         () -> validateGatewaySenderMXBeanProxy(getMember(server1.getVM()), "ln", true, false));
@@ -234,11 +239,10 @@ public class ResumeGatewaySenderCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(3);
-    assertThat(status).doesNotContain("Error");
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.RESUME_GATEWAYSENDER);
+    List<String> status = resultData.getValuesInColumn("Result");
+    assertThat(status).containsExactlyInAnyOrder("OK", "OK", "OK");
 
     locatorSite1.invoke(
         () -> validateGatewaySenderMXBeanProxy(getMember(server1.getVM()), "ln", true, false));
@@ -313,11 +317,10 @@ public class ResumeGatewaySenderCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(4);
-    assertThat(status).doesNotContain("Error");
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.RESUME_GATEWAYSENDER);
+    List<String> status = resultData.getValuesInColumn("Result");
+    assertThat(status).containsExactlyInAnyOrder("OK", "OK", "OK", "OK");
 
     locatorSite1.invoke(
         () -> validateGatewaySenderMXBeanProxy(getMember(server1.getVM()), "ln", true, false));
diff --git a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StartGatewayReceiverCommandDUnitTest.java b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StartGatewayReceiverCommandDUnitTest.java
index be3eed1..73e990c 100644
--- a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StartGatewayReceiverCommandDUnitTest.java
+++ b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StartGatewayReceiverCommandDUnitTest.java
@@ -36,7 +36,8 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.result.CommandResult;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
 import org.apache.geode.test.junit.categories.WanTest;
@@ -120,11 +121,10 @@ public class StartGatewayReceiverCommandDUnitTest implements Serializable {
     CommandResult cmdResult = gfsh.executeCommand(command);
     assertThat(cmdResult).isNotNull();
 
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(3);
-    assertThat(status).doesNotContain("Error");
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.START_GATEWAYRECEIVER);
+    List<String> status = resultData.getValuesInColumn("Result");
+    assertThat(status).containsExactlyInAnyOrder("OK", "OK", "OK");
 
     locatorSite1.invoke(() -> validateGatewayReceiverMXBeanProxy(getMember(server1.getVM()), true));
     locatorSite1.invoke(() -> validateGatewayReceiverMXBeanProxy(getMember(server2.getVM()), true));
@@ -170,7 +170,11 @@ public class StartGatewayReceiverCommandDUnitTest implements Serializable {
 
     String strCmdResult = cmdResult.toString();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
-    assertThat(strCmdResult).contains("is started on member");
+
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.START_GATEWAYRECEIVER);
+    List<String> messages = resultData.getValuesInColumn("Message");
+    assertThat(messages.get(0)).contains("is started on member");
 
     locatorSite1.invoke(() -> validateGatewayReceiverMXBeanProxy(getMember(server1.getVM()), true));
     locatorSite1
@@ -215,11 +219,10 @@ public class StartGatewayReceiverCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(3);
-    assertThat(status).doesNotContain("Error");
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.START_GATEWAYRECEIVER);
+    List<String> status = resultData.getValuesInColumn("Result");
+    assertThat(status).containsExactlyInAnyOrder("OK", "OK", "OK");
 
     locatorSite1.invoke(() -> validateGatewayReceiverMXBeanProxy(getMember(server1.getVM()), true));
     locatorSite1.invoke(() -> validateGatewayReceiverMXBeanProxy(getMember(server2.getVM()), true));
@@ -273,11 +276,10 @@ public class StartGatewayReceiverCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(4);
-    assertThat(status).doesNotContain("Error");
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.START_GATEWAYRECEIVER);
+    List<String> status = resultData.getValuesInColumn("Result");
+    assertThat(status).containsExactlyInAnyOrder("OK", "OK", "OK", "OK");
 
     locatorSite1.invoke(() -> validateGatewayReceiverMXBeanProxy(getMember(server1.getVM()), true));
     locatorSite1.invoke(() -> validateGatewayReceiverMXBeanProxy(getMember(server2.getVM()), true));
diff --git a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StartGatewaySenderCommandDUnitTest.java b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StartGatewaySenderCommandDUnitTest.java
index 6a43b5f..e3a39c2 100644
--- a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StartGatewaySenderCommandDUnitTest.java
+++ b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StartGatewaySenderCommandDUnitTest.java
@@ -36,7 +36,8 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.result.CommandResult;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.test.dunit.IgnoredException;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
@@ -80,7 +81,7 @@ public class StartGatewaySenderCommandDUnitTest implements Serializable {
    * or group.
    */
   @Test
-  public void testStartGatewaySender_ErrorConditions() throws Exception {
+  public void testStartGatewaySender_ErrorConditions() {
     Integer locator1Port = locatorSite1.getPort();
 
     // setup servers in Site #1
@@ -126,10 +127,10 @@ public class StartGatewaySenderCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(3);
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.START_GATEWAYSENDER);
+    List<String> status = resultData.getValuesInColumn("Result");
+    assertThat(status).containsExactlyInAnyOrder("OK", "OK", "OK");
 
     locatorSite1.invoke(
         () -> validateGatewaySenderMXBeanProxy(getMember(server1.getVM()), "ln", true, false));
@@ -165,9 +166,10 @@ public class StartGatewaySenderCommandDUnitTest implements Serializable {
     CommandResult cmdResult = executeCommandWithIgnoredExceptions(command);
     assertThat(cmdResult).isNotNull();
 
-    String strCmdResult = cmdResult.toString();
-    assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
-    assertThat(strCmdResult).contains("is started on member");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.START_GATEWAYSENDER);
+    List<String> messages = resultData.getValuesInColumn("Message");
+    assertThat(messages.get(0)).contains("is started on member");
 
     locatorSite1.invoke(
         () -> validateGatewaySenderMXBeanProxy(getMember(server1.getVM()), "ln", true, false));
@@ -208,11 +210,10 @@ public class StartGatewaySenderCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(3);
-    assertThat(status).doesNotContain("Error");
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.START_GATEWAYSENDER);
+    List<String> status = resultData.getValuesInColumn("Result");
+    assertThat(status).containsExactlyInAnyOrder("OK", "OK", "OK");
 
     locatorSite1.invoke(
         () -> validateGatewaySenderMXBeanProxy(getMember(server1.getVM()), "ln", true, false));
@@ -270,11 +271,10 @@ public class StartGatewaySenderCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(4);
-    assertThat(status).doesNotContain("Error");
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.START_GATEWAYSENDER);
+    assertThat(resultData.getValuesInColumn("Result"))
+        .containsExactlyInAnyOrder("OK", "OK", "OK", "OK");
 
     locatorSite1.invoke(
         () -> validateGatewaySenderMXBeanProxy(getMember(server1.getVM()), "ln", true, false));
@@ -322,16 +322,10 @@ public class StartGatewaySenderCommandDUnitTest implements Serializable {
     CommandResult cmdResult = executeCommandWithIgnoredExceptions(command);
     assertThat(cmdResult).isNotNull();
 
-    String strCmdResult = cmdResult.toString();
-    assertThat(strCmdResult).contains("Error");
-    assertThat(strCmdResult).contains("is not available");
-    assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
-
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(3);
-    assertThat(status).contains("Error");
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.START_GATEWAYSENDER);
+    List<String> status = resultData.getValuesInColumn("Result");
+    assertThat(status).containsExactlyInAnyOrder("Error", "OK", "OK");
 
     locatorSite1.invoke(
         () -> validateGatewaySenderMXBeanProxy(getMember(server1.getVM()), "ln", true, false));
diff --git a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StatusGatewayReceiverCommandDUnitTest.java b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StatusGatewayReceiverCommandDUnitTest.java
index ffd000e..39e3ff6 100644
--- a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StatusGatewayReceiverCommandDUnitTest.java
+++ b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StatusGatewayReceiverCommandDUnitTest.java
@@ -35,8 +35,8 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.result.CommandResult;
-import org.apache.geode.management.internal.cli.result.CompositeResultData;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
 import org.apache.geode.test.junit.categories.WanTest;
@@ -104,12 +104,11 @@ public class StatusGatewayReceiverCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData tableResultData = ((CompositeResultData) cmdResult.getResultData())
-        .retrieveSection(CliStrings.SECTION_GATEWAY_RECEIVER_AVAILABLE)
-        .retrieveTable(CliStrings.TABLE_GATEWAY_RECEIVER);
-    List<String> result_Status = tableResultData.retrieveAllValues(CliStrings.RESULT_STATUS);
-    assertThat(result_Status).hasSize(3);
-    assertThat(result_Status).doesNotContain(CliStrings.GATEWAY_NOT_RUNNING);
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.SECTION_GATEWAY_RECEIVER_AVAILABLE);
+    List<String> status = resultData.getValuesInColumn(CliStrings.RESULT_STATUS);
+    assertThat(status).hasSize(3);
+    assertThat(status).doesNotContain(CliStrings.GATEWAY_NOT_RUNNING);
 
     server1.invoke(WANCommandUtils::stopReceivers);
     server2.invoke(WANCommandUtils::stopReceivers);
@@ -127,12 +126,11 @@ public class StatusGatewayReceiverCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    tableResultData = ((CompositeResultData) cmdResult.getResultData())
-        .retrieveSection(CliStrings.SECTION_GATEWAY_RECEIVER_AVAILABLE)
-        .retrieveTable(CliStrings.TABLE_GATEWAY_RECEIVER);
-    result_Status = tableResultData.retrieveAllValues(CliStrings.RESULT_STATUS);
-    assertThat(result_Status).hasSize(3);
-    assertThat(result_Status).doesNotContain(CliStrings.GATEWAY_RUNNING);
+    resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.SECTION_GATEWAY_RECEIVER_AVAILABLE);
+    status = resultData.getValuesInColumn(CliStrings.RESULT_STATUS);
+    assertThat(status).hasSize(3);
+    assertThat(status).doesNotContain(CliStrings.GATEWAY_RUNNING);
   }
 
   @Test
@@ -167,12 +165,11 @@ public class StatusGatewayReceiverCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData tableResultData = ((CompositeResultData) cmdResult.getResultData())
-        .retrieveSection(CliStrings.SECTION_GATEWAY_RECEIVER_AVAILABLE)
-        .retrieveTable(CliStrings.TABLE_GATEWAY_RECEIVER);
-    List<String> result_Status = tableResultData.retrieveAllValues(CliStrings.RESULT_STATUS);
-    assertThat(result_Status).hasSize(1);
-    assertThat(result_Status).doesNotContain(CliStrings.GATEWAY_NOT_RUNNING);
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.SECTION_GATEWAY_RECEIVER_AVAILABLE);
+    List<String> status = resultData.getValuesInColumn(CliStrings.RESULT_STATUS);
+    assertThat(status).hasSize(1);
+    assertThat(status).doesNotContain(CliStrings.GATEWAY_NOT_RUNNING);
 
     server1.invoke(WANCommandUtils::stopReceivers);
     server2.invoke(WANCommandUtils::stopReceivers);
@@ -190,12 +187,11 @@ public class StatusGatewayReceiverCommandDUnitTest implements Serializable {
     cmdResult = gfsh.executeCommand(command);
     assertThat(cmdResult).isNotNull();
 
-    tableResultData = ((CompositeResultData) cmdResult.getResultData())
-        .retrieveSection(CliStrings.SECTION_GATEWAY_RECEIVER_AVAILABLE)
-        .retrieveTable(CliStrings.TABLE_GATEWAY_RECEIVER);
-    result_Status = tableResultData.retrieveAllValues(CliStrings.RESULT_STATUS);
-    assertThat(result_Status).hasSize(1);
-    assertThat(result_Status).doesNotContain(CliStrings.GATEWAY_RUNNING);
+    resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.SECTION_GATEWAY_RECEIVER_AVAILABLE);
+    status = resultData.getValuesInColumn(CliStrings.RESULT_STATUS);
+    assertThat(status).hasSize(1);
+    assertThat(status).doesNotContain(CliStrings.GATEWAY_RUNNING);
   }
 
   @Test
@@ -231,12 +227,11 @@ public class StatusGatewayReceiverCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData tableResultData = ((CompositeResultData) cmdResult.getResultData())
-        .retrieveSection(CliStrings.SECTION_GATEWAY_RECEIVER_AVAILABLE)
-        .retrieveTable(CliStrings.TABLE_GATEWAY_RECEIVER);
-    List<String> result_Status = tableResultData.retrieveAllValues(CliStrings.RESULT_STATUS);
-    assertThat(result_Status).hasSize(3);
-    assertThat(result_Status).doesNotContain(CliStrings.GATEWAY_NOT_RUNNING);
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.SECTION_GATEWAY_RECEIVER_AVAILABLE);
+    List<String> status = resultData.getValuesInColumn(CliStrings.RESULT_STATUS);
+    assertThat(status).hasSize(3);
+    assertThat(status).doesNotContain(CliStrings.GATEWAY_NOT_RUNNING);
 
     server1.invoke(WANCommandUtils::stopReceivers);
     server2.invoke(WANCommandUtils::stopReceivers);
@@ -254,12 +249,11 @@ public class StatusGatewayReceiverCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    tableResultData = ((CompositeResultData) cmdResult.getResultData())
-        .retrieveSection(CliStrings.SECTION_GATEWAY_RECEIVER_AVAILABLE)
-        .retrieveTable(CliStrings.TABLE_GATEWAY_RECEIVER);
-    result_Status = tableResultData.retrieveAllValues(CliStrings.RESULT_STATUS);
-    assertThat(result_Status).hasSize(3);
-    assertThat(result_Status).doesNotContain(CliStrings.GATEWAY_RUNNING);
+    resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.SECTION_GATEWAY_RECEIVER_AVAILABLE);
+    status = resultData.getValuesInColumn(CliStrings.RESULT_STATUS);
+    assertThat(status).hasSize(3);
+    assertThat(status).doesNotContain(CliStrings.GATEWAY_RUNNING);
   }
 
   private MemberVM startServerWithGroups(int index, String groups, int locPort) {
diff --git a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StatusGatewaySenderCommandDUnitTest.java b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StatusGatewaySenderCommandDUnitTest.java
index 05863b7..ff5ec27 100644
--- a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StatusGatewaySenderCommandDUnitTest.java
+++ b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StatusGatewaySenderCommandDUnitTest.java
@@ -37,8 +37,8 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.result.CommandResult;
-import org.apache.geode.management.internal.cli.result.CompositeResultData;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
 import org.apache.geode.test.junit.categories.WanTest;
@@ -120,12 +120,12 @@ public class StatusGatewaySenderCommandDUnitTest implements Serializable {
     CommandResult cmdResult = gfsh.executeCommand(command);
     assertThat(cmdResult).isNotNull();
 
-    TabularResultData tableResultData = ((CompositeResultData) cmdResult.getResultData())
-        .retrieveSection(CliStrings.SECTION_GATEWAY_SENDER_AVAILABLE)
-        .retrieveTable(CliStrings.TABLE_GATEWAY_SENDER);
-    List<String> result_Status = tableResultData.retrieveAllValues(CliStrings.RESULT_STATUS);
-    assertThat(result_Status).hasSize(3);
-    assertThat(result_Status).doesNotContain(CliStrings.GATEWAY_RUNNING);
+    TabularResultModel tableResultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.SECTION_GATEWAY_SENDER_AVAILABLE);
+
+    List<String> resultStatus = tableResultData.getValuesInColumn(CliStrings.RESULT_STATUS);
+    assertThat(resultStatus).hasSize(3);
+    assertThat(resultStatus).doesNotContain(CliStrings.GATEWAY_RUNNING);
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
     server1.invoke(() -> startSender("ln_Serial"));
@@ -157,12 +157,12 @@ public class StatusGatewaySenderCommandDUnitTest implements Serializable {
     cmdResult = gfsh.executeCommand(command);
     assertThat(cmdResult).isNotNull();
 
-    tableResultData = ((CompositeResultData) cmdResult.getResultData())
-        .retrieveSection(CliStrings.SECTION_GATEWAY_SENDER_AVAILABLE)
-        .retrieveTable(CliStrings.TABLE_GATEWAY_SENDER);
-    result_Status = tableResultData.retrieveAllValues(CliStrings.RESULT_STATUS);
-    assertThat(result_Status).hasSize(3);
-    assertThat(result_Status).doesNotContain(CliStrings.GATEWAY_NOT_RUNNING);
+    tableResultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.SECTION_GATEWAY_SENDER_AVAILABLE);
+
+    resultStatus = tableResultData.getValuesInColumn(CliStrings.RESULT_STATUS);
+    assertThat(resultStatus).hasSize(3);
+    assertThat(resultStatus).doesNotContain(CliStrings.GATEWAY_NOT_RUNNING);
   }
 
   @Test
@@ -210,12 +210,11 @@ public class StatusGatewaySenderCommandDUnitTest implements Serializable {
     CommandResult cmdResult = gfsh.executeCommand(command);
     assertThat(cmdResult).isNotNull();
 
-    TabularResultData tableResultData = ((CompositeResultData) cmdResult.getResultData())
-        .retrieveSection(CliStrings.SECTION_GATEWAY_SENDER_AVAILABLE)
-        .retrieveTable(CliStrings.TABLE_GATEWAY_SENDER);
-    List<String> result_Status = tableResultData.retrieveAllValues(CliStrings.RESULT_STATUS);
-    assertThat(result_Status).hasSize(1);
-    assertThat(result_Status).doesNotContain(CliStrings.GATEWAY_RUNNING);
+    TabularResultModel tableResultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.SECTION_GATEWAY_SENDER_AVAILABLE);
+    List<String> resultStatus = tableResultData.getValuesInColumn(CliStrings.RESULT_STATUS);
+    assertThat(resultStatus).hasSize(1);
+    assertThat(resultStatus).doesNotContain(CliStrings.GATEWAY_RUNNING);
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
     server1.invoke(() -> startSender("ln_Serial"));
@@ -244,12 +243,11 @@ public class StatusGatewaySenderCommandDUnitTest implements Serializable {
     cmdResult = gfsh.executeCommand(command);
     assertThat(cmdResult).isNotNull();
 
-    tableResultData = ((CompositeResultData) cmdResult.getResultData())
-        .retrieveSection(CliStrings.SECTION_GATEWAY_SENDER_AVAILABLE)
-        .retrieveTable(CliStrings.TABLE_GATEWAY_SENDER);
-    result_Status = tableResultData.retrieveAllValues(CliStrings.RESULT_STATUS);
-    assertThat(result_Status).hasSize(1);
-    assertThat(result_Status).doesNotContain(CliStrings.GATEWAY_NOT_RUNNING);
+    tableResultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.SECTION_GATEWAY_SENDER_AVAILABLE);
+    resultStatus = tableResultData.getValuesInColumn(CliStrings.RESULT_STATUS);
+    assertThat(resultStatus).hasSize(1);
+    assertThat(resultStatus).doesNotContain(CliStrings.GATEWAY_NOT_RUNNING);
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
     DistributedMember server3DM = getMember(server3.getVM());
@@ -304,17 +302,16 @@ public class StatusGatewaySenderCommandDUnitTest implements Serializable {
     CommandResult cmdResult = gfsh.executeCommand(command);
     assertThat(cmdResult).isNotNull();
 
-    TabularResultData tableResultData = ((CompositeResultData) cmdResult.getResultData())
-        .retrieveSection(CliStrings.SECTION_GATEWAY_SENDER_AVAILABLE)
-        .retrieveTable(CliStrings.TABLE_GATEWAY_SENDER);
-    List<String> result_Status = tableResultData.retrieveAllValues(CliStrings.RESULT_STATUS);
-    assertThat(result_Status).hasSize(2);
-    assertThat(result_Status).doesNotContain(CliStrings.GATEWAY_RUNNING);
-    tableResultData = ((CompositeResultData) cmdResult.getResultData())
-        .retrieveSection(CliStrings.SECTION_GATEWAY_SENDER_NOT_AVAILABLE)
-        .retrieveTable(CliStrings.TABLE_GATEWAY_SENDER);
-    List<String> result_hosts = tableResultData.retrieveAllValues(CliStrings.RESULT_HOST_MEMBER);
-    assertThat(result_hosts).hasSize(1);
+    TabularResultModel tableResultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.SECTION_GATEWAY_SENDER_AVAILABLE);
+    List<String> resultStatus = tableResultData.getValuesInColumn(CliStrings.RESULT_STATUS);
+    assertThat(resultStatus).hasSize(2);
+    assertThat(resultStatus).doesNotContain(CliStrings.GATEWAY_RUNNING);
+
+    tableResultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.SECTION_GATEWAY_SENDER_NOT_AVAILABLE);
+    List<String> resultHosts = tableResultData.getValuesInColumn(CliStrings.RESULT_HOST_MEMBER);
+    assertThat(resultHosts).hasSize(1);
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
     server1.invoke(() -> startSender("ln_Serial"));
@@ -343,18 +340,16 @@ public class StatusGatewaySenderCommandDUnitTest implements Serializable {
     cmdResult = gfsh.executeCommand(command);
     assertThat(cmdResult).isNotNull();
 
-    tableResultData = ((CompositeResultData) cmdResult.getResultData())
-        .retrieveSection(CliStrings.SECTION_GATEWAY_SENDER_AVAILABLE)
-        .retrieveTable(CliStrings.TABLE_GATEWAY_SENDER);
-    result_Status = tableResultData.retrieveAllValues(CliStrings.RESULT_STATUS);
-    assertThat(result_Status).hasSize(2);
-    assertThat(result_Status).doesNotContain(CliStrings.GATEWAY_NOT_RUNNING);
-
-    tableResultData = ((CompositeResultData) cmdResult.getResultData())
-        .retrieveSection(CliStrings.SECTION_GATEWAY_SENDER_NOT_AVAILABLE)
-        .retrieveTable(CliStrings.TABLE_GATEWAY_SENDER);
-    result_hosts = tableResultData.retrieveAllValues(CliStrings.RESULT_HOST_MEMBER);
-    assertThat(result_hosts).hasSize(1);
+    tableResultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.SECTION_GATEWAY_SENDER_AVAILABLE);
+    resultStatus = tableResultData.getValuesInColumn(CliStrings.RESULT_STATUS);
+    assertThat(resultStatus).hasSize(2);
+    assertThat(resultStatus).doesNotContain(CliStrings.GATEWAY_NOT_RUNNING);
+
+    tableResultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.SECTION_GATEWAY_SENDER_NOT_AVAILABLE);
+    resultHosts = tableResultData.getValuesInColumn(CliStrings.RESULT_HOST_MEMBER);
+    assertThat(resultHosts).hasSize(1);
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
   }
 
diff --git a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StopGatewayReceiverCommandDUnitTest.java b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StopGatewayReceiverCommandDUnitTest.java
index 0b365f1..b3737ed 100644
--- a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StopGatewayReceiverCommandDUnitTest.java
+++ b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StopGatewayReceiverCommandDUnitTest.java
@@ -37,7 +37,8 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.result.CommandResult;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
 import org.apache.geode.test.junit.categories.WanTest;
@@ -120,10 +121,10 @@ public class StopGatewayReceiverCommandDUnitTest implements Serializable {
     CommandResult cmdResult = gfsh.executeCommand(command);
     assertThat(cmdResult).isNotNull();
 
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(3);
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.STOP_GATEWAYRECEIVER);
+    List<String> status = resultData.getValuesInColumn("Result");
+    assertThat(status).containsExactlyInAnyOrder("OK", "OK", "OK");
 
     locatorSite1
         .invoke(() -> validateGatewayReceiverMXBeanProxy(getMember(server1.getVM()), false));
@@ -169,7 +170,11 @@ public class StopGatewayReceiverCommandDUnitTest implements Serializable {
 
     String strCmdResult = cmdResult.toString();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
-    assertThat(strCmdResult).contains("stopped on member");
+
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.STOP_GATEWAYRECEIVER);
+    List<String> messages = resultData.getValuesInColumn("Message");
+    assertThat(messages.get(0)).contains("is stopped on member");
 
     locatorSite1
         .invoke(() -> validateGatewayReceiverMXBeanProxy(getMember(server1.getVM()), false));
@@ -210,11 +215,10 @@ public class StopGatewayReceiverCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(3);
-    assertThat(status).doesNotContain("Error");
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.STOP_GATEWAYRECEIVER);
+    List<String> status = resultData.getValuesInColumn("Result");
+    assertThat(status).containsExactlyInAnyOrder("OK", "OK", "OK");
 
     locatorSite1
         .invoke(() -> validateGatewayReceiverMXBeanProxy(getMember(server1.getVM()), false));
@@ -267,11 +271,10 @@ public class StopGatewayReceiverCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(4);
-    assertThat(status).doesNotContain("Error");
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.STOP_GATEWAYRECEIVER);
+    List<String> status = resultData.getValuesInColumn("Result");
+    assertThat(status).containsExactlyInAnyOrder("OK", "OK", "OK", "OK");
 
     locatorSite1
         .invoke(() -> validateGatewayReceiverMXBeanProxy(getMember(server1.getVM()), false));
diff --git a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StopGatewaySenderCommandDUnitTest.java b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StopGatewaySenderCommandDUnitTest.java
index 5bc61bd..f31f5b2 100644
--- a/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StopGatewaySenderCommandDUnitTest.java
+++ b/geode-wan/src/distributedTest/java/org/apache/geode/internal/cache/wan/wancommand/StopGatewaySenderCommandDUnitTest.java
@@ -37,7 +37,8 @@ import org.apache.geode.distributed.DistributedMember;
 import org.apache.geode.management.cli.Result;
 import org.apache.geode.management.internal.cli.i18n.CliStrings;
 import org.apache.geode.management.internal.cli.result.CommandResult;
-import org.apache.geode.management.internal.cli.result.TabularResultData;
+import org.apache.geode.management.internal.cli.result.model.ResultModel;
+import org.apache.geode.management.internal.cli.result.model.TabularResultModel;
 import org.apache.geode.test.dunit.IgnoredException;
 import org.apache.geode.test.dunit.rules.ClusterStartupRule;
 import org.apache.geode.test.dunit.rules.MemberVM;
@@ -127,10 +128,10 @@ public class StopGatewaySenderCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(3);
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.STOP_GATEWAYSENDER);
+    List<String> status = resultData.getValuesInColumn("Result");
+    assertThat(status).containsExactlyInAnyOrder("OK", "OK", "OK");
 
     locatorSite1.invoke(
         () -> validateGatewaySenderMXBeanProxy(getMember(server1.getVM()), "ln", false, false));
@@ -167,9 +168,12 @@ public class StopGatewaySenderCommandDUnitTest implements Serializable {
     CommandResult cmdResult = executeCommandWithIgnoredExceptions(command);
     assertThat(cmdResult).isNotNull();
 
-    String strCmdResult = cmdResult.toString();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
-    assertThat(strCmdResult).contains("is stopped on member");
+
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.STOP_GATEWAYSENDER);
+    List<String> messages = resultData.getValuesInColumn("Message");
+    assertThat(messages.get(0)).contains("is stopped on member");
 
     locatorSite1.invoke(
         () -> validateGatewaySenderMXBeanProxy(getMember(server1.getVM()), "ln", false, false));
@@ -214,11 +218,10 @@ public class StopGatewaySenderCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(3);
-    assertThat(status).doesNotContain("Error");
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.STOP_GATEWAYSENDER);
+    List<String> status = resultData.getValuesInColumn("Result");
+    assertThat(status).containsExactlyInAnyOrder("OK", "OK", "OK");
 
     locatorSite1.invoke(
         () -> validateGatewaySenderMXBeanProxy(getMember(server1.getVM()), "ln", false, false));
@@ -282,11 +285,10 @@ public class StopGatewaySenderCommandDUnitTest implements Serializable {
     assertThat(cmdResult).isNotNull();
     assertThat(cmdResult.getStatus()).isSameAs(Result.Status.OK);
 
-    TabularResultData resultData = (TabularResultData) cmdResult.getResultData();
-    List<String> status = resultData.retrieveAllValues("Result");
-    assertThat(status).hasSize(4);
-    assertThat(status).doesNotContain("Error");
-    assertThat(status).contains("OK");
+    TabularResultModel resultData = ((ResultModel) cmdResult.getResultData())
+        .getTableSection(CliStrings.STOP_GATEWAYSENDER);
+    List<String> status = resultData.getValuesInColumn("Result");
+    assertThat(status).containsExactlyInAnyOrder("OK", "OK", "OK", "OK");
 
     locatorSite1.invoke(
         () -> validateGatewaySenderMXBeanProxy(getMember(server1.getVM()), "ln", false, false));