diff --git a/apps/nodemetrics/api/BUCK b/apps/nodemetrics/api/BUCK
new file mode 100644
index 0000000..42b99a6
--- /dev/null
+++ b/apps/nodemetrics/api/BUCK
@@ -0,0 +1,9 @@
+COMPILE_DEPS = [
+    '//lib:CORE_DEPS',
+    '//lib:sigar',
+
+]
+
+osgi_jar_with_tests(
+    deps = COMPILE_DEPS,
+)
\ No newline at end of file
diff --git a/apps/nodemetrics/api/pom.xml b/apps/nodemetrics/api/pom.xml
new file mode 100644
index 0000000..16dfd04
--- /dev/null
+++ b/apps/nodemetrics/api/pom.xml
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Copyright 2018 Open Networking Foundation
+  ~
+  ~ 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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-apps-nodemetrics</artifactId>
+        <version>1.14.0-SNAPSHOT</version>
+    </parent>
+
+
+    <artifactId>onos-apps-nodemetrics-api</artifactId>
+    <packaging>bundle</packaging>
+
+    <description>ONOS Nodemetrics API</description>
+    <url>http://onosproject.org</url>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <onos.version>${project.version}</onos.version>
+    </properties>
+
+    <dependencies>
+         <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-api</artifactId>
+            <scope>test</scope>
+            <classifier>tests</classifier>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <extensions>true</extensions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-scr-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>generate-scr-srcdescriptor</id>
+                        <goals>
+                            <goal>scr</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <supportedProjectTypes>
+                        <supportedProjectType>bundle</supportedProjectType>
+                        <supportedProjectType>war</supportedProjectType>
+                    </supportedProjectTypes>
+                </configuration>
+            </plugin>
+
+            <plugin>
+                <groupId>org.onosproject</groupId>
+                <artifactId>onos-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>cfg</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>cfg</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>swagger</id>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>swagger</goal>
+                        </goals>
+                    </execution>
+                    <execution>
+                        <id>app</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>app</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/apps/nodemetrics/api/src/main/java/org/onosproject/nodemetrics/NodeCpu.java b/apps/nodemetrics/api/src/main/java/org/onosproject/nodemetrics/NodeCpu.java
new file mode 100644
index 0000000..87a79c0
--- /dev/null
+++ b/apps/nodemetrics/api/src/main/java/org/onosproject/nodemetrics/NodeCpu.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.nodemetrics;
+
+import com.google.common.base.MoreObjects;
+import org.onosproject.cluster.NodeId;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Represents CPU usage info of Cluster controllers.
+ */
+public final class NodeCpu {
+    private final NodeId node;
+    private final double usage;
+
+    private NodeCpu(final NodeId node, final Double usage) {
+        this.node = node;
+        this.usage = usage;
+    }
+
+    /**
+     * Overall usage of CPU includes combined usage of
+     * (user,sys,nice,idle,wait,irq,softIrq and stolen) etc.
+     * @return usage is overall usage of CPU for the Specific Node.
+     */
+    public double usage() {
+        return usage;
+    }
+
+    @Override
+    public String toString() {
+
+        return MoreObjects.toStringHelper(this)
+                .add("node", this.node)
+                .add("usage", String.format("%.2f%s", this.usage, "%"))
+                .toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(node, usage);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        final NodeCpu other = (NodeCpu) obj;
+        return Objects.equals(this.node, other.node)
+                && Objects.equals(this.usage, other.usage);
+    }
+
+    /**
+     * Builder for the DefaultNodeCpu object.
+     */
+    public static final class Builder {
+        /**
+         * Builds the DefaultNodeCpu.
+         **/
+        private NodeId node;
+        private Double usage;
+
+        /**
+         * Sets the DefaultNodeCpu usage from Library.
+         *
+         * @param usage of CPU
+         * @return self for chaining
+         */
+        public Builder usage(final Double usage) {
+            this.usage = usage;
+            return this;
+        }
+
+        /**
+         * Sets the new DefaultNodeCpu controller node id.
+         *
+         * @param node the nodeId
+         * @return self for chaining
+         */
+        public Builder withNode(final NodeId node) {
+            this.node = node;
+            return this;
+        }
+
+        public NodeCpu build() {
+            checkNotNull(node, "Must specify an node id");
+            checkNotNull(usage, "Must specify a usage");
+            return new NodeCpu(node, usage);
+        }
+    }
+
+}
diff --git a/apps/nodemetrics/api/src/main/java/org/onosproject/nodemetrics/NodeDiskUsage.java b/apps/nodemetrics/api/src/main/java/org/onosproject/nodemetrics/NodeDiskUsage.java
new file mode 100644
index 0000000..280c230
--- /dev/null
+++ b/apps/nodemetrics/api/src/main/java/org/onosproject/nodemetrics/NodeDiskUsage.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.nodemetrics;
+
+import com.google.common.base.MoreObjects;
+import org.onosproject.cluster.NodeId;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Represents Disk usage of Cluster controllers.
+ */
+public final class NodeDiskUsage {
+
+    private final NodeId node;
+
+    private final long free;
+
+    private final long used;
+
+    private final long total;
+
+    private final Units units;
+
+    private final double usage;
+
+    private static final double PERCENTAGE_MULTIPLIER = 100.0;
+
+    private NodeDiskUsage(final NodeId node, final Long free,
+                          final Long used, final Long total, final Units units,
+                          final Double usage) {
+        this.node = node;
+        this.free = free;
+        this.used = used;
+        this.total = total;
+        this.units = units;
+        this.usage = usage;
+    }
+
+    /**
+     * @return free disk space available available for the specific nodeId.
+     */
+    public long free() {
+        return free;
+    }
+
+    /**
+     * @return used disk space used for the specific nodeId.
+     */
+    public long used() {
+        return used;
+    }
+
+    /**
+     * @return total disk space for the specific nodeId..
+     */
+    public long total() {
+        return total;
+    }
+
+    /**
+     * @return units in Kbs /Mbs/ Gbs.
+     */
+    public Units units() {
+        return units;
+    }
+
+    /**
+     * Percentage of Disk usage is calculated from Used,
+     * Available and Total Disk available in Specific Node.
+     * @return usage overall usage of Disk space for the specific nodeId.
+     */
+    public double usage() {
+        return usage;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(node, free, used, total, units, usage);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("node", this.node)
+                .add("free", this.free)
+                .add("used", this.used)
+                .add("total", this.total)
+                .add("units", this.units)
+                .add("usage", this.usage + "%")
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        NodeDiskUsage other = (NodeDiskUsage) obj;
+        return Objects.equals(this.node, other.node)
+                && Objects.equals(this.free, other.free)
+                && Objects.equals(this.used, other.used)
+                && Objects.equals(this.total, other.total)
+                && Objects.equals(this.units, other.units)
+                && Objects.equals(this.usage, other.usage);
+    }
+
+    /**
+     * Builder for the NodeDiskusage object.
+     */
+    public static final class Builder {
+        /**
+         * Builds the NodeDiskusage.
+         **/
+        private NodeId node;
+        private Units unit;
+        private Long free;
+        private Long used;
+        private Long total;
+
+        /**
+         * Sets the new NodeDiskusage controller nodeid.
+         *
+         * @param node the nodeId
+         * @return self for chaining
+         */
+        public Builder withNode(final NodeId node) {
+            this.node = node;
+            return this;
+        }
+
+        /**
+         * Sets the new NodeDiskusage Disk size units(bytes, Kbs, Mbs,
+         * Gbs).
+         *
+         * @param unit the units
+         * @return self for chaining
+         */
+        public Builder withUnit(final Units unit) {
+            this.unit = unit;
+            return this;
+        }
+
+        /**
+         * Sets the new NodeDiskusage controller free space.
+         *
+         * @param free the free space
+         * @return self for chaining
+         */
+        public Builder free(final Long free) {
+            this.free = free;
+            return this;
+        }
+
+        /**
+         * Sets the new NodeDiskusage controller used space.
+         *
+         * @param used the used space
+         * @return self for chaining
+         */
+        public Builder used(final Long used) {
+            this.used = used;
+            return this;
+        }
+
+        /**
+         * Sets the new NodeDiskusage controller total disk.
+         *
+         * @param total the total disk space
+         * @return self for chaining
+         */
+        public Builder total(final Long total) {
+            this.total = total;
+            return this;
+        }
+
+        public NodeDiskUsage build() {
+            checkNotNull(node, "Must specify an node id");
+            checkNotNull(unit, "Must specify a unit");
+            checkNotNull(used, "Must specify a used Diskspace");
+            checkNotNull(free, "Must specify a free Diskspace");
+            checkNotNull(total, "Must specify a total Diskspace");
+            double usage = used * PERCENTAGE_MULTIPLIER / total;
+            return new NodeDiskUsage(node, free, used, total, unit, usage);
+        }
+
+    }
+
+}
\ No newline at end of file
diff --git a/apps/nodemetrics/api/src/main/java/org/onosproject/nodemetrics/NodeMemory.java b/apps/nodemetrics/api/src/main/java/org/onosproject/nodemetrics/NodeMemory.java
new file mode 100644
index 0000000..399bc90
--- /dev/null
+++ b/apps/nodemetrics/api/src/main/java/org/onosproject/nodemetrics/NodeMemory.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.nodemetrics;
+
+import com.google.common.base.MoreObjects;
+import org.onosproject.cluster.NodeId;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Represents Memory usage of Cluster controllers.
+ */
+public final class NodeMemory {
+
+    private final NodeId node;
+
+    private final Units units;
+
+    private final long free;
+
+    private final long used;
+
+    private final long total;
+
+    private final double usage;
+
+    private static final double PERCENTAGE_MULTIPLIER = 100.0;
+
+    private NodeMemory(final NodeId node, final Units units,
+                      final Long free, final Long used, final Long total,
+                      final Double usage) {
+        this.node = node;
+        this.units = units;
+        this.free = free;
+        this.used = used;
+        this.total = total;
+        this.usage = usage;
+    }
+
+    /**
+     * @return free memory available for the specific nodeId.
+     */
+    public long free() {
+        return free;
+    }
+
+    /**
+     * @return used memory for the specific nodeId..
+     */
+    public long used() {
+        return used;
+    }
+
+    /**
+     * @return total memory for the specific nodeId..
+     */
+    public long total() {
+        return total;
+    }
+
+    /**
+     * @return memory in Kbs / Mbs etc.
+     */
+    public Units units() {
+        return units;
+    }
+
+    /**
+     * Percentage of Memory usage is calculated from Used, Available and Total Memory.
+     * @return usage overall usage of memory in percentage for the specific node.
+     */
+    public double usage() {
+        return usage;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(node, free, used, total, units, usage);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("node", this.node)
+                .add("free", this.free)
+                .add("used", this.used)
+                .add("total", this.total)
+                .add("units", this.units.toString())
+                .add("usage", this.usage + "%")
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        NodeMemory other = (NodeMemory) obj;
+        return Objects.equals(this.node, other.node)
+                && Objects.equals(this.free, other.free)
+                && Objects.equals(this.used, other.used)
+                && Objects.equals(this.total, other.total)
+                && Objects.equals(this.units, other.units)
+                && Objects.equals(this.usage, other.usage);
+    }
+
+    /**
+     * Builder for the DefaultNodeMemory object.
+     */
+    public static final class Builder {
+        /**
+         * Builds the DefaultNodeMemory.
+         **/
+        private NodeId node;
+        private Units unit;
+        private Long free;
+        private Long used;
+        private Long total;
+
+        /**
+         * Sets the new DefaultNodeMemory controller nodeId.
+         *
+         * @param node nodeId
+         * @return self for chaining
+         */
+        public Builder withNode(final NodeId node) {
+            this.node = node;
+            return this;
+        }
+
+        /**
+         * Sets the new DefaultNodeMemory Disk size units(bytes, Kbs, Mbs, Gbs).
+         *
+         * @param unit units
+         * @return self for chaining
+         */
+        public Builder withUnit(final Units unit) {
+            this.unit = unit;
+            return this;
+        }
+
+        /**
+         * Sets the new DefaultNodeMemory controller free space.
+         *
+         * @param free free space
+         * @return self for chaining
+         */
+        public Builder free(final Long free) {
+            this.free = free;
+            return this;
+        }
+
+        /**
+         * Sets the new DefaultNodeMemory controller used space.
+         *
+         * @param used used space
+         * @return self for chaining
+         */
+        public Builder used(final Long used) {
+            this.used = used;
+            return this;
+        }
+
+        /**
+         * Sets the new DefaultNodeMemory controller total disk.
+         *
+         * @param total the total disk space
+         * @return self for chaining
+         */
+        public Builder total(final Long total) {
+            this.total = total;
+            return this;
+        }
+
+        public NodeMemory build() {
+            checkNotNull(node, "Must specify an node id");
+            checkNotNull(unit, "Must specify a unit");
+            checkNotNull(used, "Must specify a used Diskspace");
+            checkNotNull(free, "Must specify a free Diskspace");
+            checkNotNull(total, "Must specify a total Diskspace");
+            double usage = used * PERCENTAGE_MULTIPLIER / total;
+            return new NodeMemory(node, unit, free, used, total, usage);
+        }
+
+    }
+
+}
\ No newline at end of file
diff --git a/apps/nodemetrics/api/src/main/java/org/onosproject/nodemetrics/NodeMetricsService.java b/apps/nodemetrics/api/src/main/java/org/onosproject/nodemetrics/NodeMetricsService.java
new file mode 100644
index 0000000..1228fb0
--- /dev/null
+++ b/apps/nodemetrics/api/src/main/java/org/onosproject/nodemetrics/NodeMetricsService.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.nodemetrics;
+
+import org.onosproject.cluster.NodeId;
+
+import java.util.Map;
+
+/**
+ * Nodemetrics Application is to fetch Controller Resource metrics.
+ * The Control Resource metrics includes Memory,
+ * CPU usage and Disk usage of All the cluster nodes.
+ */
+public interface NodeMetricsService {
+    /**
+     * Returns may memory information of all Cluster nodes.
+     * @return map
+     */
+    Map<NodeId, NodeMemory> memory();
+
+    /**
+     * Returns may disk information of all Cluster nodes.
+     * @return map
+     */
+    Map<NodeId, NodeDiskUsage> disk();
+
+    /**
+     * Returns may CPU information of all Cluster nodes.
+     * @return map object, NodeId as key and NodeCpu information as value.
+     */
+    Map<NodeId, NodeCpu> cpu();
+
+    /**
+     * Get the memory information of Specific Cluster node.
+     * @param nodeid to get Memory information of that respective cluster node.
+     * @return Nodememory object.
+     */
+    NodeMemory memory(NodeId nodeid);
+
+    /**
+     * Get the disk information of Specific Cluster node.
+     * @param nodeid to get disk information of that respective cluster node.
+     * @return NodeDiskUsage object.
+     */
+    NodeDiskUsage disk(NodeId nodeid);
+
+    /**
+     * Get the CPU information of Specific Cluster node.
+     * @param nodeid to get CPU information of that respective cluster node.
+     * @return NodeCpu object.
+     */
+    NodeCpu cpu(NodeId nodeid);
+}
diff --git a/apps/nodemetrics/api/src/main/java/org/onosproject/nodemetrics/Units.java b/apps/nodemetrics/api/src/main/java/org/onosproject/nodemetrics/Units.java
new file mode 100644
index 0000000..30e85a9
--- /dev/null
+++ b/apps/nodemetrics/api/src/main/java/org/onosproject/nodemetrics/Units.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.nodemetrics;
+
+public enum Units {
+    /**
+     * Units for Memory and Disk.
+     */
+    BYTES("bytes"), KBYTES("Kbs"), MBYTES("Mbs"), GBYTES("Gbs");
+
+    private final String units;
+
+    Units(String units) {
+        this.units = units;
+    }
+
+    /**
+     * Returns units for Memory and Diskusage.
+     * @return units for Memory and Diskusage
+     */
+    public String units() {
+        return units;
+    }
+}
diff --git a/apps/nodemetrics/api/src/main/java/org/onosproject/nodemetrics/package-info.java b/apps/nodemetrics/api/src/main/java/org/onosproject/nodemetrics/package-info.java
new file mode 100644
index 0000000..1f4d7ed
--- /dev/null
+++ b/apps/nodemetrics/api/src/main/java/org/onosproject/nodemetrics/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * 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.
+ */
+
+/**
+ * Module to fetch Node Metrics.
+ */
+package org.onosproject.nodemetrics;
\ No newline at end of file
