YMS broker and Notification handler

Change-Id: Ic3659b2c2ad26ea2db1f03725b4883f19db2cc41
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangCodecHandler.java b/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangCodecHandler.java
index f2433fa..7e2d77c 100644
--- a/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangCodecHandler.java
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangCodecHandler.java
@@ -16,20 +16,195 @@
 
 package org.onosproject.yms.ych;
 
+import java.util.List;
+import java.util.Map;
+
+import org.onosproject.yms.ydt.YmsOperationType;
+
 /**
  * Abstraction of an entity which provides interfaces to YANG codec handler.
  *
  * In SBI, the provider or driver uses YANG management system as a CODEC
- * utility. These providers/drivers use the YANG codec utility to register
- * the device schema. YANG utils is used to generate the java files
- * corresponding to the device schema. Provider or driver use these classes
- * to seamlessly manage the device as java objects. While sending the request
- * to device, drivers use the utility to translate the objects to protocol
- * specific data representation and then send to the device.
- * Protocol or driver use the same instance of the codec utility across multiple
- * translation request.
+ * utility. Providers/drivers register the device schema with YANG management
+ * system. YANG utils is used to generate the java files corresponding to the
+ * device schema. Provider or driver use these classes to seamlessly manage
+ * the device as java objects. While sending the request to device, drivers
+ * use the utility to translate the objects to protocol specific data
+ * representation and then send to the device. Protocol or driver use the
+ * same instance of the codec utility across multiple translation request.
  * Protocol or driver should not use the same instance of utility concurrently.
  */
 public interface YangCodecHandler {
-    //TODO
+    /**
+     * Provider / driver needs to register the device schema with code handler.
+     * Then the provider / driver can use the codec handler to perform the
+     * codec operation. When the codec operation is  being performed, the
+     * codec utility finds the mapping registered device model and perform the
+     * translation against the device schema.
+     *
+     * @param yangModule YANG utils generated class corresponding to SBI
+     *                   device schema module
+     */
+    void addDeviceSchema(Class yangModule);
+
+
+    /**
+     * When the drivers / providers need to encode a protocol operation
+     * requests, which is in a single block, this encode API is used.
+     * A single protocol operation can span across multiple application, then
+     * the driver / provider need to provide the list of application(s) module
+     * object. Each module object contains the request information
+     * corresponding to that application.
+     *
+     * The protocols can have a logical root node which acts as a container
+     * of applications module node. For example in NETCONF, it could be
+     * data/filter/config, etc. Protocols needs to pass this parameter in the
+     * encode request, so that it is part of the encoded protocol packet.
+     * There is no validation done on the value of this parameter. It is up to
+     * the protocol to use it. It is a mandatory parameter and protocols must
+     * pass this parameter. In protocols like NETCONF, these logical root
+     * node may be in a specific name space, in such cases, it needs to be
+     * passed to encode it as part of the request. There could be additional
+     * tags that can be attached to the root node, for example in NETCONF,
+     * the tag type="subtree" can be specified. In such scenarios the
+     * required tags should be sent as a parameter.
+     *
+     * The provider / driver would require to operate on multiple schema
+     * nodes in a single request, for example it may be require to configure
+     * a tunnel and associate a QOS to this tunnel, in this scenario, it
+     * needs to have the tunnel related information in the tunnel module's
+     * Java object and and QOS related  information in QOS modules Java
+     * object. So in a single request, it can send the list of Java objects
+     * corresponding to the modules which need to participate in the operation.
+     * If the request to be generated needs to be a wild card for no
+     * application(s), then this parameter needs to be null. For example a
+     * "empty filter" request in NETCONF get request.
+     * If the request to be generated needs to be a wild card for  all
+     * application(s), then the driver / provider should not invoke this API,
+     * as there is no encoding of application related information for the
+     * operation, it is only limited to the protocol operation. For example a
+     * "no filter" request in NETCONF get request.
+     *
+     * @param rootName              name of logical root node as required by
+     *                              the protocol
+     * @param rootNamespace         namespace of logical root node as
+     *                              required by the protocol encoding. It is
+     *                              an optional parameter.
+     * @param tagAttributeLinkedMap Specifies the list of attributes that
+     *                              needs to be tagged with the logical root
+     *                              node. It is an optional parameter
+     *                              if not required for the protocol.
+     * @param yangModuleList        list of YANG module's object(s)
+     *                              participating in the operation.
+     * @param dataFormat            data format to which encoding to be done.
+     * @param protocolOperation     protocol operation being performed
+     * @return string containing the requested applications object
+     * information encoded in protocol format.
+     */
+    String encodeOperation(String rootName, String rootNamespace,
+                           Map<String, String> tagAttributeLinkedMap,
+                           List<Object> yangModuleList,
+                           YangProtocolEncodingFormat dataFormat,
+                           YmsOperationType protocolOperation);
+
+    /**
+     * When the drivers / providers need to encode protocol composite
+     * operation requests, which is split in a composite blocks, this encode
+     * composite operation API is used. The application module object
+     * containing the request information has both the resource identifier
+     * part and the resource information part.
+     *
+     * The protocols can have a logical root node which acts as a container
+     * of applications module node.  For example in RESTCONF, it could be
+     * RootResource/data, etc. There is no validation done on the value
+     * of this parameter. It is upto the protocol to use it. It is a
+     * mandatory parameter and protocols must pass this parameter.
+     *
+     * The resource to be operated upon in the device is identified in a
+     * module's schema object. This modules object should contain the
+     * information about the resource on which the operation needs to be
+     * performed. The resource is identified by initial chain of objects for
+     * which operation type is none. Once the resource is reached using none
+     * operations, the actual information about the operation on the device
+     * is encoded.
+     *
+     * @param rootName          name of logical root node as required by the
+     *                          protocol
+     * @param rootNamespace     namespace of logical root node as required by
+     *                          the
+     *                          protocol encoding. It is optional, and there
+     *                          is no
+     *                          namespace set to the logical root node
+     * @param appModuleObject   object containing the information about the
+     *                          resource on which the operation is being
+     *                          performed
+     * @param dataFormat        data format to which request needs to
+     *                          be encoded
+     * @param protocolOperation protocol operation being performed
+     * @return the composite protocol operation request.
+     */
+    YangCompositeEncoding encodeCompositeOperation(String rootName,
+                                                   String rootNamespace,
+                                                   Object appModuleObject,
+                                                   YangProtocolEncodingFormat
+                                                           dataFormat,
+                                                   YmsOperationType
+                                                           protocolOperation);
+
+    /**
+     * When the driver or provider receive the data from the SBI protocol, It
+     * will be in the protocol specific data representation. Drivers /
+     * provider need to interact with the device using native JAVA objects.
+     * Drivers use this decode method to translate the received
+     * protocol specific simple data to YANG modeled Java objects.
+     * If the response received is not in line with the schema, for example,
+     * there is some error info, etc, then the decode operation will throw an
+     * exception and decode operation will fail.
+     *
+     * @param protocolData      input string containing the resource information
+     *                          in protocol format
+     * @param dataFormat        data format from which decoding has to be done
+     * @param protocolOperation protocol operation being performed
+     * @return list of applications module/notification objects corresponding
+     * to the protocol data input
+     */
+    List<Object> decode(String protocolData,
+                        YangProtocolEncodingFormat dataFormat,
+                        YmsOperationType protocolOperation);
+
+    /**
+     * When the driver or provider receive the composite data from the SBI
+     * protocol, It will be in the protocol specific data representation.
+     * Drivers / provider need to interact with the device
+     * using native JAVA objects. Drivers use this Decode method to translate
+     * the received protocol specific composite data to YANG modeled Java
+     * objects.
+     * If the response received is not in line with the schema, for example,
+     * there is some error info, etc, then the decode operation will throw an
+     * exception and decode operation will fail.
+     *
+     * @param protocolData      composite protocol data containing the resource
+     *                          information
+     * @param dataFormat        data format from which decoding has to be done
+     * @param protocolOperation protocol operation being performed
+     * @return application module/notification object corresponding to the
+     * protocol data infput
+     */
+    Object decode(YangCompositeEncoding protocolData,
+                  YangProtocolEncodingFormat dataFormat,
+                  YmsOperationType protocolOperation);
+
+    /**
+     * Register the provider / driver specific overridden codec. This is can
+     * be used by provider to support  any protocol specific extension or
+     * vendor specific implementation. This framework can also be used
+     * by providers / drivers to support any new protocol data format which
+     * is not supported by default in YANG codec utility.
+     *
+     * @param overriddenCodec provider / driver specific overridden instance
+     *                        of the codec
+     * @param dataFormat      data format to which encoding to be done.
+     */
+    void registerOverriddenCodec(YangDataTreeCodec overriddenCodec,
+                                 YangProtocolEncodingFormat dataFormat);
 }
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangCompositeEncoding.java b/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangCompositeEncoding.java
new file mode 100644
index 0000000..0ad945d
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangCompositeEncoding.java
@@ -0,0 +1,52 @@
+/*
+ * 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.ych;
+
+/**
+ * Abstraction of an entity which has the composite protocol request.
+ *
+ * Protocols like RESTCONF, have split the schema specific information across
+ * different components in the protocol encoding.
+ *
+ * There is a resource identifier, which is part of the RESTCONF request URL.
+ * and there is the information about the resource being operated on in the
+ * request, this is part of the request body.
+ */
+public interface YangCompositeEncoding {
+
+    /**
+     * Retrieves the resource identifier on which the operation is being
+     * performed.
+     *
+     * @return the string representation of the resource being identified
+     */
+    String getResourceIdentifier();
+
+    /**
+     * Retrieves the representation format of the resource identifier.
+     *
+     * @return the type of the resource identifier
+     */
+    YangResourceIdentifierType getResourceIdentifierType();
+
+    /**
+     * Retrieves the resource information in the protocol encoding format.
+     *
+     * @return the resource information in the protocol encoding format
+     */
+    String getResourceInformation();
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangDataTreeCodec.java b/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangDataTreeCodec.java
new file mode 100644
index 0000000..246ba32
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangDataTreeCodec.java
@@ -0,0 +1,113 @@
+/*
+ * 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.ych;
+
+import org.onosproject.yms.ydt.YdtBuilder;
+import org.onosproject.yms.ydt.YmsOperationType;
+
+/**
+ * Abstraction of an entity which overrides the default codec.
+ *
+ * YANG has it extension framework which allows vendor / implementation
+ * specific operation or extensions. The default CODECs will fail to handle
+ * such protocol requests. In such scenarios, the providers can register
+ * their specific CODEC's with the YANG codec utility to translate the protocol
+ * specific data to abstract YANG data tree, from which it can be translate into
+ * the YANG modelled java objects for the provider / driver to operate on the
+ * device.
+ */
+
+public interface YangDataTreeCodec {
+    /**
+     * When the YMS need to encode simple protocol operation request,
+     * it will translate the YANG objects into an abstract YANG data tree and
+     * invoke  this registered encode method. Protocol CODEC implementation
+     * needs to ensure the overridden method can handle any specific
+     * extension or representation of protocol data.
+     * The operation type will be set in YANG data tree builder.
+     *
+     * @param ydtBuilder        Abstract YANG data tree contains the  operation
+     *                          request
+     * @param protocolOperation protocol operation being performed
+     * @return protocol specific string representation.
+     */
+    String encodeYdtToProtocolFormat(YdtBuilder ydtBuilder,
+                                     YmsOperationType protocolOperation);
+
+    /**
+     * When the YMS need to encode composite protocol operation request, it
+     * will translate the YANG objects into an abstract YANG data
+     * tree and invoke this registered encode method. Protocol CODEC
+     * implementation needs to ensure the overridden method can  handle any
+     * specific extension or representation of protocol data.
+     * The Initial chain of node in the YDT will have the operation type set
+     * to NONE to specify it is a resource identifier. The Resource
+     * information is maintained as a subtree to the resource identifier node.
+     *
+     * @param ydtBuilder        Abstract YANG data tree contains the  operation
+     *                          request
+     * @param protocolOperation protocol operation being performed
+     * @return composite response containing the requested operation
+     * information
+     */
+    YangCompositeEncoding encodeYdtToCompositeProtocolFormat(
+            YdtBuilder ydtBuilder, YmsOperationType protocolOperation);
+
+    /**
+     * When YMS decode simple protocol operation request it uses the
+     * registered decode method to translate the protocol data into a
+     * abstract YANG data tree. Then translate the abstract YANG data
+     * tree into the YANG modeled Java objects.
+     * The CODEC implementation are unaware of the schema against which they
+     * are performing the codec operation, so YMS will send the schema
+     * registry on which the YANG data tree needs to operate, so the code
+     * implementation needs to pass this schema registry to the get a YDT
+     * builder.
+     *
+     * @param protocolData         input string containing the simple
+     *                             protocol data which needs to be decoded
+     * @param schemaRegistryForYdt Schema registry based on which the YANG
+     *                             data tree will be built
+     * @param protocolOperation    protocol operation being performed
+     * @return decoded operation request in YANG data tree
+     */
+    YdtBuilder decodeProtocolDataToYdt(String protocolData,
+                                       Object schemaRegistryForYdt,
+                                       YmsOperationType protocolOperation);
+
+    /**
+     * When YMS decode composite protocol operation request it uses the
+     * registered decode method to translate the protocol data into a
+     * abstract YANG data tree. Then translate the abstract YANG data
+     * tree into the YANG modeled Java objects.
+     * The CODEC implementation are unaware of the schema against which they
+     * are performing the codec operation, so YMS will send the schema
+     * registry on which the YANG data tree needs to operate, so the code
+     * implementation needs to pass this schema registry to the get a YDT
+     * builder.
+     *
+     * @param protocolData         composite input string containing the
+     *                             protocol data which needs to be decoded
+     * @param schemaRegistryForYdt Schema registry based on which the YANG
+     *                             data tree will be built
+     * @param protocolOperation    protocol operation being performed
+     * @return decoded operation request in YANG data tree
+     */
+    YdtBuilder decodeCompositeProtocolDataToYdt(
+            YangCompositeEncoding protocolData, Object schemaRegistryForYdt,
+            YmsOperationType protocolOperation);
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangProtocolEncodingFormat.java b/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangProtocolEncodingFormat.java
new file mode 100644
index 0000000..0917d30
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangProtocolEncodingFormat.java
@@ -0,0 +1,32 @@
+/*
+ * 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.ych;
+
+/**
+ * Represents the protocol data representation.
+ */
+public enum YangProtocolEncodingFormat {
+    /**
+     * XML protocol encoding.
+     */
+    XML_ENCODING,
+
+    /**
+     * JSON protocol encoding.
+     */
+    JSON_ENCODING
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangResourceIdentifierType.java b/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangResourceIdentifierType.java
new file mode 100644
index 0000000..fa25634
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ych/YangResourceIdentifierType.java
@@ -0,0 +1,27 @@
+/*
+ * 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.ych;
+
+/**
+ * Represents the protocol data representation.
+ */
+public enum YangResourceIdentifierType {
+    /**
+     * Uniform Resource Identifier.
+     */
+    URI
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/Ydt.java b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/Ydt.java
index 72790e2..9b27d5e 100644
--- a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/Ydt.java
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/Ydt.java
@@ -16,8 +16,6 @@
 
 package org.onosproject.yms.ydt;
 
-import org.onosproject.yms.ymsm.YmsOperationType;
-
 /**
  * Abstraction of an entity which represent YANG data tree. This is used
  * for exchanging information between YANG management system and NBI protocol.
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtBuilder.java b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtBuilder.java
index b31ce04..f6a7f6e 100644
--- a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtBuilder.java
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtBuilder.java
@@ -183,14 +183,26 @@
     void addLeaf(String name, String namespace, Set<String> valueSet);
 
     /**
-     * Adds YANG list's keys value in the order defined in list's key statement.
-     * All the keys must be present any missing key or invalid key will result
-     * in exception.
+     * Adds an instance of a child list node, or adds a child leaf list with
+     * multiple instance.
+     * In case the name and namespace identifies the child list node, then
+     * the values for all the key leaves must be passed in the same order of
+     * schema. Then the effective YANG data tree will be like adding a  list
+     * node, followed by adding the key leaves as the child to the list node.
+     * After this operation, the call to getCurNode will return the list node.
+     * In case the name and namespace identifies the child leaf-list, then
+     * the values identifies the instance of leaf list.
+     * After this operation, the call to getCurNode will return the leaf-list
+     * node.
      *
-     * @param keysValueList values of the keys in URI in the same order
-     *                      as defined in YANG file
+     * @param name      name of child to be added
+     * @param namespace namespace of child to be added, if it's null, parent's
+     *                  namespace will be applied to child
+     * @param valueList values of the keys in URI in the same order
+     *                  as defined in YANG file
      */
-    void addKeyLeafs(List<String> keysValueList);
+    void addMultiInstanceChild(String name, String namespace,
+                               List<String> valueList);
 
     /**
      * Traverses up in YANG data tree to the parent node, it is to be used when
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtContextResponseInfo.java b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtContextResponseInfo.java
index 279d33e..b912fcf 100644
--- a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtContextResponseInfo.java
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtContextResponseInfo.java
@@ -22,5 +22,11 @@
  * operation result etc.
  */
 public interface YdtContextResponseInfo {
-    //TODO
+
+    /**
+     * Retrieve the context specific error information.
+     *
+     * @return context specific error information
+     */
+    YdtErrorInfo getYdtErrorInfo();
 }
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtErrorInfo.java b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtErrorInfo.java
new file mode 100644
index 0000000..283bee4
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YdtErrorInfo.java
@@ -0,0 +1,39 @@
+/*
+ * 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.ydt;
+
+/**
+ * Abstraction of an entity which contains context specific error info.
+ */
+public interface YdtErrorInfo {
+    /**
+     * Retrieves the application specific error tag corresponding to the
+     * error context in operation.
+     *
+     * @return application specific error tag corresponding to the error
+     * context in operation
+     */
+    String getErrorAppTag();
+
+    /**
+     * Retrieves the error message corresponding to the error context in
+     * operation.
+     *
+     * @return the error message corresponding to the error context in operation
+     */
+    String getErrorMessage();
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YmsOperationExecutionStatus.java b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YmsOperationExecutionStatus.java
index 3ac63ee..2213a3f 100644
--- a/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YmsOperationExecutionStatus.java
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YmsOperationExecutionStatus.java
@@ -26,9 +26,22 @@
  * YANG management system is responsible to split the protocol operation
  * across application(s) which needs to participate, and collate the
  * response(s) from application(s) and return an effective result of the
- * operation request. The result of the operation request is returned in
- * YMS operation result.
+ * operation request. The status of the operation execution is returned.
  */
-public interface YmsOperationExecutionStatus {
-    // TODO
+public enum YmsOperationExecutionStatus {
+
+    /**
+     * Successful execution of the operation.
+     */
+    EXECUTION_SUCCESS,
+
+    /**
+     * Exception in execution of the operation.
+     */
+    EXECUTION_EXCEPTION,
+
+    /**
+     * Error in execution of the operation.
+     */
+    ERROR_EXCEPTION
 }
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ymsm/YmsOperationType.java b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YmsOperationType.java
similarity index 85%
rename from apps/yms/api/src/main/java/org/onosproject/yms/ymsm/YmsOperationType.java
rename to apps/yms/api/src/main/java/org/onosproject/yms/ydt/YmsOperationType.java
index 45958de..f31e230 100644
--- a/apps/yms/api/src/main/java/org/onosproject/yms/ymsm/YmsOperationType.java
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ydt/YmsOperationType.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.onosproject.yms.ymsm;
+package org.onosproject.yms.ydt;
 
 /**
  * Represents type of root level operation for the request.
@@ -59,23 +59,43 @@
      * The YANG based request is to edit a config node / subtree in the data
      * store.
      */
-    EDIT_CONFIG,
+    EDIT_CONFIG_REQUEST,
 
     /**
      * The YANG based request is to query a config node / subtree in the data
      * store.
      */
-    QUERY_CONFIG,
+    QUERY_CONFIG_REQUEST,
 
     /**
      * The YANG based request is to query a node / subtree in the data store.
      */
-    QUERY,
+    QUERY_REQUEST,
 
     /**
      * The YANG based request is to execute an RPC defined in YANG.
      */
-    RPC,
+    RPC_REQUEST,
+
+    /**
+     * The YANG based response is for edit operation.
+     */
+    EDIT_CONFIG_REPLY,
+
+    /**
+     * The YANG based response is for query config operation.
+     */
+    QUERY_CONFIG_REPLY,
+
+    /**
+     * The YANG based response is for query operation.
+     */
+    QUERY_REPLY,
+
+    /**
+     * The YANG based response is for a RPC operation.
+     */
+    RPC_REPLY,
 
     /**
      * The YANG based request is to execute an RPC defined in YANG.
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ymsm/YmsService.java b/apps/yms/api/src/main/java/org/onosproject/yms/ymsm/YmsService.java
index 0c9d5f3..d651859 100644
--- a/apps/yms/api/src/main/java/org/onosproject/yms/ymsm/YmsService.java
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ymsm/YmsService.java
@@ -19,10 +19,14 @@
 import java.util.List;
 
 import org.onosproject.yms.ych.YangCodecHandler;
+import org.onosproject.yms.ych.YangDataTreeCodec;
+import org.onosproject.yms.ych.YangProtocolEncodingFormat;
 import org.onosproject.yms.ydt.YdtBuilder;
 import org.onosproject.yms.ydt.YdtResponse;
 import org.onosproject.yms.ydt.YdtWalker;
+import org.onosproject.yms.ydt.YmsOperationType;
 import org.onosproject.yms.ynh.YangNotificationService;
+import org.onosproject.yms.ysr.YangModuleLibrary;
 
 /**
  * Abstraction of an entity which provides interfaces to YANG management
@@ -178,13 +182,6 @@
      * Depending on the operation type set in the YANG builder tree, the
      * application(s) get / set / operation interface is invoked.
      * These interface are part to the YANG modelled service interface.
-     *
-     * @param operationRequest operation request that was constructed
-     *                         by NBI protocol using YANG data tree
-     *                         builder. This operation request contains
-     *                         operation request that needs to be
-     *                         executed on the applicable application(s)
-     * @return returns the result of the operation execution.
      * Depending on the operation type, the YANG response data tree can have
      * the following information.
      *
@@ -213,10 +210,18 @@
      * will contain the application's RPC reply schema specific .
      * NBI protocol to use a Yang data tree walker to construct the
      * protocol specific reply.
+     *
+     * @param operationRequest operation request that was constructed
+     *                         by NBI protocol using YANG data tree
+     *                         builder. This operation request contains
+     *                         operation request that needs to be
+     *                         executed on the applicable application(s)
+     * @return returns the result of the operation execution.
      */
     YdtResponse executeOperation(YdtBuilder operationRequest);
 
-    // TODO execute operation which directly take data format string as input.
+    /* TODO add execute operation which directly take data format string as
+     input.*/
 
     /**
      * Returns YANG notification service.
@@ -287,6 +292,46 @@
     void unRegisterService(Object appManager, Class<?> yangService);
 
     /**
+     * Protocols like RESTCONF, share the list of YANG modules it support.
+     * using ietf-yang-library
+     *
+     * Retrieves the YANG module library supported by the server.
+     *
+     * @return YANG module library supported by the server
+     */
+    YangModuleLibrary getYangModuleLibrary();
+
+    /**
+     * Protocols like RESTCONF, use the definitions within the YANG modules
+     * advertised by the server are used to construct an RPC operation or
+     * data resource identifier.
+     *
+     * Schema Resource:
+     * The server can optionally support retrieval of the YANG modules it
+     * supports.
+     *
+     * @param moduleName      YANG module name.
+     * @param moduleNamespace namespace in which the module is defined.
+     * @return YANG file contents of the requested YANG module.
+     */
+    String getYangFile(String moduleName, String moduleNamespace);
+
+    /**
+     * Register protocol specific default CODEC. This is can be used by 1st
+     * protocol
+     * to support a protocol format CODEC. This CODEC will be used in both
+     * NBI and SBI.
+     *
+     * @param defaultCodec default codec to be used for a particular protocol
+     *                     data format
+     * @param dataFormat   data format to which encoding to be done.
+     *                     Currently XML and
+     *                     JSON formats are supported.
+     */
+    void registerDefaultCodec(YangDataTreeCodec defaultCodec,
+                              YangProtocolEncodingFormat dataFormat);
+
+    /**
      * Returns YANG codec handler utility.
      *
      * In SBI, the provider or driver uses YANG management system as a CODEC
@@ -294,11 +339,14 @@
      * the device schema. YANG utils is used to generate the java files
      * corresponding to the device schema. Provider or driver use these classes
      * to seamlessly manage the device as java objects. While sending the
-     * request to device, drivers use the utility to translate the objects to
-     * protocol specific data representation and then send to the device.
+     * request
+     * to device, drivers use the utility to translate the objects to protocol
+     * specific data representation and then send to the device.
      * Protocol or driver use the same instance of the codec utility across
-     * multiple translation request. Protocol or driver should not use the same
-     * instance of utility concurrently.
+     * multiple
+     * translation request.
+     * Protocol or driver should not use the same instance of utility
+     * concurrently.
      *
      * @return YANG codec utility
      */
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ynh/YangNotification.java b/apps/yms/api/src/main/java/org/onosproject/yms/ynh/YangNotification.java
new file mode 100644
index 0000000..48e9807
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ynh/YangNotification.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2015-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.ynh;
+
+import org.onosproject.yms.ydt.YdtContext;
+
+/**
+ * Represents YANG notification which is a subject of YANG based event.
+ *
+ * YMS add themselves as a listener to applications. Application sends
+ * their notification in YANG utils generated notification. YMS obtains
+ * the module/sub-module schema tree in which this notification is contained
+ * and then convert this data to an abstract tree notation (YDT) with root
+ * node as the logical node with name "yangnotification" it contains
+ * module/sub-module node in which notification is contained.
+ * It sends the same to all the protocol who has added them as a listener
+ * as a YANG notification.
+ *
+ * This class represents YANG notification which contains the
+ * notification context in abstract tree notation.
+ */
+public class YangNotification {
+
+    /**
+     * YANG notification in form of abstract tree notation (YDT)
+     * Root node of notification root context will be logical node with
+     * name as "yangnotification", it contains module/sub-module node
+     * in which notification is contained.
+     */
+    YdtContext notificationRootContext;
+
+    /**
+     * Creates an instance of YANG notification subject.
+     *
+     * @param notificationContext logical root node with name as
+     *                            "yangnotification"
+     */
+    public YangNotification(YdtContext notificationContext) {
+        this.notificationRootContext = notificationContext;
+    }
+
+    /**
+     * Assign the YANG modeled notification data.
+     *
+     * @param notificationRootContext YANG data tree containing the data for
+     *                                the notification
+     */
+    public void setNotificationRootContext(YdtContext notificationRootContext) {
+        this.notificationRootContext = notificationRootContext;
+    }
+
+    /**
+     * Returns YANG notification data.
+     *
+     * @return YANG data tree containing the data for the notification
+     */
+    public YdtContext getNotificationRootContext() {
+        return notificationRootContext;
+    }
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ynh/YangNotificationEvent.java b/apps/yms/api/src/main/java/org/onosproject/yms/ynh/YangNotificationEvent.java
new file mode 100644
index 0000000..ca3292d
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ynh/YangNotificationEvent.java
@@ -0,0 +1,52 @@
+/*
+ * 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.ynh;
+
+import org.onosproject.event.AbstractEvent;
+
+/**
+ * Represents YANG notification event.
+ *
+ * YANG notification handler listens for the notification from the application.
+ * It convert the received notification in YANG notification events.
+ *
+ * YangNotificationEvent represents event generated by YANG management system
+ * in response to the YANG defined application notification. The applications
+ * notification information is in abstract YANG data tree.
+ */
+public class YangNotificationEvent
+        extends AbstractEvent<YangNotificationEvent.Type, YangNotification> {
+
+    /**
+     * Event type is the notification as defined in the YANG file.
+     */
+    public enum Type {
+        /**
+         * Indicates a YANG notification.
+         */
+        YANG_NOTIFICATION
+    }
+
+    /**
+     * YANG notification information shared to NBI protocol in YANG data tree
+     * using the registered callback.
+     *
+     * @param subject notification information in YANG data tree.
+     */
+    public YangNotificationEvent(YangNotification subject) {
+        super(Type.YANG_NOTIFICATION, subject);
+    }
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ynh/YangNotificationListener.java b/apps/yms/api/src/main/java/org/onosproject/yms/ynh/YangNotificationListener.java
new file mode 100644
index 0000000..eeca157
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ynh/YangNotificationListener.java
@@ -0,0 +1,28 @@
+/*
+ * 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.ynh;
+
+import org.onosproject.event.EventListener;
+
+/**
+ * Abstraction of listener for YANG notification handler events.
+ * NBI protocols/interfaces supporting YANG notification needs to implement
+ * YANG notification listener and add themselves as a listener to YANG
+ * notification event.
+ */
+public interface YangNotificationListener
+        extends EventListener<YangNotificationEvent> {
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ynh/YangNotificationService.java b/apps/yms/api/src/main/java/org/onosproject/yms/ynh/YangNotificationService.java
index 1beb498..a32f45f 100644
--- a/apps/yms/api/src/main/java/org/onosproject/yms/ynh/YangNotificationService.java
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ynh/YangNotificationService.java
@@ -16,17 +16,86 @@
 
 package org.onosproject.yms.ynh;
 
+import org.onosproject.event.ListenerService;
+
 /**
  * Abstraction of an entity which provides interfaces to YANG notification
- * service. YNH handles notification from the application/core and provide
- * it to the protocols.
- * <p>
+ * service. YANG notification handler receives the event notifications from
+ * application/core and provide it to the protocols.
+ *
  * NBI Protocols which can support notification delivery for application(s)
  * needs to add themselves as a listeners with YANG notification service.
- * Protocols can use YANG notification service to check if a received
+ * Also based on registered schema YMS add themselves as a listener to
+ * applications. Application sends their notification in YANG utils generated
+ * notification. YMS obtains the module/sub-module schema tree in which this
+ * notification is contained and then convert this data to an abstract tree
+ * notation (YDT) with root node as the module/sub-module node in which
+ * notification is contained. It sends the same to all the protocol who has
+ * added them as a listener as a YANG notification.
+ *
+ * Also Protocols can use YANG notification service to check if a received
  * notification should be filtered against any of their protocol specific
  * filtering mechanism.
  */
-public interface YangNotificationService {
-    //TODO
+public interface YangNotificationService
+        extends ListenerService<YangNotificationEvent,
+        YangNotificationListener> {
+
+   /*
+    *      Example of a use case of notification filtering.
+    *      The following example illustrates how to select fault events which
+    *      have severities of critical, major, or minor.  The filtering criteria
+    *      evaluation is as follows:
+    *
+    *      ((fault & severity=critical) | (fault & severity=major) | (fault &
+    *      severity=minor))
+    *
+    *           <netconf:rpc netconf:message-id="101"
+    *                   xmlns:netconf="urn:ietf:params:xml:ns:netconf:base:1.0">
+    *             <create-subscription
+    *                 xmlns="urn:ietf:params:xml:ns:netconf:notification:1.0">
+    *               <filter netconf:type="subtree">
+    *                 <event xmlns="http://example.com/event/1.0">
+    *                   <eventClass>fault</eventClass>
+    *                   <severity>critical</severity>
+    *                 </event>
+    *                 <event xmlns="http://example.com/event/1.0">
+    *                   <eventClass>fault</eventClass>
+    *                   <severity>major</severity>
+    *                 </event>
+    *                 <event xmlns="http://example.com/event/1.0">
+    *                   <eventClass>fault</eventClass>
+    *                   <severity>minor</severity>
+    *                 </event>
+    *               </filter>
+    *             </create-subscription>
+    *           </netconf:rpc>
+    */
+
+    /**
+     * Protocols have their own mechanism to support notification filtering
+     * or notification subscription. Depending on the protocol specification,
+     * the filtering is implemented in the protocol.
+     * The Protocol implementations are abstracted of the Schema, there are
+     * scenarios in which  they need to check if the received notification
+     * is of interest as per the schema filtering / subscription.
+     * In such scenario, protocols can create a filtering / subscription YANG
+     * data tree and use the notification service to filter the notification
+     * subject against their filter.
+     *
+     * Filters the notification subject YANG data tree, with the specified
+     * filter of the NBI protocol. If the filter does not match for the
+     * passed notification subject, null will be returned.
+     * Otherwise, the part of the subject matching the filter will be returned.
+     *
+     * @param notificationSubject YANG notification subject reported by YANG
+     *                            notification service.
+     * @param notificationFilter  Protocols data model specific notification
+     *                            filter represented in YANG data tree.
+     * @return filtered notification which passes the data model specific
+     * notification filter.
+     */
+    YangNotification getFilteredSubject(YangNotification notificationSubject,
+                                        YangNotification notificationFilter);
+
 }
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ynh/package-info.java b/apps/yms/api/src/main/java/org/onosproject/yms/ynh/package-info.java
index 4c62822..0d3f6c5 100644
--- a/apps/yms/api/src/main/java/org/onosproject/yms/ynh/package-info.java
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ynh/package-info.java
@@ -17,14 +17,11 @@
 /**
  * Provides interfaces to YANG notification handler. YNH handles notification
  * from the application and provide it to the protocols.
- */
-
-/**
- * Provides interfaces to YANG notification service.
  *
  * NBI Protocols which can support notification delivery for application(s)
- * needs to add themselves as a listeners with YANG notification service.
- * Protocols can use YANG notification service to check if a received
+ * need to add themselves as a listeners with YANG notification service.
+ *
+ * Also protocols can use YANG notification service to check if a received
  * notification should be filtered against any of their protocol specific
  * filtering mechanism.
  */
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ysr/YangModuleIdentifier.java b/apps/yms/api/src/main/java/org/onosproject/yms/ysr/YangModuleIdentifier.java
new file mode 100644
index 0000000..6b02720
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ysr/YangModuleIdentifier.java
@@ -0,0 +1,46 @@
+/*
+ * 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.ysr;
+
+/**
+ * Abstraction of an entity which provides YANG module identifiers.
+ * Reference RFC 7895
+ * YANG library provides information about all the YANG modules
+ * used by a network management server
+ */
+public interface YangModuleIdentifier {
+    /**
+     * retrieves the name of the YANG module.
+     *
+     * @return the name of the YANG module
+     */
+    String getModuleName();
+
+    /**
+     * Retrieves revision of the YANG module.
+     *
+     * Reference RFC 7895
+     * Each YANG module and submodule within the library has a
+     * revision.  This is derived from the most recent revision statement
+     * within the module or submodule.  If no such revision statement
+     * exists, the module's or submodule's revision is the zero-length
+     * string.
+     *
+     * @return revision of the YANG module
+     */
+    String getRevision();
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ysr/YangModuleInformation.java b/apps/yms/api/src/main/java/org/onosproject/yms/ysr/YangModuleInformation.java
new file mode 100644
index 0000000..f9c3114
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ysr/YangModuleInformation.java
@@ -0,0 +1,82 @@
+/*
+ * 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.ysr;
+
+import java.util.List;
+
+/**
+ * Abstraction of an entity which provides YANG module information.
+ *
+ * Reference RFC 7895
+ * The following information is needed by a client application (for each
+ * YANG module in the library) to fully utilize the YANG data modeling
+ * language:
+ *
+ * o  name: The name of the YANG module.
+ *
+ * o  revision: Each YANG module and submodule within the library has a
+ * revision.  This is derived from the most recent revision statement
+ * within the module or submodule.  If no such revision statement
+ * exists, the module's or submodule's revision is the zero-length
+ * string.
+ *
+ * o  submodule list: The name and revision of each submodule used by
+ * the module MUST be identified.
+ *
+ * o  feature list: The name of each YANG feature supported by the
+ * server MUST be identified.
+ *
+ * o  deviation list: The name of each YANG module used for deviation
+ * statements MUST be identified.
+ */
+public interface YangModuleInformation {
+    /**
+     * Retrieves the YANG modules identifier.
+     *
+     * @return YANG modules identifier
+     */
+    YangModuleIdentifier getModuleIdentifier();
+
+    /**
+     * Retrieves the YANG modules namespace.
+     * The XML namespace identifier for this module.
+     *
+     * @return YANG modules namespace
+     */
+    String getNamespace();
+
+    /**
+     * Reference RFC 7895
+     * Retrieves the list of YANG feature names from this module that are
+     * supported by the server, regardless of whether they are
+     * defined in the module or any included submodule.
+     *
+     * @return list of YANG features
+     */
+    List<String> getFeatureList();
+
+    /**
+     * Retrieves the list of submodules in the module.
+     * The name and revision of each submodule used by
+     * the module MUST be identified.
+     *
+     * Each entry represents one submodule within the
+     * parent module.
+     *
+     * @return list of submodules in the module
+     */
+    List<YangModuleIdentifier> getSubModuleIdentifier();
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ysr/YangModuleLibrary.java b/apps/yms/api/src/main/java/org/onosproject/yms/ysr/YangModuleLibrary.java
new file mode 100644
index 0000000..284ae86
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ysr/YangModuleLibrary.java
@@ -0,0 +1,84 @@
+/*
+ * 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.ysr;
+
+/*-
+ * Abstraction of an entity which provides the servers YANG library information.
+ *
+ * Reference RFC 7895
+ * The "ietf-yang-library" module provides information about the YANG
+ * library used by a server.  This module is defined using YANG version
+ * 1, but it supports the description of YANG modules written in any
+ * revision of YANG.
+ *
+ * Following is the YANG Tree Diagram for the "ietf-yang-library"
+ * module:
+ *
+ *     +--ro modules-state
+ *        +--ro module-set-id    string
+ *        +--ro module* [name revision]
+ *           +--ro name                yang:yang-identifier
+ *           +--ro revision            union
+ *           +--ro schema?             inet:uri
+ *           +--ro namespace           inet:uri
+ *           +--ro feature*            yang:yang-identifier
+ *           +--ro deviation* [name revision]
+ *           |  +--ro name        yang:yang-identifier
+ *           |  +--ro revision    union
+ *           +--ro conformance-type    enumeration
+ *           +--ro submodule* [name revision]
+ *              +--ro name        yang:yang-identifier
+ *              +--ro revision    union
+ *              +--ro schema?     inet:uri
+ */
+
+import java.util.List;
+
+public interface YangModuleLibrary {
+    /**
+     * Retrieves the current module set id of the YANG library.
+     *
+     * Reference RFC7895.
+     * modules-state/module-set-id
+     *
+     * This mandatory leaf contains a unique implementation-specific
+     * identifier representing the current set of modules and submodules on
+     * a specific server.  The value of this leaf MUST change whenever the
+     * set of modules and submodules in the YANG library changes.  There is
+     * no requirement that the same set always results in the same "module-
+     * set-id" value.
+     *
+     * @return module set id of the YANG library
+     */
+    String getModuleSetId();
+
+    /**
+     * Retrieves the current list of YANG modules supported in the server.
+     *
+     * Reference RFC 7895.
+     * modules-state/module
+     *
+     * This mandatory list contains one entry for each YANG data model
+     * module supported by the server.  There MUST be an entry in this list
+     * for each revision of each YANG module that is used by the server.  It
+     * is possible for multiple revisions of the same module to be imported,
+     * in addition to an entry for the revision that is implemented by the
+     * server.
+     *
+     * @return the current list of YANG modules supported in the server
+     */
+    List<YangModuleInformation> getYangModuleList();
+}
diff --git a/apps/yms/api/src/main/java/org/onosproject/yms/ysr/package-info.java b/apps/yms/api/src/main/java/org/onosproject/yms/ysr/package-info.java
new file mode 100644
index 0000000..4c19a5b
--- /dev/null
+++ b/apps/yms/api/src/main/java/org/onosproject/yms/ysr/package-info.java
@@ -0,0 +1,23 @@
+/*
+ * 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.
+ */
+
+/**
+ * YANG schema registry (YSR) is responsible to maintain all the applications
+ * schemas defined in YANG. The YANG data tree builder depends on the schema
+ * registry to validate the tree building according to schema.
+ * YANG codec handler using the schema registry to maintain device schema.
+ */
+package org.onosproject.yms.ysr;