diff --git a/apps/cpman/api/src/main/java/org/onosproject/cpman/ControlPlaneMonitorService.java b/apps/cpman/api/src/main/java/org/onosproject/cpman/ControlPlaneMonitorService.java
index da97948..353a947 100644
--- a/apps/cpman/api/src/main/java/org/onosproject/cpman/ControlPlaneMonitorService.java
+++ b/apps/cpman/api/src/main/java/org/onosproject/cpman/ControlPlaneMonitorService.java
@@ -73,6 +73,26 @@
                                                    Optional<DeviceId> deviceId);
 
     /**
+     * Synchronous version of getLoad.
+     * Obtains snapshot of control plane load of a specific device.
+     * The metrics range from control messages and system metrics
+     * (e.g., CPU and memory info).
+     * If the device id is not specified, it returns system metrics, otherwise,
+     * it returns control message stats of the given device.
+     *
+     * @param nodeId   node identifier
+     * @param type     control metric type
+     * @param deviceId device identifier
+     * @return control load snapshot
+     */
+    default ControlLoadSnapshot getLoadSync(NodeId nodeId,
+                                            ControlMetricType type,
+                                            Optional<DeviceId> deviceId) {
+        return Tools.futureGetOrElse(getLoad(nodeId, type, deviceId),
+                TIMEOUT_MILLIS, TimeUnit.MILLISECONDS, null);
+    }
+
+    /**
      * Obtains snapshot of control plane load of a specific resource.
      * The metrics include I/O device metrics (e.g., disk and network metrics).
      *
@@ -86,6 +106,23 @@
                                                    String resourceName);
 
     /**
+     * Synchronous version of getLoad.
+     * Obtains snapshot of control plane load of a specific resource.
+     * The metrics include I/O device metrics (e.g., disk and network metrics).
+     *
+     * @param nodeId       node identifier
+     * @param type         control metric type
+     * @param resourceName resource name
+     * @return control load snapshot
+     */
+    default ControlLoadSnapshot getLoadSync(NodeId nodeId,
+                                            ControlMetricType type,
+                                            String resourceName) {
+        return Tools.futureGetOrElse(getLoad(nodeId, type, resourceName),
+                TIMEOUT_MILLIS, TimeUnit.MILLISECONDS, null);
+    }
+
+    /**
      * Obtains snapshot of control plane load of a specific device with the
      * projected range.
      *
@@ -102,6 +139,26 @@
                                                    Optional<DeviceId> deviceId);
 
     /**
+     * Synchronous version of getLoad.
+     * Obtains snapshot of control plane load of a specific device with the
+     * projected range.
+     *
+     * @param nodeId   node identifier
+     * @param type     control metric type
+     * @param duration projected duration
+     * @param unit     projected time unit
+     * @param deviceId device identifier
+     * @return control load snapshot
+     */
+    default ControlLoadSnapshot getLoadSync(NodeId nodeId,
+                                            ControlMetricType type,
+                                            int duration, TimeUnit unit,
+                                            Optional<DeviceId> deviceId) {
+        return Tools.futureGetOrElse(getLoad(nodeId, type, duration, unit, deviceId),
+                TIMEOUT_MILLIS, TimeUnit.MILLISECONDS, null);
+    }
+
+    /**
      * Obtains snapshot of control plane load of a specific resource with the
      * projected range.
      *
@@ -118,6 +175,26 @@
                                                    String resourceName);
 
     /**
+     * Synchronous version of getLoad.
+     * Obtains snapshot of control plane load of a specific resource with the
+     * projected range.
+     *
+     * @param nodeId       node identifier
+     * @param type         control metric type
+     * @param duration     projected duration
+     * @param unit         projected time unit
+     * @param resourceName resource name
+     * @return control load snapshot
+     */
+    default ControlLoadSnapshot getLoadSync(NodeId nodeId,
+                                            ControlMetricType type,
+                                            int duration, TimeUnit unit,
+                                            String resourceName) {
+        return Tools.futureGetOrElse(getLoad(nodeId, type, duration, unit, resourceName),
+                TIMEOUT_MILLIS, TimeUnit.MILLISECONDS, null);
+    }
+
+    /**
      * Obtains a list of names of available resources.
      *
      * @param nodeId       node identifier
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ControlMetricsStatsListCommand.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ControlMetricsStatsListCommand.java
index adf65a9..c8ab177 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ControlMetricsStatsListCommand.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/cli/ControlMetricsStatsListCommand.java
@@ -17,7 +17,6 @@
 
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
-import org.onlab.util.Tools;
 import org.onosproject.cli.AbstractShellCommand;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.cpman.ControlLoadSnapshot;
@@ -27,8 +26,6 @@
 
 import java.util.Optional;
 import java.util.Set;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
 
 import static org.onosproject.cpman.ControlResource.CONTROL_MESSAGE_METRICS;
 import static org.onosproject.cpman.ControlResource.CPU_METRICS;
@@ -47,8 +44,6 @@
             "averageValue=%d, latestTime=%s";
     private static final String INVALID_TYPE = "Invalid control resource type.";
 
-    private static final long TIMEOUT_MILLIS = 3000;
-
     @Argument(index = 0, name = "node", description = "ONOS node identifier",
             required = true, multiValued = false)
     String node = null;
@@ -91,51 +86,80 @@
         }
     }
 
+    /**
+     * Prints system metric statistic information.
+     *
+     * @param service monitor service
+     * @param nodeId  node identifier
+     * @param typeSet control metric type
+     */
     private void printMetricsStats(ControlPlaneMonitorService service, NodeId nodeId,
                                    Set<ControlMetricType> typeSet) {
         printMetricsStats(service, nodeId, typeSet, null, null);
     }
 
