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 2b061d2..38076aa 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
@@ -101,11 +101,11 @@
     private void printMetricsStats(ControlPlaneMonitorService service, NodeId nodeId,
                                    Set<ControlMetricType> typeSet, String name, DeviceId did) {
         if (name == null && did == null) {
-            typeSet.forEach(s -> print(s, service.getLoad(nodeId, s, Optional.ofNullable(null))));
+            typeSet.forEach(s -> print(s, service.getLocalLoad(s, Optional.ofNullable(null))));
         } else if (name == null && did != null) {
-            typeSet.forEach(s -> print(s, service.getLoad(nodeId, s, Optional.of(did))));
+            typeSet.forEach(s -> print(s, service.getLocalLoad(s, Optional.of(did))));
         } else if (name != null && did == null) {
-            typeSet.forEach(s -> print(s, service.getLoad(nodeId, s, name)));
+            typeSet.forEach(s -> print(s, service.getLocalLoad(s, name)));
         }
     }
 
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlMetricsRequest.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlMetricsRequest.java
new file mode 100644
index 0000000..4981a61
--- /dev/null
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlMetricsRequest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * Licensed 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.onosproject.cpman.impl;
+
+import com.google.common.base.MoreObjects;
+import org.onosproject.cpman.ControlMetricType;
+import org.onosproject.net.DeviceId;
+
+import java.util.Objects;
+import java.util.Optional;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+/**
+ * A container class that is used to request control metric of remote node.
+ */
+public class ControlMetricsRequest {
+    private final ControlMetricType type;
+    private Optional<DeviceId> deviceId;
+    private String resourceName;
+
+    /**
+     * Instantiates a new control metric request with the given control metric
+     * type and device identifier.
+     *
+     * @param type     control metric type
+     * @param deviceId device identifier
+     */
+    public ControlMetricsRequest(ControlMetricType type, Optional<DeviceId> deviceId) {
+        this.type = type;
+        this.deviceId = deviceId;
+    }
+
+    /**
+     * Instantiates a new control metric request with the given control metric
+     * type and resource name.
+     *
+     * @param type         control metric type
+     * @param resourceName resource name
+     */
+    public ControlMetricsRequest(ControlMetricType type, String resourceName) {
+        this.type = type;
+        this.resourceName = resourceName;
+    }
+
+    /**
+     * Obtains control metric type.
+     *
+     * @return control metric type
+     */
+    public ControlMetricType getType() {
+        return type;
+    }
+
+    /**
+     * Obtains resource name.
+     *
+     * @return resource name
+     */
+    public String getResourceName() {
+        return resourceName;
+    }
+
+    /**
+     * Obtains device identifier.
+     *
+     * @return device identifier
+     */
+    public Optional<DeviceId> getDeviceId() {
+        return deviceId;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type, deviceId, resourceName);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof ControlMetricsRequest) {
+            final ControlMetricsRequest other = (ControlMetricsRequest) obj;
+            return Objects.equals(this.type, other.type) &&
+                    Objects.equals(this.deviceId, other.deviceId) &&
+                    Objects.equals(this.resourceName, other.resourceName);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        MoreObjects.ToStringHelper helper;
+        helper = toStringHelper(this)
+                .add("type", type)
+                .add("resourceName", resourceName);
+        if (deviceId != null) {
+            helper.add("deviceId", deviceId.get());
+        }
+        return helper.toString();
+    }
+}
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlPlaneMonitor.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlPlaneMonitor.java
index 77e8e89..9b276c3 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlPlaneMonitor.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/impl/ControlPlaneMonitor.java
@@ -24,8 +24,8 @@
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
 import org.apache.felix.scr.annotations.Service;
+import org.onlab.util.KryoNamespace;
 import org.onosproject.cluster.ClusterService;
-import org.onosproject.cluster.ControllerNode;
 import org.onosproject.cluster.NodeId;
 import org.onosproject.cpman.ControlLoad;
 import org.onosproject.cpman.ControlMetric;
@@ -33,15 +33,29 @@
 import org.onosproject.cpman.ControlPlaneMonitorService;
 import org.onosproject.cpman.MetricsDatabase;
 import org.onosproject.net.DeviceId;
+import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
+import org.onosproject.store.cluster.messaging.MessageSubject;
+import org.onosproject.store.serializers.KryoNamespaces;
+import org.onosproject.store.service.Serializer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
 
