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/ControlMetricsCollectorWebResource.java
index ec04372..f7a60dc 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/ControlMetricsCollectorWebResource.java
@@ -16,12 +16,13 @@
 package org.onosproject.cpman.rest;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.onosproject.cpman.ControlMetric;
 import org.onosproject.cpman.ControlMetricType;
-import org.onosproject.cpman.impl.ControlMetricsSystemSpec;
 import org.onosproject.cpman.ControlPlaneMonitorService;
 import org.onosproject.cpman.MetricValue;
+import org.onosproject.cpman.impl.ControlMetricsSystemSpec;
 import org.onosproject.rest.AbstractWebResource;
 
 import javax.ws.rs.Consumes;
@@ -34,6 +35,8 @@
 import java.io.InputStream;
 import java.util.Optional;
 
+import static org.onlab.util.Tools.nullIsIllegal;
+
 /**
  * Collect control plane metrics.
  */
@@ -43,6 +46,7 @@
     final ControlPlaneMonitorService service = get(ControlPlaneMonitorService.class);
     public static final int UPDATE_INTERVAL = 1;           // 1 minute update interval
     public static final String INVALID_SYSTEM_SPECS = "Invalid system specifications";
+    public static final String INVALID_RESOURCE_NAME = "Invalid resource name";
 
     /**
      * Collects CPU metrics.
@@ -68,13 +72,13 @@
 
             if (cpuLoadJson != null) {
                 cm = new ControlMetric(ControlMetricType.CPU_LOAD,
-                     new MetricValue.Builder().load(cpuLoadJson.asLong()).add());
+                        new MetricValue.Builder().load(cpuLoadJson.asLong()).add());
                 service.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null));
             }
 
             if (totalCpuTimeJson != null) {
                 cm = new ControlMetric(ControlMetricType.TOTAL_CPU_TIME,
-                     new MetricValue.Builder().load(totalCpuTimeJson.asLong()).add());
+                        new MetricValue.Builder().load(totalCpuTimeJson.asLong()).add());
                 service.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null));
             }
 
@@ -166,24 +170,29 @@
     @Produces(MediaType.APPLICATION_JSON)
     public Response diskMetrics(InputStream stream) {
         ObjectNode root = mapper().createObjectNode();
-        ControlMetric cm;
+        final ControlMetric[] cm = new ControlMetric[1];
         try {
             ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
-            JsonNode readBytes = jsonTree.get("readBytes");
-            JsonNode writeBytes = jsonTree.get("writeBytes");
+            ArrayNode diskRes = (ArrayNode) jsonTree.get("disks");
+            diskRes.forEach(node-> {
+                JsonNode resourceName = node.get("resourceName");
+                nullIsIllegal(resourceName, INVALID_RESOURCE_NAME);
 
-            if (readBytes != null) {
-                cm = new ControlMetric(ControlMetricType.DISK_READ_BYTES,
-                        new MetricValue.Builder().load(readBytes.asLong()).add());
-                service.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null));
-            }
+                JsonNode readBytes = jsonTree.get("readBytes");
+                JsonNode writeBytes = jsonTree.get("writeBytes");
 
-            if (writeBytes != null) {
-                cm = new ControlMetric(ControlMetricType.DISK_WRITE_BYTES,
-                        new MetricValue.Builder().load(writeBytes.asLong()).add());
-                service.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null));
-            }
+                if (readBytes != null) {
+                    cm[0] = new ControlMetric(ControlMetricType.DISK_READ_BYTES,
+                            new MetricValue.Builder().load(readBytes.asLong()).add());
+                    service.updateMetric(cm[0], UPDATE_INTERVAL, resourceName.asText());
+                }
 
+                if (writeBytes != null) {
+                    cm[0] = new ControlMetric(ControlMetricType.DISK_WRITE_BYTES,
+                            new MetricValue.Builder().load(writeBytes.asLong()).add());
+                    service.updateMetric(cm[0], UPDATE_INTERVAL, resourceName.asText());
+                }
+            });
         } catch (IOException e) {
             throw new IllegalArgumentException(e.getMessage());
         }
@@ -203,45 +212,49 @@
     @Produces(MediaType.APPLICATION_JSON)
     public Response networkMetrics(InputStream stream) {
         ObjectNode root = mapper().createObjectNode();
-        ControlMetric cm;
+        final ControlMetric[] cm = new ControlMetric[1];
         try {
             ObjectNode jsonTree = (ObjectNode) mapper().readTree(stream);
-            JsonNode inBytes = jsonTree.get("incomingBytes");
-            JsonNode outBytes = jsonTree.get("outgoingBytes");
-            JsonNode inPackets = jsonTree.get("incomingPackets");
-            JsonNode outPackets = jsonTree.get("outgoingPackets");
+            ArrayNode networkRes = (ArrayNode) jsonTree.get("networks");
+            networkRes.forEach(node -> {
+                JsonNode resourceName = node.get("resourceName");
+                nullIsIllegal(resourceName, INVALID_RESOURCE_NAME);
 
-            if (inBytes != null) {
-                cm = new ControlMetric(ControlMetricType.NW_INCOMING_BYTES,
-                        new MetricValue.Builder().load(inBytes.asLong()).add());
-                service.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null));
-            }
+                JsonNode inBytes = jsonTree.get("incomingBytes");
+                JsonNode outBytes = jsonTree.get("outgoingBytes");
+                JsonNode inPackets = jsonTree.get("incomingPackets");
+                JsonNode outPackets = jsonTree.get("outgoingPackets");
 
-            if (outBytes != null) {
-                cm = new ControlMetric(ControlMetricType.NW_OUTGOING_BYTES,
-                        new MetricValue.Builder().load(outBytes.asLong()).add());
-                service.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null));
-            }
+                if (inBytes != null) {
+                    cm[0] = new ControlMetric(ControlMetricType.NW_INCOMING_BYTES,
+                            new MetricValue.Builder().load(inBytes.asLong()).add());
+                    service.updateMetric(cm[0], UPDATE_INTERVAL, resourceName.asText());
+                }
 
-            if (inPackets != null) {
-                cm = new ControlMetric(ControlMetricType.NW_INCOMING_PACKETS,
-                        new MetricValue.Builder().load(inPackets.asLong()).add());
-                service.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null));
-            }
+                if (outBytes != null) {
+                    cm[0] = new ControlMetric(ControlMetricType.NW_OUTGOING_BYTES,
+                            new MetricValue.Builder().load(outBytes.asLong()).add());
+                    service.updateMetric(cm[0], UPDATE_INTERVAL, resourceName.asText());
+                }
 
-            if (outPackets != null) {
-                cm = new ControlMetric(ControlMetricType.NW_OUTGOING_PACKETS,
-                        new MetricValue.Builder().load(outPackets.asLong()).add());
-                service.updateMetric(cm, UPDATE_INTERVAL, Optional.ofNullable(null));
-            }
+                if (inPackets != null) {
+                    cm[0] = new ControlMetric(ControlMetricType.NW_INCOMING_PACKETS,
+                            new MetricValue.Builder().load(inPackets.asLong()).add());
+                    service.updateMetric(cm[0], UPDATE_INTERVAL, resourceName.asText());
+                }
 
+                if (outPackets != null) {
+                    cm[0] = new ControlMetric(ControlMetricType.NW_OUTGOING_PACKETS,
+                            new MetricValue.Builder().load(outPackets.asLong()).add());
+                    service.updateMetric(cm[0], UPDATE_INTERVAL, resourceName.asText());
+                }
+            });
         } catch (IOException e) {
             throw new IllegalArgumentException(e.getMessage());
         }
         return ok(root).build();
     }
 
-
     /**
      * Collects system specifications.
      * The system specs include the various control metrics
@@ -283,4 +296,4 @@
         }
         return ok(root).build();
     }
-}
+}
\ No newline at end of file
diff --git a/apps/cpman/app/src/main/resources/definitions/DiskMetricsPost.json b/apps/cpman/app/src/main/resources/definitions/DiskMetricsPost.json
index fe0dab1..ea2bbd5 100644
--- a/apps/cpman/app/src/main/resources/definitions/DiskMetricsPost.json
+++ b/apps/cpman/app/src/main/resources/definitions/DiskMetricsPost.json
@@ -1,19 +1,41 @@
 {
   "type": "object",
+  "title": "disks",
   "required": [
-    "readBytes",
-    "writeBytes"
+    "disks"
   ],
   "properties": {
-    "readBytes": {
-      "type": "integer",
-      "format": "int64",
-      "example": "500"
-    },
-    "writeBytes": {
-      "type": "integer",
-      "format": "int64",
-      "example": "300"
+    "disks": {
+      "type": "array",
+      "xml": {
+        "name": "disks",
+        "wrapped": true
+      },
+      "items": {
+        "type": "object",
+        "title": "disks",
+        "required": [
+          "resourceName",
+          "readBytes",
+          "writeBytes"
+        ],
+        "properties": {
+          "resourceName": {
+            "type": "string",
+            "example": "disk1"
+          },
+          "readBytes": {
+            "type": "integer",
+            "format": "int64",
+            "example": "500"
+          },
+          "writeBytes": {
+            "type": "integer",
+            "format": "int64",
+            "example": "300"
+          }
+        }
+      }
     }
   }
 }
\ No newline at end of file
diff --git a/apps/cpman/app/src/main/resources/definitions/NetworkMetricsPost.json b/apps/cpman/app/src/main/resources/definitions/NetworkMetricsPost.json
index f9ad7d3..a04bdd8 100644
--- a/apps/cpman/app/src/main/resources/definitions/NetworkMetricsPost.json
+++ b/apps/cpman/app/src/main/resources/definitions/NetworkMetricsPost.json
@@ -1,31 +1,53 @@
 {
   "type": "object",
+  "title": "networks",
   "required": [
-    "incomingBytes",
-    "outgoingBytes",
-    "incomingPackets",
-    "outgoingPackets"
+    "networks"
   ],
   "properties": {
-    "incomingBytes": {
-      "type": "integer",
-      "format": "int64",
-      "example": "1024"
-    },
-    "outgoingBytes": {
-      "type": "integer",
-      "format": "int64",
-      "example": "1024"
-    },
-    "incomingPackets": {
-      "type": "integer",
-      "format": "int64",
-      "example": "1000"
-    },
-    "outgoingPackets": {
-      "type": "integer",
-      "format": "int64",
-      "example": "2000"
+    "networks": {
+      "type": "array",
+      "xml": {
+        "name": "networks",
+        "wrapped": true
+      },
+      "items": {
+        "type": "object",
+        "title": "networks",
+        "required": [
+          "resourceName",
+          "incomingBytes",
+          "outgoingBytes",
+          "incomingPackets",
+          "outgoingPackets"
+        ],
+        "properties": {
+          "resourceName": {
+            "type": "string",
+            "example": "eth0"
+          },
+          "incomingBytes": {
+            "type": "integer",
+            "format": "int64",
+            "example": "1024"
+          },
+          "outgoingBytes": {
+            "type": "integer",
+            "format": "int64",
+            "example": "1024"
+          },
+          "incomingPackets": {
+            "type": "integer",
+            "format": "int64",
+            "example": "1000"
+          },
+          "outgoingPackets": {
+            "type": "integer",
+            "format": "int64",
+            "example": "2000"
+          }
+        }
+      }
     }
   }
 }
\ No newline at end of file
diff --git a/apps/cpman/app/src/test/java/org/onosproject/cpman/rest/ControlMetricsCollectorResourceTest.java b/apps/cpman/app/src/test/java/org/onosproject/cpman/rest/ControlMetricsCollectorResourceTest.java
index edfc6d6..ad84f17 100644
--- a/apps/cpman/app/src/test/java/org/onosproject/cpman/rest/ControlMetricsCollectorResourceTest.java
+++ b/apps/cpman/app/src/test/java/org/onosproject/cpman/rest/ControlMetricsCollectorResourceTest.java
@@ -37,6 +37,7 @@
 import java.util.Optional;
 
 import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.anyString;
 import static org.easymock.EasyMock.createMock;
 import static org.easymock.EasyMock.expectLastCall;
 import static org.easymock.EasyMock.replay;
@@ -84,19 +85,17 @@
     }
 
     @Test
-    public void testDiskMetricsPost() {
-        mockControlPlaneMonitorService.updateMetric(anyObject(), anyObject(),
-                (Optional<DeviceId>) anyObject());
-        expectLastCall().times(2);
+    public void testDiskMetricsWithNullName() {
+        mockControlPlaneMonitorService.updateMetric(anyObject(), anyObject(), anyString());
+        expectLastCall().times(4);
         replay(mockControlPlaneMonitorService);
         basePostTest("disk-metrics-post.json", PREFIX + "/disk_metrics");
     }
 
     @Test
-    public void testNetworkMetricsPost() {
-        mockControlPlaneMonitorService.updateMetric(anyObject(), anyObject(),
-                (Optional<DeviceId>) anyObject());
-        expectLastCall().times(4);
+    public void testNetworkMetricsWithNullName() {
+        mockControlPlaneMonitorService.updateMetric(anyObject(), anyObject(), anyString());
+        expectLastCall().times(8);
         replay(mockControlPlaneMonitorService);
         basePostTest("network-metrics-post.json", PREFIX + "/network_metrics");
     }
@@ -106,16 +105,20 @@
         basePostTest("system-spec-post.json", PREFIX + "/system_specs");
     }
 
-    private void basePostTest(String jsonFile, String path) {
+    private ClientResponse baseTest(String jsonFile, String path) {
         final WebResource rs = resource();
         InputStream jsonStream = ControlMetricsCollectorResourceTest.class
                 .getResourceAsStream(jsonFile);
 
         assertThat(jsonStream, notNullValue());
 
-        ClientResponse response = rs.path(path)
+        return rs.path(path)
                 .type(MediaType.APPLICATION_JSON_TYPE)
                 .post(ClientResponse.class, jsonStream);
+    }
+
+    private void basePostTest(String jsonFile, String path) {
+        ClientResponse response = baseTest(jsonFile, path);
         assertThat(response.getStatus(), is(HttpURLConnection.HTTP_OK));
     }
 
diff --git a/apps/cpman/app/src/test/resources/org/onosproject/cpman/rest/disk-metrics-post.json b/apps/cpman/app/src/test/resources/org/onosproject/cpman/rest/disk-metrics-post.json
index ebdf00a..3fc34e6 100644
--- a/apps/cpman/app/src/test/resources/org/onosproject/cpman/rest/disk-metrics-post.json
+++ b/apps/cpman/app/src/test/resources/org/onosproject/cpman/rest/disk-metrics-post.json
@@ -1,4 +1,14 @@
 {
-  "readBytes": 500,
-  "writeBytes": 300
+  "disks": [
+    {
+      "resourceName": "disk1",
+      "readBytes": 500,
+      "writeBytes": 300
+    },
+    {
+      "resourceName": "disk2",
+      "readBytes": 500,
+      "writeBytes": 300
+    }
+  ]
 }
\ No newline at end of file
diff --git a/apps/cpman/app/src/test/resources/org/onosproject/cpman/rest/network-metrics-post.json b/apps/cpman/app/src/test/resources/org/onosproject/cpman/rest/network-metrics-post.json
index bdf7c8d..dec521c 100644
--- a/apps/cpman/app/src/test/resources/org/onosproject/cpman/rest/network-metrics-post.json
+++ b/apps/cpman/app/src/test/resources/org/onosproject/cpman/rest/network-metrics-post.json
@@ -1,6 +1,18 @@
 {
-  "incomingBytes": 1024,
-  "outgoingBytes": 1024,
-  "incomingPackets": 1000,
-  "outgoingPackets": 2000
+  "networks": [
+    {
+      "resourceName": "eth0",
+      "incomingBytes": 1024,
+      "outgoingBytes": 1024,
+      "incomingPackets": 1000,
+      "outgoingPackets": 2000
+    },
+    {
+      "resourceName": "eth1",
+      "incomingBytes": 1024,
+      "outgoingBytes": 1024,
+      "incomingPackets": 1000,
+      "outgoingPackets": 2000
+    }
+  ]
 }
\ No newline at end of file