+    /**
+     * Prints disk and network metric statistic information.
+     *
+     * @param service monitor service
+     * @param nodeId  node identifier
+     * @param typeSet control metric type
+     * @param resName resource name
+     */
     private void printMetricsStats(ControlPlaneMonitorService service, NodeId nodeId,
                                    Set<ControlMetricType> typeSet, String resName) {
         printMetricsStats(service, nodeId, typeSet, resName, null);
     }
 
+    /**
+     * Prints control message metric statistic information.
+     *
+     * @param service monitor service
+     * @param nodeId  node identifier
+     * @param typeSet control metric type
+     * @param did     device identifier
+     */
     private void printMetricsStats(ControlPlaneMonitorService service, NodeId nodeId,
                                    Set<ControlMetricType> typeSet, DeviceId did) {
         printMetricsStats(service, nodeId, typeSet, null, did);
     }
 
+    /**
+     * Prints control plane metric statistic information.
+     *
+     * @param service monitor service
+     * @param nodeId  node identifier
+     * @param typeSet control metric type
+     * @param resName resource name
+     * @param did     device identifier
+     */
     private void printMetricsStats(ControlPlaneMonitorService service, NodeId nodeId,
                                    Set<ControlMetricType> typeSet, String resName, DeviceId did) {
         if (resName == null && did == null) {
             typeSet.forEach(s -> {
-                CompletableFuture<ControlLoadSnapshot> cf =
-                        service.getLoad(nodeId, s, Optional.empty());
-                ControlLoadSnapshot cmr =
-                        Tools.futureGetOrElse(cf, TIMEOUT_MILLIS, TimeUnit.MILLISECONDS, null);
-                printRemote(s, cmr);
+                ControlLoadSnapshot cls = service.getLoadSync(nodeId, s, Optional.empty());
+                printControlLoadSnapshot(s, cls);
             });
-        } else if (resName == null && did != null) {
+        } else if (resName == null) {
             typeSet.forEach(s -> {
-                CompletableFuture<ControlLoadSnapshot> cf =
-                        service.getLoad(nodeId, s, Optional.of(did));
-                ControlLoadSnapshot cmr =
-                        Tools.futureGetOrElse(cf, TIMEOUT_MILLIS, TimeUnit.MILLISECONDS, null);
-                printRemote(s, cmr);
+                ControlLoadSnapshot cls = service.getLoadSync(nodeId, s, Optional.of(did));
+                printControlLoadSnapshot(s, cls);
             });
-        } else if (resName != null && did == null) {
+        } else if (did == null) {
             typeSet.forEach(s -> {
-                CompletableFuture<ControlLoadSnapshot> cf =
-                        service.getLoad(nodeId, s, resName);
-                ControlLoadSnapshot cmr =
-                        Tools.futureGetOrElse(cf, TIMEOUT_MILLIS, TimeUnit.MILLISECONDS, null);
-                printRemote(s, cmr);
+                ControlLoadSnapshot cls = service.getLoadSync(nodeId, s, resName);
+                printControlLoadSnapshot(s, cls);
             });
         }
     }
 
