diff --git a/apps/yms/app/src/main/java/org/onosproject/yms/app/ypm/YpmManager.java b/apps/yms/app/src/main/java/org/onosproject/yms/app/ypm/YpmManager.java
new file mode 100644
index 0000000..6d6468a
--- /dev/null
+++ b/apps/yms/app/src/main/java/org/onosproject/yms/app/ypm/YpmManager.java
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2016-present 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.yms.app.ypm;
+
+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.Service;
+import org.onosproject.yms.ydt.YdtContext;
+import org.onosproject.yms.ypm.YpmContext;
+import org.onosproject.yms.ypm.YpmService;
+import org.onosproject.yms.ypm.DefaultYpmNode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Represents implementation of YANG protocol metadata manager.
+ */
+@Service
+@Component(immediate = true)
+public class YpmManager implements YpmService {
+
+    private final Logger log = LoggerFactory.getLogger(getClass());
+    private YpmContext rootYpmNode;
+
+    @Activate
+    public void activate() {
+        log.info("Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        log.info("Stopped");
+    }
+
+    @Override
+    public YpmContext getProtocolData(YdtContext rootYdtNode) {
+        if (rootYdtNode == null) {
+            log.debug("Input data is null. So, will not proceed.");
+            return null;
+        }
+
+        // Iterate through YDT and search the path in YPM tree and create new YPM tree equivalent to given YDT
+        // and return it.
+        if (rootYpmNode == null) {
+            log.debug("YPM tree has no data.");
+            return null;
+        }
+
+        YdtContext currentYdtNode = rootYdtNode;
+        YpmContext currentYpmNode = rootYpmNode;
+        YpmContext rootRetYpmNode = new DefaultYpmNode(currentYdtNode.getName());
+        YpmContext currRetYpmNode = rootRetYpmNode;
+        while (currentYdtNode != null) {
+            // Each ypm node can have children. So, create new corresponding ypm child
+            // and add it to new returning ypm tree, otherwise return new ypm tree.
+            YdtContext nextNode = currentYdtNode.getFirstChild();
+            if (nextNode != null) {
+                YpmContext ypmChild = currentYpmNode.getChild(nextNode.getName());
+                if (ypmChild != null) {
+                    currRetYpmNode.addChild(ypmChild.getName());
+                } else {
+                    return rootRetYpmNode;
+                }
+                currentYdtNode = nextNode;
+                currentYpmNode = currentYpmNode.getChild(nextNode.getName());
+                currRetYpmNode = currRetYpmNode.getChild(nextNode.getName());
+                currRetYpmNode.setMetaData(currentYpmNode.getMetaData());
+                continue;
+            }
+
+            // No child nodes, so walk tree
+            while (currentYdtNode != null) {
+                // Each ypm node can have sibling. So, create new corresponding ypm sibling node
+                // and add it to new returning ypm tree, otherwise return new ypm tree.
+                nextNode = currentYdtNode.getNextSibling();
+                if (nextNode != null) {
+                    YpmContext ypmSibling = currentYpmNode.getSibling(nextNode.getName());
+                    if (ypmSibling != null) {
+                        currRetYpmNode.addSibling(ypmSibling.getName());
+                    } else {
+                        return rootRetYpmNode;
+                    }
+                    currentYdtNode = nextNode;
+                    currentYpmNode = currentYpmNode.getSibling(nextNode.getName());
+                    currRetYpmNode = currRetYpmNode.getSibling(nextNode.getName());
+                    currRetYpmNode.setMetaData(currentYpmNode.getMetaData());
+                    break;
+                }
+
+                // Move up
+                if (currentYdtNode == rootYdtNode) {
+                    currentYdtNode = null;
+                } else {
+                    currentYdtNode = currentYdtNode.getParent();
+                    currentYpmNode = currentYpmNode.getParent();
+                    currRetYpmNode = currRetYpmNode.getParent();
+                }
+            }
+        }
+
+        return rootRetYpmNode;
+    }
+
+    @Override
+    public void setProtocolData(YdtContext rootYdtNode, Object data) {
+        if (rootYdtNode == null || data == null) {
+            log.debug("Input data is null. So, will not proceed.");
+            return;
+        }
+
+        // Iterate through YDT and add each node of this path to ypm tree if it is not exists
+        YdtContext currentYdtNode = rootYdtNode;
+        YpmContext currentYpmNode = rootYpmNode;
+        while (currentYdtNode != null) {
+            // Check the ypm root node first
+            if (rootYpmNode == null) {
+                rootYpmNode = new DefaultYpmNode(currentYdtNode.getName());
+                currentYpmNode = rootYpmNode;
+                // In logical node, should not set protocol metadata
+            }
+
+            // Move down to first child
+            YdtContext nextNode = currentYdtNode.getFirstChild();
+            if (nextNode != null) {
+                // Each ypm node can have sibling. So, get corresponding sibling node, otherwise create it.
+                if (currentYpmNode.getChild(nextNode.getName()) == null) {
+                    currentYpmNode.addChild(nextNode.getName());
+                }
+                currentYpmNode = currentYpmNode.getChild(nextNode.getName());
+                // Set/update protocol metadata
+                currentYpmNode.setMetaData(data);
+                currentYdtNode = nextNode;
+                continue;
+            }
+
+            // No child nodes, so walk tree
+            while (currentYdtNode != null) {
+                // Move to sibling if possible.
+                nextNode = currentYdtNode.getNextSibling();
+                if (nextNode != null) {
+                    // Each ypm node can have children (sibling). So, get corresponding ypm child, otherwise create it.
+                    if (currentYpmNode.getSibling(nextNode.getName()) == null) {
+                        currentYpmNode.addSibling(nextNode.getName());
+                    }
+                    currentYpmNode = currentYpmNode.getSibling(nextNode.getName());
+                    // Set/update protocol metadata
+                    currentYpmNode.setMetaData(data);
+                    currentYdtNode = nextNode;
+                    break;
+                }
+
+                // Move up
+                if (currentYdtNode == rootYdtNode) {
+                    currentYdtNode = null;
+                } else {
+                    currentYdtNode = currentYdtNode.getParent();
+                    currentYpmNode = currentYpmNode.getParent();
+                }
+            }
+        }
+    }
+}