-import static org.onosproject.cpman.ControlResource.*;
+import static com.google.common.base.Preconditions.checkArgument;
+import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.cpman.ControlResource.CONTROL_MESSAGE_METRICS;
+import static org.onosproject.cpman.ControlResource.CPU_METRICS;
+import static org.onosproject.cpman.ControlResource.DISK_METRICS;
+import static org.onosproject.cpman.ControlResource.MEMORY_METRICS;
+import static org.onosproject.cpman.ControlResource.NETWORK_METRICS;
+import static org.onosproject.cpman.ControlResource.Type;
 
 /**
  * Control plane monitoring service class.
@@ -60,9 +74,15 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected ClusterService clusterService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ClusterCommunicationService communicationService;
+
     private static final Set RESOURCE_TYPE_SET =
             ImmutableSet.of(Type.CONTROL_MESSAGE, Type.DISK, Type.NETWORK);
 
+    private static final MessageSubject CONTROL_STATS =
+                         new MessageSubject("control-plane-stats");
+
     private Map<ControlMetricType, Double> cpuBuf;
     private Map<ControlMetricType, Double> memoryBuf;
     private Map<String, Map<ControlMetricType, Double>> diskBuf;
@@ -72,6 +92,19 @@
     private Map<Type, Set<String>> availableResourceMap;
     private Set<DeviceId> availableDeviceIdSet;
 
+    private ExecutorService messageHandlingExecutor;
+
+    private static final String METRIC_TYPE_NULL = "Control metric type cannot be null";
+
+    private static final Serializer SERIALIZER = Serializer
+            .using(new KryoNamespace.Builder()
+                    .register(KryoNamespaces.API)
+                    .register(ControlMetricsRequest.class)
+                    .register(DefaultControlLoad.class)
+                    .register(DefaultMetricsDatabase.class)
+                    .register(ControlMetricType.class)
+                    .nextId(KryoNamespaces.BEGIN_USER_CUSTOM_ID).build());
+
     @Activate
     public void activate() {
         cpuMetrics = genMDbBuilder(Type.CPU, CPU_METRICS);
@@ -89,6 +122,12 @@
         availableResourceMap = Maps.newConcurrentMap();
         availableDeviceIdSet = Sets.newConcurrentHashSet();
 
+        messageHandlingExecutor = Executors.newSingleThreadScheduledExecutor(
+                groupedThreads("onos/app/cpman", "message-handlers"));
+
+        communicationService.addSubscriber(CONTROL_STATS,
+                SERIALIZER::decode, this::handleRequest, messageHandlingExecutor);
+
         log.info("Started");
     }
 
@@ -102,6 +141,8 @@
         networkBuf.clear();
         ctrlMsgBuf.clear();
 
+        communicationService.removeSubscriber(CONTROL_STATS);
+
         log.info("Stopped");
     }
 
@@ -197,55 +238,59 @@
     }
 
     @Override
-    public ControlLoad getLoad(NodeId nodeId, ControlMetricType type,
-                               Optional<DeviceId> deviceId) {
-        ControllerNode node = clusterService.getNode(nodeId);
-        if (clusterService.getLocalNode().equals(node)) {
-
-            if (deviceId.isPresent()) {
-                if (CONTROL_MESSAGE_METRICS.contains(type) &&
-                        availableDeviceIdSet.contains(deviceId.get())) {
-                    return new DefaultControlLoad(controlMessageMap.get(deviceId.get()), type);
-                }
-            } else {
-                // returns controlLoad of CPU metrics
-                if (CPU_METRICS.contains(type)) {
-                    return new DefaultControlLoad(cpuMetrics, type);
-                }
-
-                // returns memoryLoad of memory metrics
-                if (MEMORY_METRICS.contains(type)) {
-                    return new DefaultControlLoad(memoryMetrics, type);
-                }
+    public ControlLoad getLocalLoad(ControlMetricType type,
+                                    Optional<DeviceId> deviceId) {
+        if (deviceId.isPresent()) {
+            if (CONTROL_MESSAGE_METRICS.contains(type) &&
+                    availableDeviceIdSet.contains(deviceId.get())) {
+                return new DefaultControlLoad(controlMessageMap.get(deviceId.get()), type);
             }
         } else {
-            // TODO: currently only query the metrics of local node
-            return null;
+            // returns controlLoad of CPU metrics
+            if (CPU_METRICS.contains(type)) {
+                return new DefaultControlLoad(cpuMetrics, type);
+            }
+
+            // returns memoryLoad of memory metrics
+            if (MEMORY_METRICS.contains(type)) {
+                return new DefaultControlLoad(memoryMetrics, type);
+            }
         }
         return null;
     }
 
     @Override
-    public ControlLoad getLoad(NodeId nodeId, ControlMetricType type,
-                               String resourceName) {
-        if (clusterService.getLocalNode().id().equals(nodeId)) {
-            if (DISK_METRICS.contains(type) &&
-                    availableResources(Type.DISK).contains(resourceName)) {
-                return new DefaultControlLoad(diskMetricsMap.get(resourceName), type);
-            }
+    public ControlLoad getLocalLoad(ControlMetricType type, String resourceName) {
+        if (DISK_METRICS.contains(type) &&
+                availableResources(Type.DISK).contains(resourceName)) {
+            return new DefaultControlLoad(diskMetricsMap.get(resourceName), type);
+        }
 
-            if (NETWORK_METRICS.contains(type) &&
-                    availableResources(Type.NETWORK).contains(resourceName)) {
-                return new DefaultControlLoad(networkMetricsMap.get(resourceName), type);
-            }
-        } else {
-            // TODO: currently only query the metrics of local node
-            return null;
+        if (NETWORK_METRICS.contains(type) &&
+                availableResources(Type.NETWORK).contains(resourceName)) {
+            return new DefaultControlLoad(networkMetricsMap.get(resourceName), type);
         }
         return null;
     }
 
     @Override
+    public CompletableFuture<ControlLoad> getRemoteLoad(NodeId nodeId,
+                                                        ControlMetricType type,
+                                                        Optional<DeviceId> deviceId) {
+        return communicationService.sendAndReceive(createRequest(type, deviceId),
+                CONTROL_STATS, SERIALIZER::encode, SERIALIZER::decode, nodeId);
+    }
+
+    @Override
+    public CompletableFuture<ControlLoad> getRemoteLoad(NodeId nodeId,
+                                                        ControlMetricType type,
+                                                        String resourceName) {
+        return communicationService.sendAndReceive(createRequest(type, resourceName),
+                CONTROL_STATS, SERIALIZER::encode, SERIALIZER::decode, nodeId);
+    }
+
+
+    @Override
     public Set<String> availableResources(Type resourceType) {
         if (RESOURCE_TYPE_SET.contains(resourceType)) {
             if (Type.CONTROL_MESSAGE.equals(resourceType)) {
@@ -291,4 +336,27 @@
         map.forEach((k, v) -> newMap.putIfAbsent(k.toString(), v));
         return newMap;
     }
-}
\ No newline at end of file
+
+    private CompletableFuture<ControlLoad> handleRequest(ControlMetricsRequest request) {
+
+        checkArgument(request.getType() != null, METRIC_TYPE_NULL);
+
+        ControlLoad load;
+        if (request.getResourceName() != null) {
+            load = getLocalLoad(request.getType(), request.getResourceName());
+        } else {
+            load = getLocalLoad(request.getType(), request.getDeviceId());
+        }
+        return CompletableFuture.completedFuture(load);
+    }
+
+    private ControlMetricsRequest createRequest(ControlMetricType type,
+                                                Optional<DeviceId> deviceId) {
+        return new ControlMetricsRequest(type, deviceId);
+    }
+
+    private ControlMetricsRequest createRequest(ControlMetricType type,
+                                                String resourceName) {
+        return new ControlMetricsRequest(type, resourceName);
+    }
+}
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 4c61973..d6b454b 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
@@ -241,17 +241,17 @@
         if (name == null && did == null) {
             typeSet.forEach(type -> {
                 ObjectNode metricNode = mapper().createObjectNode();
-                ControlLoad load = service.getLoad(nodeId, type, Optional.ofNullable(null));
+                ControlLoad load = service.getLocalLoad(type, Optional.ofNullable(null));
                 if (load != null) {
                     metricNode.set(type.toString().toLowerCase(), codec(ControlLoad.class)
-                            .encode(service.getLoad(nodeId, type, Optional.ofNullable(null)), this));
+                            .encode(service.getLocalLoad(type, Optional.ofNullable(null)), this));
                     metricsNode.add(metricNode);
                 }
             });
         } else if (name == null) {
             typeSet.forEach(type -> {
                 ObjectNode metricNode = mapper().createObjectNode();
-                ControlLoad load = service.getLoad(nodeId, type, Optional.of(did));
+                ControlLoad load = service.getLocalLoad(type, Optional.of(did));
                 if (load != null) {
                     metricNode.set(type.toString().toLowerCase(),
                             codec(ControlLoad.class).encode(load, this));
@@ -261,7 +261,7 @@
         } else if (did == null) {
             typeSet.forEach(type -> {
                 ObjectNode metricNode = mapper().createObjectNode();
-                ControlLoad load = service.getLoad(nodeId, type, name);
+                ControlLoad load = service.getLocalLoad(type, name);
                 if (load != null) {
                     metricNode.set(type.toString().toLowerCase(),
                             codec(ControlLoad.class).encode(load, this));