-    private void printRemote(ControlMetricType cmType, ControlLoadSnapshot cls) {
+    /**
+     * Prints control load snapshot.
+     *
+     * @param cmType control metric type
+     * @param cls    control load snapshot
+     */
+    private void printControlLoadSnapshot(ControlMetricType cmType, ControlLoadSnapshot cls) {
         if (cls != null) {
             print(FMT, cmType.toString(), cls.latest(), cls.average(), cls.time());
         } else {
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/gui/CpmanViewMessageHandler.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/gui/CpmanViewMessageHandler.java
index 22ad36c..a5f220d 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/gui/CpmanViewMessageHandler.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/gui/CpmanViewMessageHandler.java
@@ -149,21 +149,15 @@
                                                               ClusterService cs, DeviceId deviceId) {
             Map<ControlMetricType, Long[]> data = Maps.newHashMap();
             for (ControlMetricType cmt : CONTROL_MESSAGE_METRICS) {
-                ControlLoadSnapshot cls;
-                try {
-                    cls = cpms.getLoad(cs.getLocalNode().id(),
-                            cmt, NUM_OF_DATA_POINTS, TimeUnit.MINUTES,
-                            Optional.of(deviceId)).get();
+                ControlLoadSnapshot cls = cpms.getLoadSync(cs.getLocalNode().id(),
+                        cmt, NUM_OF_DATA_POINTS, TimeUnit.MINUTES, Optional.of(deviceId));
 
-                    // TODO: in some cases, the number of returned dataset is
-                    // less than what we expected (expected -1)
-                    // As a workaround, we simply fill the slot with 0 values,
-                    // such a bug should be fixed with updated RRD4J lib...
-                    data.put(cmt, ArrayUtils.toObject(fillData(cls.recent(), NUM_OF_DATA_POINTS)));
-                    timestamp = cls.time();
-                } catch (InterruptedException | ExecutionException e) {
-                    log.warn(e.getMessage());
-                }
+                // TODO: in some cases, the number of returned data set is
+                // less than what we expected (expected -1)
+                // As a workaround, we simply fill the slot with 0 values,
+                // such a bug should be fixed with updated RRD4J lib...
+                data.put(cmt, ArrayUtils.toObject(fillData(cls.recent(), NUM_OF_DATA_POINTS)));
+                timestamp = cls.time();
             }
             return data;
         }
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/ControlMetricsWebResource.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/ControlMetricsWebResource.java
index b18a6b5..f8af1b0 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/ControlMetricsWebResource.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/ControlMetricsWebResource.java
@@ -18,7 +18,6 @@
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.commons.lang3.StringUtils;
-import org.onlab.util.Tools;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.cpman.ControlLoadSnapshot;
@@ -35,8 +34,6 @@
 import javax.ws.rs.core.Response;
 import java.util.Optional;
 import java.util.Set;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
 
 import static org.onosproject.cpman.ControlResource.CONTROL_MESSAGE_METRICS;
 import static org.onosproject.cpman.ControlResource.CPU_METRICS;
@@ -58,7 +55,6 @@
     private final ClusterService clusterService = get(ClusterService.class);
     private final NodeId localNodeId = clusterService.getLocalNode().id();
     private final ObjectNode root = mapper().createObjectNode();
-    private static final long TIMEOUT_MILLIS = 1000;
 
     /**
      * Returns control message metrics of all devices.
@@ -251,59 +247,32 @@
 
         if (name == null && did == null) {
             typeSet.forEach(type -> {
-                ObjectNode metricNode = mapper().createObjectNode();
-                CompletableFuture<ControlLoadSnapshot> cf =
-                        service.getLoad(nodeId, type, Optional.empty());
-
-                if (cf != null) {
-                    ControlLoadSnapshot cmr =
-                            Tools.futureGetOrElse(cf, TIMEOUT_MILLIS, TimeUnit.MILLISECONDS, null);
-
-                    if (cmr != null) {
-                        metricNode.set(toCamelCase(type.toString(), true),
-                                codec(ControlLoadSnapshot.class).encode(cmr, this));
-                        metricsNode.add(metricNode);
-                    }
-                }
+                ControlLoadSnapshot cls = service.getLoadSync(nodeId, type, Optional.empty());
+                processRest(cls, type, metricsNode);
             });
         } else if (name == null) {
             typeSet.forEach(type -> {
-                ObjectNode metricNode = mapper().createObjectNode();
-                CompletableFuture<ControlLoadSnapshot> cf =
-                        service.getLoad(nodeId, type, Optional.of(did));
-
-                if (cf != null) {
-                    ControlLoadSnapshot cmr =
-                            Tools.futureGetOrElse(cf, TIMEOUT_MILLIS, TimeUnit.MILLISECONDS, null);
-                    if (cmr != null) {
-                        metricNode.set(toCamelCase(type.toString(), true),
-                                codec(ControlLoadSnapshot.class).encode(cmr, this));
-                        metricsNode.add(metricNode);
-                    }
-                }
-
+                ControlLoadSnapshot cls = service.getLoadSync(nodeId, type, Optional.of(did));
+                processRest(cls, type, metricsNode);
             });
         } else if (did == null) {
             typeSet.forEach(type -> {
-                ObjectNode metricNode = mapper().createObjectNode();
-                CompletableFuture<ControlLoadSnapshot> cf =
-                        service.getLoad(nodeId, type, name);
-
-                if (cf != null) {
-                    ControlLoadSnapshot cmr =
-                            Tools.futureGetOrElse(cf, TIMEOUT_MILLIS, TimeUnit.MILLISECONDS, null);
-                    if (cmr != null) {
-                        metricNode.set(toCamelCase(type.toString(), true),
-                                codec(ControlLoadSnapshot.class).encode(cmr, this));
-                        metricsNode.add(metricNode);
-                    }
-                }
+                ControlLoadSnapshot cls = service.getLoadSync(nodeId, type, name);
+                processRest(cls, type, metricsNode);
             });
         }
 
         return metricsNode;
     }
 
+    /**
+     * Camelizes the input string.
+     *
+     * @param value              original string
+     * @param startWithLowerCase flag that determines whether to use lower case
+     *                           for the camelized string
+     * @return camelized string
+     */
     private String toCamelCase(String value, boolean startWithLowerCase) {
         String[] strings = StringUtils.split(value.toLowerCase(), "_");
         for (int i = startWithLowerCase ? 1 : 0; i < strings.length; i++) {
@@ -311,4 +280,21 @@
         }
         return StringUtils.join(strings);
     }
+
+    /**
+     * Transforms control load snapshot object into JSON object.
+     *
+     * @param cls         control load snapshot
+     * @param type        control metric type
+     * @param metricsNode array of JSON node
+     */
+    private void processRest(ControlLoadSnapshot cls, ControlMetricType type, ArrayNode metricsNode) {
+        ObjectNode metricNode = mapper().createObjectNode();
+
+        if (cls != null) {
+            metricNode.set(toCamelCase(type.toString(), true),
+                    codec(ControlLoadSnapshot.class).encode(cls, this));
+            metricsNode.add(metricNode);
+        }
+    }
 }
diff --git a/apps/cpman/app/src/test/java/org/onosproject/cpman/rest/ControlMetricsResourceTest.java b/apps/cpman/app/src/test/java/org/onosproject/cpman/rest/ControlMetricsResourceTest.java
index 24f659b..ac1ea27 100644
--- a/apps/cpman/app/src/test/java/org/onosproject/cpman/rest/ControlMetricsResourceTest.java
+++ b/apps/cpman/app/src/test/java/org/onosproject/cpman/rest/ControlMetricsResourceTest.java
@@ -183,7 +183,7 @@
     public void testResourcePopulatedArray() {
         expect(mockControlPlaneMonitorService.availableResourcesSync(anyObject(), anyObject()))
                 .andReturn(resourceSet).once();
-        expect(mockControlPlaneMonitorService.getLoad(anyObject(), anyObject(),
+        expect(mockControlPlaneMonitorService.getLoadSync(anyObject(), anyObject(),
                 anyString())).andReturn(null).times(4);
         replay(mockControlPlaneMonitorService);
 
