diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/CPManCodecRegistrator.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/CPManCodecRegistrator.java
new file mode 100644
index 0000000..d710e7f
--- /dev/null
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/CPManCodecRegistrator.java
@@ -0,0 +1,52 @@
+/*
+ * 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.rest;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onosproject.codec.CodecService;
+import org.onosproject.cpman.ControlLoad;
+import org.onosproject.cpman.codec.ControlLoadCodec;
+import org.slf4j.Logger;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Implementation of the JSON codec brokering service for CPMan app.
+ */
+@Component(immediate = true)
+public class CPManCodecRegistrator {
+
+    private final Logger log = getLogger(getClass());
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CodecService codecService;
+
+    @Activate
+    public void activate() {
+        codecService.registerCodec(ControlLoad.class, new ControlLoadCodec());
+
+        log.info("Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        log.info("Stopped");
+    }
+}
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/CPManWebApplication.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/CPManWebApplication.java
index 26566f8..fc90e41 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/CPManWebApplication.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/CPManWebApplication.java
@@ -26,6 +26,7 @@
 public class CPManWebApplication extends AbstractWebApplication {
     @Override
     public Set<Class<?>> getClasses() {
-        return getClasses(ControlMetricsCollectorWebResource.class);
+        return getClasses(SystemMetricsCollectorWebResource.class,
+                          ControlMetricsWebResource.class);
     }
 }
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
new file mode 100644
index 0000000..4c61973
--- /dev/null
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/ControlMetricsWebResource.java
@@ -0,0 +1,275 @@
+/*
+ * 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.rest;
+
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onosproject.cluster.ClusterService;
+import org.onosproject.cluster.NodeId;
+import org.onosproject.cpman.ControlLoad;
+import org.onosproject.cpman.ControlMetricType;
+import org.onosproject.cpman.ControlPlaneMonitorService;
+import org.onosproject.net.DeviceId;
+import org.onosproject.rest.AbstractWebResource;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.util.Optional;
+import java.util.Set;
+
+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_MESSAGE;
+import static org.onosproject.cpman.ControlResource.Type.DISK;
+import static org.onosproject.cpman.ControlResource.Type.NETWORK;
+
+/**
+ * Query control metrics.
+ */
+@Path("metrics")
+public class ControlMetricsWebResource extends AbstractWebResource {
+
+    private final ControlPlaneMonitorService monitorService =
+                    get(ControlPlaneMonitorService.class);
+    private final ClusterService clusterService = get(ClusterService.class);
+    private final NodeId localNodeId = clusterService.getLocalNode().id();
+    private final ObjectNode root = mapper().createObjectNode();
+
+    /**
+     * Returns control message metrics of all devices.
+     *
+     * @return array of all control message metrics
+     */
+    @GET
+    @Path("messages")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response controlMessageMetrics() {
+
+        ArrayNode deviceNodes = root.putArray("devices");
+        monitorService.availableResources(CONTROL_MESSAGE).forEach(name -> {
+            ObjectNode deviceNode = mapper().createObjectNode();
+            ObjectNode valueNode = mapper().createObjectNode();
+
+            metricsStats(monitorService, localNodeId, CONTROL_MESSAGE_METRICS,
+                    DeviceId.deviceId(name), valueNode);
+            deviceNode.put("name", name);
+            deviceNode.set("value", valueNode);
+
+            deviceNodes.add(deviceNode);
+        });
+
+        return ok(root).build();
+    }
+
+    /**
+     * Returns control message metrics of a given device.
+     *
+     * @param deviceId device identification
+     * @return control message metrics of a given device
+     */
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("messages/{deviceId}")
+    public Response controlMessageMetrics(@PathParam("deviceId") String deviceId) {
+
+        metricsStats(monitorService, localNodeId, CONTROL_MESSAGE_METRICS,
+                DeviceId.deviceId(deviceId), root);
+
+        return ok(root).build();
+    }
+
+    /**
+     * Returns cpu metrics.
+     *
+     * @return cpu metrics
+     */
+    @GET
+    @Path("cpu_metrics")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response cpuMetrics() {
+
+        metricsStats(monitorService, localNodeId, CPU_METRICS, root);
+        return ok(root).build();
+    }
+
+    /**
+     * Returns memory metrics.
+     *
+     * @return memory metrics
+     */
+    @GET
+    @Path("memory_metrics")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response memoryMetrics() {
+
+        metricsStats(monitorService, localNodeId, MEMORY_METRICS, root);
+        return ok(root).build();
+    }
+
+    /**
+     * Returns disk metrics of all resources.
+     *
+     * @return disk metrics of all resources
+     */
+    @GET
+    @Path("disk_metrics")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response diskMetrics() {
+
+        ArrayNode diskNodes = root.putArray("disks");
+        monitorService.availableResources(DISK).forEach(name -> {
+            ObjectNode diskNode = mapper().createObjectNode();
+            ObjectNode valueNode = mapper().createObjectNode();
+
+            metricsStats(monitorService, localNodeId, DISK_METRICS, name, valueNode);
+            diskNode.put("name", name);
+            diskNode.set("value", valueNode);
+
+            diskNodes.add(diskNode);
+        });
+
+        return ok(root).build();
+    }
+
+    /**
+     * Returns network metrics of all resources.
+     *
+     * @return network metrics of all resources
+     */
+    @GET
+    @Path("network_metrics")
+    @Produces(MediaType.APPLICATION_JSON)
+    public Response networkMetrics() {
+
+        ArrayNode networkNodes = root.putArray("networks");
+        monitorService.availableResources(NETWORK).forEach(name -> {
+            ObjectNode networkNode = mapper().createObjectNode();
+            ObjectNode valueNode = mapper().createObjectNode();
+
+            metricsStats(monitorService, localNodeId, NETWORK_METRICS, name, valueNode);
+            networkNode.put("name", name);
+            networkNode.set("value", valueNode);
+
+            networkNodes.add(networkNode);
+        });
+
+        return ok(root).build();
+    }
+
+    /**
+     * Returns a collection of control message stats.
+     *
+     * @param service control plane monitoring service
+     * @param nodeId  node identification
+     * @param typeSet a set of control message types
+     * @param did     device identification
+     * @param node    object node
+     * @return a collection of control message stats
+     */
+    private ArrayNode metricsStats(ControlPlaneMonitorService service,
+                                   NodeId nodeId, Set<ControlMetricType> typeSet,
+                                   DeviceId did, ObjectNode node) {
+        return metricsStats(service, nodeId, typeSet, null, did, node);
+    }
+
+    /**
+     * Returns a collection of system metric stats.
+     *
+     * @param service control plane monitoring service
+     * @param nodeId  node identification
+     * @param typeSet a set of system metric types
+     * @param node    object node
+     * @return a collection of system metric stats
+     */
+    private ArrayNode metricsStats(ControlPlaneMonitorService service,
+                                   NodeId nodeId, Set<ControlMetricType> typeSet,
+                                   ObjectNode node) {
+        return metricsStats(service, nodeId, typeSet, null, null, node);
+    }
+
+    /**
+     * Returns a collection of system metric stats.
+     *
+     * @param service      control plane monitoring service
+     * @param nodeId       node identification
+     * @param typeSet      a set of control message types
+     * @param resourceName device identification
+     * @param node         object node
+     * @return a collection of system metric stats
+     */
+    private ArrayNode metricsStats(ControlPlaneMonitorService service,
+                                   NodeId nodeId, Set<ControlMetricType> typeSet,
+                                   String resourceName, ObjectNode node) {
+        return metricsStats(service, nodeId, typeSet, resourceName, null, node);
+    }
+
+    /**
+     * Returns a collection of control loads of the given control metric types.
+     *
+     * @param service control plane monitoring service
+     * @param nodeId  node identification
+     * @param typeSet a group of control metric types
+     * @param name    resource name
+     * @param did     device identification
+     * @return a collection of control loads
+     */
+    private ArrayNode metricsStats(ControlPlaneMonitorService service,
+                                   NodeId nodeId, Set<ControlMetricType> typeSet,
+                                   String name, DeviceId did, ObjectNode node) {
+        ArrayNode metricsNode = node.putArray("metrics");
+
+        if (name == null && did == null) {
+            typeSet.forEach(type -> {
+                ObjectNode metricNode = mapper().createObjectNode();
+                ControlLoad load = service.getLoad(nodeId, type, Optional.ofNullable(null));
+                if (load != null) {
+                    metricNode.set(type.toString().toLowerCase(), codec(ControlLoad.class)
+                            .encode(service.getLoad(nodeId, 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));
+                if (load != null) {
+                    metricNode.set(type.toString().toLowerCase(),
+                            codec(ControlLoad.class).encode(load, this));
+                    metricsNode.add(metricNode);
+                }
+            });
+        } else if (did == null) {
+            typeSet.forEach(type -> {
+                ObjectNode metricNode = mapper().createObjectNode();
+                ControlLoad load = service.getLoad(nodeId, type, name);
+                if (load != null) {
+                    metricNode.set(type.toString().toLowerCase(),
+                            codec(ControlLoad.class).encode(load, this));
+                    metricsNode.add(metricNode);
+                }
+            });
+        }
+
+        return metricsNode;
+    }
+}
diff --git a/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/ControlMetricsCollectorWebResource.java b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/SystemMetricsCollectorWebResource.java
similarity index 95%
rename from apps/cpman/app/src/main/java/org/onosproject/cpman/rest/ControlMetricsCollectorWebResource.java
rename to apps/cpman/app/src/main/java/org/onosproject/cpman/rest/SystemMetricsCollectorWebResource.java
index 07412861..6a6e50f 100644
--- a/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/ControlMetricsCollectorWebResource.java
+++ b/apps/cpman/app/src/main/java/org/onosproject/cpman/rest/SystemMetricsCollectorWebResource.java
@@ -40,16 +40,16 @@
 import static org.onlab.util.Tools.nullIsIllegal;
 
 /**
- * Collect control plane metrics.
+ * Collect system metrics.
  */
 @Path("collector")
-public class ControlMetricsCollectorWebResource extends AbstractWebResource {
+public class SystemMetricsCollectorWebResource extends AbstractWebResource {
 
-    final ControlPlaneMonitorService service = get(ControlPlaneMonitorService.class);
-    public static final int UPDATE_INTERVAL_IN_MINUTE = 1;
-    public static final String INVALID_SYSTEM_SPECS = "Invalid system specifications";
-    public static final String INVALID_RESOURCE_NAME = "Invalid resource name";
-    public static final String INVALID_REQUEST = "Invalid request";
+    private final ControlPlaneMonitorService service = get(ControlPlaneMonitorService.class);
+    private static final int UPDATE_INTERVAL_IN_MINUTE = 1;
+    private static final String INVALID_SYSTEM_SPECS = "Invalid system specifications";
+    private static final String INVALID_RESOURCE_NAME = "Invalid resource name";
+    private static final String INVALID_REQUEST = "Invalid request";
 
     /**
      * Collects CPU metrics.
