[ONOS-7331] YANG Runtime: Add UT to validate te-scheduler based anydata.

Change-Id: Id92d44eb3a4eecc084a62157e3ee60ae07ddcd74
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/AnydataHandler.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/AnydataHandler.java
index 3f77147..049bbd1 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/impl/AnydataHandler.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/AnydataHandler.java
@@ -16,21 +16,15 @@
 
 package org.onosproject.yang.runtime.impl;
 
-import org.onosproject.yang.compiler.datamodel.AugmentedSchemaInfo;
-import org.onosproject.yang.compiler.datamodel.SchemaDataNode;
 import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
-import org.onosproject.yang.compiler.datamodel.YangSchemaNodeContextInfo;
-import org.onosproject.yang.compiler.datamodel.YangVersionHolder;
-
-import java.util.Iterator;
 
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.DOT_REGEX;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.INVAL_ANYDATA;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.QNAME_PRE;
 import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.errorMsg;
+import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getTargetNode;
 import static org.onosproject.yang.runtime.RuntimeHelper.PERIOD;
 import static org.onosproject.yang.runtime.impl.UtilsConstants.REV_REGEX;
-import static org.onosproject.yang.runtime.impl.YobConstants.DEFAULT;
 
 public final class AnydataHandler {
 
@@ -72,59 +66,7 @@
             throw new IllegalArgumentException(errorMsg(INVAL_ANYDATA, c));
         }
 
-        YangSchemaNode targetNode = getTargetNode(cn, paths, module, index + 1);
+        YangSchemaNode targetNode = getTargetNode(cn, module, index + 1);
         return targetNode;
     }
-
-    /**
-     * Returns the targeted child node YANG schema from the given schema node.
-     *
-     * @param paths canonical name of class
-     * @param s     top level schema node
-     * @param index index of child in module
-     * @return targeted child node YANG schema
-     * @throws IllegalArgumentException when provided identifier is not
-     *                                  not valid
-     */
-    private static YangSchemaNode getTargetNode(
-            String cn, String[] paths, YangSchemaNode s,
-            int index) throws IllegalArgumentException {
-        int i = index;
-        YangSchemaNodeContextInfo info;
-        YangSchemaNode schema = s;
-
-        while (i < paths.length) {
-            Iterator<YangSchemaNodeContextInfo> it = schema.getYsnContextInfoMap()
-                    .values().iterator();
-            boolean isSuccess = false;
-            while (it.hasNext()) {
-                info = it.next();
-                schema = info.getSchemaNode();
-                if (schema instanceof SchemaDataNode) {
-                    String name = paths[i];
-                    if (i == paths.length - 1) {
-                        name = name.replaceFirst(DEFAULT, "");
-                    }
-                    if (schema.getJavaAttributeName().equalsIgnoreCase(name)) {
-                        isSuccess = true;
-                        break;
-                    }
-                }
-            }
-            if (!isSuccess) {
-                // In case of augment the node will not be found in above
-                // iteration.
-                if (i < paths.length - 1) {
-                    AugmentedSchemaInfo in = ((YangVersionHolder) s)
-                            .getAugmentedSchemaInfo(cn);
-                    i = in.getPosition();
-                    schema = in.getSchemaNode();
-                } else {
-                    throw new IllegalArgumentException(errorMsg(INVAL_ANYDATA, cn));
-                }
-            }
-            i++;
-        }
-        return schema;
-    }
 }
\ No newline at end of file
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestUtils.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestUtils.java
index ddd4f55..f62127d 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestUtils.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestUtils.java
@@ -61,6 +61,11 @@
     public static final String LMNG = "yrt.Logistics-manager";
     public static final String LMNG_N = "Logistics-manager";
     public static final String TANY_NS = "yrt:list.test.anydata";
+    public static final String ACTN_SCHD_NS =
+            "urn:ietf:params:xml:ns:yang:actn-ietf-schedule";
+    public static final String ACTN_TE =
+            "urn:ietf:params:xml:ns:yang:actn-ietf-te";
+
     // Logger list is used for walker testing.
     private static final List<String> LOGGER = new ArrayList<>();
 
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobActnAnydataTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobActnAnydataTest.java
new file mode 100644
index 0000000..e1e3cc2
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YobActnAnydataTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.yang.runtime.impl;
+
+import org.junit.Test;
+import org.onosproject.yang.gen.v11.actnietfschedule.rev20170306.actnietfschedule.DefaultConfigurationSchedules;
+import org.onosproject.yang.gen.v11.actnietfschedule.rev20170306.actnietfschedule.Operation;
+import org.onosproject.yang.gen.v11.actnietfschedule.rev20170306.actnietfschedule.configurationschedules.DefaultTarget;
+import org.onosproject.yang.gen.v11.actnietfschedule.rev20170306.actnietfschedule.configurationschedules.target.DefaultDataValue;
+import org.onosproject.yang.gen.v11.actnietfschedule.rev20170306.actnietfschedule.schedules.Schedules;
+import org.onosproject.yang.gen.v11.actnietfschedule.rev20170306.actnietfschedule.schedules.schedules.Schedule;
+import org.onosproject.yang.gen.v11.actnietfte.rev20170310.actnietfte.tunnelp2pproperties.Config;
+import org.onosproject.yang.gen.v11.actnietfte.rev20170310.actnietfte.tunnelsgrouping.tunnels.DefaultTunnel;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.DefaultResourceData;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ResourceData;
+
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
+import static org.onosproject.yang.runtime.SerializerHelper.initializeDataNode;
+import static org.onosproject.yang.runtime.impl.serializerhelper.ActnIetfNetAnydataTest.actnDataTree;
+import static org.onosproject.yang.runtime.impl.serializerhelper.ActnIetfNetAnydataTest.validateDataNodeTree;
+
+/**
+ * Tests the YANG object building for the YANG data nodes based on the non
+ * schema augmented nodes.
+ */
+public class YobActnAnydataTest {
+    private static final String NW_TOPO_NAME_SPACE = "urn:ietf:params:xml:ns:yang:yrt-ietf-network-topology";
+    TestYangSerializerContext context = new TestYangSerializerContext();
+
+    @Test
+    public void anydataTest() {
+        DataNode.Builder dBlr = initializeDataNode(context);
+        context.getRegistry().registerAnydataSchema(
+                DefaultDataValue.class, DefaultTunnel.class);
+        DataNode dataNode = actnDataTree(dBlr);
+        ResourceData data = DefaultResourceData.builder()
+                .addDataNode(dataNode).build();
+        DefaultYobBuilder builder = new DefaultYobBuilder(context.getRegistry());
+        ModelObjectData modelObjectData = builder.getYangObject(data);
+        List<ModelObject> modelObjectList = modelObjectData.modelObjects();
+        ModelObject modelObject = modelObjectList.get(0);
+        DefaultConfigurationSchedules c1 = ((DefaultConfigurationSchedules) modelObject);
+        DefaultTarget target = ((DefaultTarget) c1.target().get(0));
+        assertThat(target.object().toString(), is("te-links"));
+
+        Operation obj = target.operation();
+        assertThat(obj.enumeration().toString(), is("configure"));
+
+        DefaultDataValue dataValue = (DefaultDataValue) target.dataValue();
+        DefaultTunnel tunnel = dataValue.anydata(DefaultTunnel.class);
+        assertThat(tunnel.name().toString(), is("p2p"));
+
+        Config config = tunnel.config();
+        assertThat(config.name().toString(), is("p2p"));
+
+        Schedules schedules = target.schedules();
+        Schedule schedule = schedules.schedule().get(0);
+        assertThat(((Long) schedule.scheduleId()).toString(), is("11"));
+        assertThat(schedule.start().toString(), is("2016-09-12T23:20:50.52Z"));
+        assertThat(schedule.scheduleDuration().toString(), is("PT108850373514M"));
+
+        validateDataNodeTree(dataNode);
+    }
+}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/YtbAtcnAnydataTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YtbAtcnAnydataTest.java
new file mode 100644
index 0000000..4560a75
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YtbAtcnAnydataTest.java
@@ -0,0 +1,119 @@
+/*
+ * 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.yang.runtime.impl;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.onosproject.yang.gen.v1.yrtietfyangtypes.rev20130715.yrtietfyangtypes.DateAndTime;
+import org.onosproject.yang.gen.v1.yrtietfyangtypes.rev20130715.yrtietfyangtypes.Xpath10;
+import org.onosproject.yang.gen.v11.actnietfschedule.rev20170306.actnietfschedule.DefaultConfigurationSchedules;
+import org.onosproject.yang.gen.v11.actnietfschedule.rev20170306.actnietfschedule.Operation;
+import org.onosproject.yang.gen.v11.actnietfschedule.rev20170306.actnietfschedule.configurationschedules.DefaultTarget;
+import org.onosproject.yang.gen.v11.actnietfschedule.rev20170306.actnietfschedule.configurationschedules.target.DefaultDataValue;
+import org.onosproject.yang.gen.v11.actnietfschedule.rev20170306.actnietfschedule.schedules.DefaultSchedules;
+import org.onosproject.yang.gen.v11.actnietfschedule.rev20170306.actnietfschedule.schedules.schedules.DefaultSchedule;
+import org.onosproject.yang.gen.v11.actnietfte.rev20170310.actnietfte.tunnelp2pproperties.DefaultConfig;
+import org.onosproject.yang.gen.v11.actnietfte.rev20170310.actnietfte.tunnelsgrouping.tunnels.DefaultTunnel;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.DefaultModelObjectData.Builder;
+import org.onosproject.yang.model.ModelObjectId;
+import org.onosproject.yang.model.NodeKey;
+import org.onosproject.yang.model.ResourceData;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.model.SchemaId;
+
+import java.util.List;
+
+import static org.onosproject.yang.gen.v11.actnietfschedule.rev20170306.actnietfschedule.operation.OperationEnum.CONFIGURE;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
+import static org.onosproject.yang.runtime.impl.serializerhelper.ActnIetfNetAnydataTest.validateDataNodeTree;
+
+/**
+ * Unit test cases for resource id conversion from model object id.
+ */
+public class YtbAtcnAnydataTest {
+
+    @Rule
+    public ExpectedException thrown = ExpectedException.none();
+    private ResourceData rscData;
+    private DefaultDataTreeBuilder treeBuilder;
+    private ResourceId id;
+    private List<NodeKey> keys;
+    private SchemaId sid;
+    private ModelObjectId mid;
+    private Builder data;
+    DefaultYangModelRegistry reg;
+
+    /**
+     * Prior setup for each UT.
+     */
+    @Before
+    public void setUp() {
+        processSchemaRegistry();
+        reg = registry();
+        treeBuilder = new DefaultDataTreeBuilder(reg);
+    }
+
+
+    /**
+     * Processes anydata with augmented node as child.
+     */
+    @Test
+    public void processAnydataTest() {
+
+        reg.registerAnydataSchema(
+                DefaultDataValue.class, DefaultTunnel.class);
+        DefaultConfigurationSchedules c1 = new DefaultConfigurationSchedules();
+        DefaultTarget target = new DefaultTarget();
+        target.object(new Xpath10("te-links"));
+        target.operation(new Operation(CONFIGURE));
+
+        DefaultTunnel tunnel = new DefaultTunnel();
+        tunnel.name("p2p");
+
+        DefaultConfig config = new DefaultConfig();
+        config.name("p2p");
+
+        tunnel.config(config);
+        DefaultDataValue dataValue = new DefaultDataValue();
+        dataValue.addAnydata(tunnel);
+
+        DefaultSchedules schedules = new DefaultSchedules();
+        DefaultSchedule schedule = new DefaultSchedule();
+        schedule.scheduleDuration("PT108850373514M");
+        schedule.start(DateAndTime.of("2016-09-12T23:20:50.52Z"));
+
+        long val = 11;
+        schedule.scheduleId(val);
+        schedules.addToSchedule(schedule);
+        target.schedules(schedules);
+
+        target.dataValue(dataValue);
+        c1.addToTarget(target);
+        data = new Builder();
+        data.addModelObject(c1);
+        rscData = treeBuilder.getResourceData(data.build());
+
+        List<DataNode> nodes = rscData.dataNodes();
+        DataNode n = nodes.get(0);
+
+        validateDataNodeTree(n);
+    }
+}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/ActnIetfNetAnydataTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/ActnIetfNetAnydataTest.java
new file mode 100644
index 0000000..a859803
--- /dev/null
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/serializerhelper/ActnIetfNetAnydataTest.java
@@ -0,0 +1,227 @@
+/*
+ * 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.yang.runtime.impl.serializerhelper;
+
+import org.junit.Test;
+import org.onosproject.yang.gen.v11.actnietfschedule.rev20170306.actnietfschedule.configurationschedules.target.DefaultDataValue;
+import org.onosproject.yang.gen.v11.actnietfte.rev20170310.actnietfte.tunnelsgrouping.tunnels.DefaultTunnel;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.InnerNode;
+import org.onosproject.yang.model.KeyLeaf;
+import org.onosproject.yang.model.ListKey;
+import org.onosproject.yang.runtime.impl.TestYangSerializerContext;
+
+import java.util.Iterator;
+
+import static org.onosproject.yang.model.DataNode.Type.MULTI_INSTANCE_NODE;
+import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_LEAF_VALUE_NODE;
+import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
+import static org.onosproject.yang.runtime.SerializerHelper.addDataNode;
+import static org.onosproject.yang.runtime.SerializerHelper.exitDataNode;
+import static org.onosproject.yang.runtime.SerializerHelper.initializeDataNode;
+import static org.onosproject.yang.runtime.impl.TestUtils.ACTN_SCHD_NS;
+import static org.onosproject.yang.runtime.impl.TestUtils.ACTN_TE;
+import static org.onosproject.yang.runtime.impl.TestUtils.validateDataNode;
+import static org.onosproject.yang.runtime.impl.TestUtils.validateLeafDataNode;
+import static org.onosproject.yang.runtime.impl.TestUtils.walkINTree;
+
+/**
+ * Tests the serializer helper methods.
+ */
+public class ActnIetfNetAnydataTest {
+
+
+    private static final String[] EXPECTED = {
+            "Entry Node is configuration-schedules.",
+            "Entry Node is target.",
+            "Entry Node is object.",
+            "Exit Node is object.",
+            "Entry Node is operation.",
+            "Exit Node is operation.",
+            "Entry Node is data-value.",
+            "Entry Node is tunnel.",
+            "Entry Node is name.",
+            "Exit Node is name.",
+            "Entry Node is config.",
+            "Entry Node is name.",
+            "Exit Node is name.",
+            "Exit Node is config.",
+            "Exit Node is tunnel.",
+            "Exit Node is data-value.",
+            "Entry Node is schedules.",
+            "Entry Node is schedule.",
+            "Entry Node is schedule-id.",
+            "Exit Node is schedule-id.",
+            "Entry Node is start.",
+            "Exit Node is start.",
+            "Entry Node is schedule-duration.",
+            "Exit Node is schedule-duration.",
+            "Exit Node is schedule.",
+            "Exit Node is schedules.",
+            "Exit Node is target.",
+            "Exit Node is configuration-schedules."
+    };
+
+    /**
+     * Test anydata add to data node builder.
+     */
+    @Test
+    public void atcnDataNodeTest() {
+
+        TestYangSerializerContext context = new TestYangSerializerContext();
+        DataNode.Builder dBlr = initializeDataNode(context);
+        context.getRegistry().registerAnydataSchema(
+                DefaultDataValue.class, DefaultTunnel.class);
+        DataNode n = actnDataTree(dBlr);
+        validateDataNodeTree(n);
+    }
+
+    /**
+     * Creates the data node tree for actn anydata test case.
+     *
+     * @param dBlr data node builder
+     */
+    public static DataNode actnDataTree(DataNode.Builder dBlr) {
+
+        String value = null;
+        // Adding container configuration-schedules
+        dBlr = addDataNode(dBlr, "configuration-schedules", ACTN_SCHD_NS, value, null);
+        // Adding list target
+        dBlr = addDataNode(dBlr, "target", ACTN_SCHD_NS, value, null);
+        value = "te-links";
+        dBlr = addDataNode(dBlr, "object", ACTN_SCHD_NS, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = "configure";
+        dBlr = addDataNode(dBlr, "operation", ACTN_SCHD_NS, value, null);
+        dBlr = exitDataNode(dBlr);
+        // Adding anydata container
+        value = null;
+        dBlr = addDataNode(dBlr, "data-value", ACTN_SCHD_NS, value, null);
+
+        dBlr = addDataNode(dBlr, "tunnel", ACTN_TE, value, null);
+        value = "p2p";
+        dBlr = addDataNode(dBlr, "name", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        value = null;
+        dBlr = addDataNode(dBlr, "config", null, value, null);
+        value = "p2p";
+        dBlr = addDataNode(dBlr, "name", null, value, null);
+        dBlr = exitDataNode(dBlr);
+
+        dBlr = exitDataNode(dBlr); // config
+        dBlr = exitDataNode(dBlr); // tunnel
+        dBlr = exitDataNode(dBlr); // data-value
+
+        value = null;
+        // Adding container schedules
+        dBlr = addDataNode(dBlr, "schedules", ACTN_SCHD_NS, value, null);
+        // Adding list schedules
+        dBlr = addDataNode(dBlr, "schedule", null, value, null);
+        value = "11";
+        dBlr = addDataNode(dBlr, "schedule-id", null, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = "2016-09-12T23:20:50.52Z";
+        dBlr = addDataNode(dBlr, "start", null, value, null);
+        dBlr = exitDataNode(dBlr);
+        value = "PT108850373514M";
+        dBlr = addDataNode(dBlr, "schedule-duration", null, value, null);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
+        dBlr = exitDataNode(dBlr);
+        return dBlr.build();
+    }
+
+    /**
+     * Validates the given data node sub-tree.
+     *
+     * @param node data node which needs to be validated
+     */
+    public static void validateDataNodeTree(DataNode node) {
+        // Validating the data node.
+        DataNode n = node;
+
+        validateDataNode(n, "configuration-schedules", ACTN_SCHD_NS,
+                         SINGLE_INSTANCE_NODE, true, null);
+        Iterator<DataNode> it = ((InnerNode) n).childNodes().values().iterator();
+        n = it.next();
+        validateDataNode(n, "target", ACTN_SCHD_NS, MULTI_INSTANCE_NODE,
+                         true, null);
+        Iterator<KeyLeaf> keyIt = ((ListKey) n.key()).keyLeafs().iterator();
+        validateLeafDataNode(keyIt.next(), "object", ACTN_SCHD_NS, "te-links");
+
+        Iterator<DataNode> it1 = ((InnerNode) n).childNodes().values()
+                .iterator();
+        n = it1.next();
+        validateDataNode(n, "object", ACTN_SCHD_NS, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "te-links");
+        n = it1.next();
+        validateDataNode(n, "operation", ACTN_SCHD_NS, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "configure");
+
+        n = it1.next();
+        validateDataNode(n, "data-value", ACTN_SCHD_NS, SINGLE_INSTANCE_NODE,
+                         true, null);
+
+        Iterator<DataNode> it3 = ((InnerNode) n).childNodes().values()
+                .iterator();
+        n = it3.next();
+        validateDataNode(n, "tunnel", ACTN_TE, MULTI_INSTANCE_NODE,
+                         true, null);
+        keyIt = ((ListKey) n.key()).keyLeafs().iterator();
+        validateLeafDataNode(keyIt.next(), "name", ACTN_TE, "p2p");
+
+        it3 = ((InnerNode) n).childNodes().values().iterator();
+        n = it3.next();
+        validateDataNode(n, "name", ACTN_TE, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "p2p");
+        n = it3.next();
+        validateDataNode(n, "config", ACTN_TE, SINGLE_INSTANCE_NODE,
+                         true, null);
+        it3 = ((InnerNode) n).childNodes().values().iterator();
+        n = it3.next();
+        validateDataNode(n, "name", ACTN_TE, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "p2p");
+
+        n = it1.next();
+        validateDataNode(n, "schedules", ACTN_SCHD_NS, SINGLE_INSTANCE_NODE,
+                         true, null);
+
+        Iterator<DataNode> it2 = ((InnerNode) n).childNodes().values()
+                .iterator();
+        n = it2.next();
+        validateDataNode(n, "schedule", ACTN_SCHD_NS, MULTI_INSTANCE_NODE,
+                         true, null);
+        keyIt = ((ListKey) n.key()).keyLeafs().iterator();
+        validateLeafDataNode(keyIt.next(), "schedule-id", ACTN_SCHD_NS, "11");
+
+        it1 = ((InnerNode) n).childNodes().values().iterator();
+        n = it1.next();
+        validateDataNode(n, "schedule-id", ACTN_SCHD_NS,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE, false, "11");
+        n = it1.next();
+        validateDataNode(n, "start", ACTN_SCHD_NS, SINGLE_INSTANCE_LEAF_VALUE_NODE,
+                         false, "2016-09-12T23:20:50.52Z");
+
+        n = it1.next();
+        validateDataNode(n, "schedule-duration", ACTN_SCHD_NS,
+                         SINGLE_INSTANCE_LEAF_VALUE_NODE, false, "PT108850373514M");
+
+        walkINTree(node, EXPECTED);
+    }
+}
diff --git a/runtime/src/test/resources/schemaProviderTestYangFiles/actn-ietf-routing-types.yang b/runtime/src/test/resources/schemaProviderTestYangFiles/actn-ietf-routing-types.yang
new file mode 100644
index 0000000..faf0f28
--- /dev/null
+++ b/runtime/src/test/resources/schemaProviderTestYangFiles/actn-ietf-routing-types.yang
@@ -0,0 +1,713 @@
+module actn-ietf-routing-types {
+
+  namespace "urn:ietf:params:xml:ns:yang:actn-ietf-routing-types";
+  prefix "rt-types";
+
+  import yrt-ietf-yang-types {
+    prefix "yang";
+  }
+
+  import yrt-ietf-inet-types {
+    prefix "inet";
+  }
+
+  organization "IETF Routing Area Working Group (rtgwg)";
+
+  contact
+      "Routing Area Working Group - <rtgwg@ietf.org>";
+
+  description
+    "This module contains a collection of YANG data types
+     considered generally useful for routing protocols.";
+
+  revision 2017-02-27 {
+    description
+      "Initial revision.";
+    reference
+      "RFC TBD: Routing YANG Data Types";
+  }
+
+  /*** collection of types related to routing ***/
+  typedef router-id {
+    type yang:dotted-quad;
+    description
+      "A 32-bit number in the dotted quad format assigned to each
+       router. This number uniquely identifies the router within an
+       Autonomous System.";
+  }
+
+  // address-family
+  identity address-family {
+    description
+      "Base identity from which identities describing address
+       families are derived.";
+  }
+
+  identity ipv4 {
+    base address-family;
+    description
+      "This identity represents IPv4 address family.";
+  }
+
+  identity ipv6 {
+    base address-family;
+    description
+      "This identity represents IPv6 address family.";
+  }
+
+  //The rest of the values deinfed in the IANA registry
+
+  identity nsap {
+    base address-family;
+    description
+      "Address family from IANA registry.";
+  }
+  identity hdlc {
+    base address-family;
+    description
+      "(8-bit multidrop)
+        Address family from IANA registry.";
+  }
+  identity bbn1822 {
+    base address-family;
+    description
+      "AHIP (BBN report #1822)
+       Address family from IANA registry.";
+  }
+  identity ieee802 {
+    base address-family;
+    description
+      "(includes all 802 media plus Ethernet canonical format)
+       Address family from IANA registry.";
+  }
+  identity e163 {
+    base address-family;
+    description
+      "Address family from IANA registry.";
+  }
+  identity e164 {
+    base address-family;
+    description
+      "SMDS, Frame Relay, ATM
+       Address family from IANA registry.";
+  }
+  identity f69 {
+    base address-family;
+    description
+      "(Telex)
+       Address family from IANA registry.";
+  }
+  identity x121 {
+    base address-family;
+    description
+      "(X.25, Frame Relay)
+       Address family from IANA registry.";
+  }
+  identity ipx {
+    base address-family;
+    description
+      "Address family from IANA registry.";
+  }
+  identity appletalk {
+    base address-family;
+    description
+      "Address family from IANA registry.";
+  }
+  identity decnet-iv {
+    base address-family;
+    description
+      "Decnet IV
+       Address family from IANA registry.";
+  }
+  identity vines {
+    base address-family;
+    description
+      "Banyan Vines
+       Address family from IANA registry.";
+  }
+  identity e164-nsap {
+    base address-family;
+    description
+      "E.164 with NSAP format subaddress
+       Address family from IANA registry.";
+  }
+  identity dns {
+    base address-family;
+    description
+      "Domain Name System
+       Address family from IANA registry.";
+  }
+  identity dn {
+    base address-family;
+    description
+      "Distinguished Name
+       Address family from IANA registry.";
+  }
+  identity as-num {
+    base address-family;
+    description
+      "AS Number
+       Address family from IANA registry.";
+  }
+  identity xtp-v4 {
+    base address-family;
+    description
+      "XTP over IPv4
+       Address family from IANA registry.";
+  }
+  identity xtp-v6 {
+    base address-family;
+    description
+      "XTP over IPv6
+       Address family from IANA registry.";
+  }
+  identity xtp {
+    base address-family;
+    description
+      "XTP native mode XTP
+       Address family from IANA registry.";
+  }
+  identity fc-port {
+    base address-family;
+    description
+      "Fibre Channel World-Wide Port Name
+       Address family from IANA registry.";
+  }
+  identity fc-node {
+    base address-family;
+    description
+      "Fibre Channel World-Wide Node Name
+       Address family from IANA registry.";
+  }
+  identity gwid {
+    base address-family;
+    description
+      "Address family from IANA registry.";
+  }
+  identity l2vpn {
+    base address-family;
+    description
+      "Address family from IANA registry.";
+  }
+  identity mpls-tp-section-eid {
+    base address-family;
+    description
+      "MPLS-TP Section Endpoint Identifier
+       Address family from IANA registry.";
+  }
+  identity mpls-tp-lsp-eid {
+    base address-family;
+    description
+      "MPLS-TP LSP Endpoint Identifier
+       Address family from IANA registry.";
+  }
+  identity mpls-tp-pwe-eid {
+    base address-family;
+    description
+      "MPLS-TP Pseudowire Endpoint Identifier
+       Address family from IANA registry.";
+  }
+  identity mt-v4 {
+    base address-family;
+    description
+      "Multi-Topology IPv4.
+       Address family from IANA registry.";
+  }
+  identity mt-v6 {
+    base address-family;
+    description
+      "Multi-Topology IPv6.
+       Address family from IANA registry.";
+  }
+
+  /*** collection of types related to VPN ***/
+  typedef route-target {
+    type string {
+      pattern
+        '(0:(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|'
+      + '[0-5]?\d{0,3}\d):(429496729[0-5]|42949672[0-8]\d|'
+      + '4294967[01]\d{2}|429496[0-6]\d{3}|42949[0-5]\d{4}|'
+      + '4294[0-8]\d{5}|429[0-3]\d{6}|42[0-8]\d{7}|4[01]\d{8}|'
+      + '[0-3]?\d{0,8}\d))|'
+      + '(1:(((\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|'
+      + '1\d{2}|2[0-4]\d|25[0-5])):(6553[0-5]|655[0-2]\d|'
+      + '65[0-4]\d{2}|6[0-4]\d{3}|[0-5]?\d{0,3}\d))|'
+      + '(2:(429496729[0-5]|42949672[0-8]\d|4294967[01]\d{2}|'
+      + '429496[0-6]\d{3}|42949[0-5]\d{4}|4294[0-8]\d{5}|'
+      + '429[0-3]\d{6}|42[0-8]\d{7}|4[01]\d{8}|[0-3]?\d{0,8}\d):'
+      + '(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|'
+      + '[0-5]?\d{0,3}\d))';
+    }
+    description
+      "A route target is an 8-octet BGP extended community
+       initially identifying a set of sites in a BGP
+       VPN (RFC 4364). However, it has since taken on a more
+       general role in BGP route filtering.
+       A route target consists of three fields:
+       a 2-octet type field, an administrator field,
+       and an assigned number field.
+       According to the data formats for type 0, 1, and 2 defined in
+       RFC4360 and RFC5668, the encoding pattern is defined as:
+
+       0:2-octet-asn:4-octet-number
+       1:4-octet-ipv4addr:2-octet-number
+       2:4-octet-asn:2-octet-number.
+
+       Some valid examples are: 0:100:100, 1:1.1.1.1:100, and
+       2:1234567890:203.";
+    reference
+      "RFC4360: BGP Extended Communities Attribute.
+       RFC5668: 4-Octet AS Specific BGP Extended Community.";
+  }
+
+  typedef route-target-type {
+    type enumeration {
+      enum "import" {
+        value "0";
+        description
+          "The route target applies to route import.";
+       }
+      enum "export" {
+        value "1";
+        description
+          "The route target applies to route export.";
+       }
+      enum "both" {
+        value "2";
+        description
+          "The route target applies to both route import and
+           route export.";
+       }
+    }
+    description
+      "Indicates the role a route target takes
+       in route filtering.";
+    reference
+      "RFC4364: BGP/MPLS IP Virtual Private Networks (VPNs).";
+  }
+
+  typedef route-distinguisher {
+    type string {
+      pattern
+        '(0:(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|'
+      + '[0-5]?\d{0,3}\d):(429496729[0-5]|42949672[0-8]\d|'
+      + '4294967[01]\d{2}|429496[0-6]\d{3}|42949[0-5]\d{4}|'
+      + '4294[0-8]\d{5}|429[0-3]\d{6}|42[0-8]\d{7}|4[01]\d{8}|'
+      + '[0-3]?\d{0,8}\d))|'
+      + '(1:(((\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|'
+      + '1\d{2}|2[0-4]\d|25[0-5])):(6553[0-5]|655[0-2]\d|'
+      + '65[0-4]\d{2}|6[0-4]\d{3}|[0-5]?\d{0,3}\d))|'
+      + '(2:(429496729[0-5]|42949672[0-8]\d|4294967[01]\d{2}|'
+      + '429496[0-6]\d{3}|42949[0-5]\d{4}|4294[0-8]\d{5}|'
+      + '429[0-3]\d{6}|42[0-8]\d{7}|4[01]\d{8}|[0-3]?\d{0,8}\d):'
+      + '(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|'
+      + '[0-5]?\d{0,3}\d))|'
+      + '(([3-9a-fA-F]|[1-9a-fA-F][\da-fA-F]{1,3}):'
+      + '[\da-fA-F]{1,12})';
+    }
+    description
+      "A route distinguisher is an 8-octet value used to distinguish
+       routes from different BGP VPNs (RFC 4364). A route
+       distinguisher consists of three fields: A 2-octet type field,
+       an administrator field, and an assigned number field.
+       According to the data formats for type 0, 1, and 2 defined in
+       RFC4364, the encoding pattern is defined as:
+
+       0:2-octet-asn:4-octet-number
+       1:4-octet-ipv4addr:2-octet-number
+       2:4-octet-asn:2-octet-number.
+       2-octet-other-hex-number:6-octet-hex-number
+
+       Some valid examples are: 0:100:100, 1:1.1.1.1:100, and
+       2:1234567890:203.";
+    reference
+      "RFC4364: BGP/MPLS IP Virtual Private Networks (VPNs).";
+  }
+
+  /*** collection of types common to multicast ***/
+  typedef ipv4-multicast-group-address {
+    type inet:ipv4-address {
+      pattern '(2((2[4-9])|(3[0-9]))\.).*';
+    }
+    description
+      "This type represents an IPv4 multicast group address,
+       which is in the range from 224.0.0.0 to 239.255.255.255.";
+    reference
+      "RFC1112: Host Extensions for IP Multicasting.";
+  }
+
+  typedef ipv6-multicast-group-address {
+    type inet:ipv6-address {
+      pattern
+        '(([fF]{2}[0-9a-fA-F]{2}):).*';
+    }
+    description
+      "This type represents an IPv6 multicast group address,
+       which is in the range of FF00::/8.";
+    reference
+      "RFC4291: IP Version 6 Addressing Architecture. Sec 2.7.
+       RFC7346: IPv6 Multicast Address Scopes.";
+  }
+
+  typedef ip-multicast-group-address {
+    type union {
+      type ipv4-multicast-group-address;
+      type ipv6-multicast-group-address;
+    }
+    description
+     "This type represents an IP multicast group address and is IP
+      version neutral. The format of the textual representation
+      implies the IP version.";
+  }
+
+  typedef ipv4-multicast-source-address {
+    type union {
+      type enumeration {
+        //TODO: FIXME
+        //enum '*' {
+        enum 'any-src-addr' {
+          description
+          "Any source address.";
+        }
+      }
+      type inet:ipv4-address;
+    }
+    description
+      "Multicast source IPv4 address type.";
+  }
+
+  typedef ipv6-multicast-source-address {
+    type union {
+      type enumeration {
+        //TODO: FIXME
+        //enum '*' {
+        enum 'any-src-addr' {
+          description
+          "Any source address.";
+        }
+      }
+      type inet:ipv6-address;
+    }
+    description
+      "Multicast source IPv6 address type.";
+  }
+
+  /*** collection of types common to protocols ***/
+  typedef bandwidth-ieee-float32 {
+    type string {
+      pattern
+        '0[xX](0((\.0?)?[pP](\+)?0?|(\.0?))|'
+      + '1(\.([\da-fA-F]{0,5}[02468aAcCeE]?)?)?[pP](\+)?(12[0-7]|'
+      + '1[01]\d|0?\d?\d)?)';
+    }
+    description
+      "Bandwidth in IEEE 754 floating point 32-bit binary format:
+       (-1)**(S) * 2**(Exponent-127) * (1 + Fraction),
+       where Exponent uses 8 bits, and Fraction uses 23 bits.
+       The units are octets per second.
+       The encoding format is the external hexadecimal-significand
+       character sequences specified in IEEE 754 and C99,
+       restricted to be normalized, non-negative, and non-fraction:
+       0x1.hhhhhhp{+}d or 0X1.HHHHHHP{+}D
+       where 'h' and 'H' are hexadecimal digits, 'd' and 'D' are
+       integers in the range of [0..127].
+       When six hexadecimal digits are used for 'hhhhhh' or 'HHHHHH',
+       the least significant digit must be an even number.
+       'x' and 'X' indicate hexadecimal; 'p' and 'P' indicate power
+       of two.
+       Some examples are: 0x0p0, 0x1p10, and 0x1.abcde2p+20";
+    reference
+      "IEEE Std 754-2008: IEEE Standard for Floating-Point
+       Arithmetic.";
+  }
+
+  typedef link-access-type {
+    type enumeration {
+      enum "broadcast" {
+        description
+        "Specify broadcast multi-access network.";
+      }
+      enum "non-broadcast-multiaccess" {
+        description
+        "Specify Non-Broadcast Multi-Access (NBMA) network.";
+      }
+      enum "point-to-multipoint" {
+        description
+        "Specify point-to-multipoint network.";
+      }
+      enum "point-to-point" {
+        description
+        "Specify point-to-point network.";
+      }
+    }
+    description
+      "Link access type.";
+  }
+
+  typedef timer-multiplier {
+    type uint8;
+    description
+      "The number of timer value intervals that should be
+       interpreted as a failure.";
+  }
+
+  typedef timer-value-seconds16 {
+    type union {
+      type uint16 {
+        range "1..65535";
+        }
+      type enumeration {
+        enum "infinity" {
+          description "The timer is set to infinity.";
+        }
+        enum "not-set" {
+          description "The timer is not set.";
+        }
+      }
+    }
+    units seconds;
+    description "Timer value type, in seconds (16 bit range).";
+  }
+
+  typedef timer-value-seconds32 {
+    type union {
+      type uint32 {
+        range "1..4294967295";
+        }
+      type enumeration {
+        enum "infinity" {
+          description "The timer is set to infinity.";
+        }
+        enum "not-set" {
+          description "The timer is not set.";
+        }
+      }
+    }
+    units seconds;
+    description "Timer value type, in seconds (32 bit range).";
+  }
+
+  typedef timer-value-milliseconds {
+    type union {
+      type uint32{
+        range "1..4294967295";
+        }
+      type enumeration {
+        enum "infinity" {
+          description "The timer is set to infinity.";
+        }
+        enum "not-set" {
+          description "The timer is not set.";
+        }
+      }
+    }
+    units milliseconds;
+    description "Timer value type, in milliseconds.";
+  }
+
+  /*** collection of types related to MPLS/GMPLS ***/
+  typedef generalized-label {
+    type binary;
+    description
+      "Generalized label. Nodes sending and receiving the
+       Generalized Label know the kinds of link they are
+       using. Hence, the Generalized Label does not identify
+       its type.  Instead, nodes are expected to know from
+       the context and type of label to expect.";
+    reference "RFC3471: Section 3.2";
+  }
+
+  identity mpls-label-special-purpose-value {
+    description
+      "Base identity for deriving identities describing
+       special-purpose Multiprotocol Label Switching (MPLS) label
+       values.";
+    reference
+      "RFC7274: Allocating and Retiring Special-Purpose MPLS
+       Labels.";
+  }
+
+  identity ipv4-explicit-null-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the IPv4 Explicit NULL Label.";
+    reference
+      "RFC3032: MPLS Label Stack Encoding. Section 2.1.";
+  }
+
+  identity router-alert-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the Router Alert Label.";
+    reference
+      "RFC3032: MPLS Label Stack Encoding. Section 2.1.";
+  }
+
+  identity ipv6-explicit-null-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the IPv6 Explicit NULL Label.";
+    reference
+      "RFC3032: MPLS Label Stack Encoding. Section 2.1.";
+  }
+
+  identity implicit-null-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the Implicit NULL Label.";
+    reference
+      "RFC3032: MPLS Label Stack Encoding. Section 2.1.";
+  }
+
+  identity entropy-label-indicator {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the Entropy Label Indicator.";
+    reference
+      "RFC6790: The Use of Entropy Labels in MPLS Forwarding.
+       Sections 3 and 10.1.";
+  }
+
+  identity gal-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the Generic Associated Channel Label
+       (GAL).";
+    reference
+      "RFC5586: MPLS Generic Associated Channel.
+       Sections 4 and 10.";
+  }
+
+  identity oam-alert-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the OAM Alert Label.";
+    reference
+      "RFC3429: Assignment of the 'OAM Alert Label' for Multiprotocol
+       Label Switching Architecture (MPLS) Operation and Maintenance
+       (OAM) Functions.
+       Sections 3 and 6.";
+  }
+
+  identity extension-label {
+    base mpls-label-special-purpose-value;
+    description
+      "This identity represents the Extension Label.";
+    reference
+      "RFC7274: Allocating and Retiring Special-Purpose MPLS Labels.
+       Sections 3.1 and 5.";
+  }
+
+  typedef mpls-label-special-purpose {
+    type identityref {
+      base mpls-label-special-purpose-value;
+    }
+    description
+      "This type represents the special-purpose Multiprotocol Label
+       Switching (MPLS) label values.";
+    reference
+      "RFC3032: MPLS Label Stack Encoding.
+       RFC7274: Allocating and Retiring Special-Purpose MPLS
+       Labels.";
+  }
+
+  typedef mpls-label-general-use {
+    type uint32 {
+      range "16..1048575";
+    }
+    description
+      "The 20 bits label values in an MPLS label stack entry,
+       specified in RFC3032. This label value does not include
+       the encodings of Traffic Class and TTL (time to live).
+       The label range specified by this type is for general use,
+       with special-purpose MPLS label values excluded.";
+    reference
+      "RFC3032: MPLS Label Stack Encoding.";
+  }
+
+  typedef mpls-label {
+    type union {
+      type mpls-label-special-purpose;
+      type mpls-label-general-use;
+    }
+    description
+      "The 20 bits label values in an MPLS label stack entry,
+       specified in RFC3032. This label value does not include
+       the encodings of Traffic Class and TTL (time to live).";
+    reference
+      "RFC3032: MPLS Label Stack Encoding.";
+  }
+
+  /*
+   * Groupings
+   */
+  grouping mpls-label-stack {
+    description
+      "A grouping that specifies an MPLS label stack.";
+    container mpls-label-stack {
+      description
+        "Container for a list of MPLS label stack entries.";
+      list entry {
+        key "id";
+        description
+          "List of MPLS label stack entries.";
+        leaf id {
+          type uint8;
+          description
+            "Identifies the sequence of an MPLS label stack entries.
+             An entry with smaller ID value is precedes an entry in
+             the label stack with a smaller ID.";
+        }
+        leaf label {
+          type rt-types:mpls-label;
+          description
+            "Label value.";
+        }
+        leaf ttl {
+          type uint8;
+          description
+            "Time to Live (TTL).";
+          reference
+            "RFC3032: MPLS Label Stack Encoding.";
+        }
+        leaf traffic-class {
+          type uint8 {
+            range "0..7";
+          }
+          description
+            "Traffic Class (TC).";
+          reference
+            "RFC5462: Multiprotocol Label Switching (MPLS) Label
+             Stack Entry: 'EXP' Field Renamed to 'Traffic Class'
+             Field.";
+        }
+      }
+    }
+  } // mpls-label-stack
+
+  grouping vpn-route-targets {
+    description
+      "A grouping that specifies Route Target import-export rules
+       used in the BGP enabled Virtual Private Networks (VPNs).";
+    reference
+      "RFC4364: BGP/MPLS IP Virtual Private Networks (VPNs).
+       RFC4664: Framework for Layer 2 Virtual Private Networks
+       (L2VPNs)";
+    list vpn-target {
+      key route-target;
+      description
+        "List of Route Targets.";
+      leaf route-target {
+        type rt-types:route-target;
+        description
+          "Route Target value";
+      }
+      leaf route-target-type {
+        type rt-types:route-target-type;
+        mandatory true;
+        description
+          "Import/export type of the Route Target.";
+      }
+    }
+  } // vpn-route-targets
+}
diff --git a/runtime/src/test/resources/schemaProviderTestYangFiles/actn-ietf-schedule@2017-03-06.yang b/runtime/src/test/resources/schemaProviderTestYangFiles/actn-ietf-schedule@2017-03-06.yang
new file mode 100644
index 0000000..3fdd3dd
--- /dev/null
+++ b/runtime/src/test/resources/schemaProviderTestYangFiles/actn-ietf-schedule@2017-03-06.yang
@@ -0,0 +1,224 @@
+ module actn-ietf-schedule {
+     yang-version 1.1;
+     namespace "urn:ietf:params:xml:ns:yang:actn-ietf-schedule";
+
+     prefix "sch";
+     import yrt-ietf-yang-types {
+       prefix "yang";
+     }
+
+     organization "TBD";
+     contact "TBD";
+     description
+       "The model allows time scheduling parameters to be specified.";
+
+     revision "2017-03-06" {
+       description "Initial revision";
+       reference "TBD";
+     }
+
+     /*
+      * Typedefs
+      */
+     typedef operation {
+       type enumeration {
+         enum configure {
+           description
+           "Create the configuration data.";
+         }
+         enum deconfigure {
+           description
+           "Remove the configuration data.";
+         }
+         enum set {
+           description
+           "Set the specified configuration data.";
+         }
+         enum reset {
+           description
+           "Revert the specified configuration data back to the
+            original value.";
+         }
+       }
+       description "Operation type.";
+     }
+     /*
+      * Groupings
+      */
+
+     grouping schedule-config-attributes {
+       description
+         "A group of attributes for a schedule.";
+
+       leaf inclusive-exclusive {
+         type enumeration {
+           enum inclusive {
+             description
+               "The schedule element is inclusive, i.e., the schedule
+                specifies the time at which the element is enabled.";
+           }
+           enum exclusive {
+             description
+               "The schedule element is exclusive. i.e., the schedule
+                specifies the time at which the element is disabled.";
+           }
+         }
+         default "inclusive";
+         description
+           "Whether the list item is inclusive or exclusive.";
+       }
+       leaf start {
+         type yang:date-and-time;
+         description "Start time.";
+       }
+       leaf schedule-duration {
+         type string {
+           pattern
+             'P(\d+Y)?(\d+M)?(\d+W)?(\d+D)?T(\d+H)?(\d+M)?(\d+S)?';
+         }
+         description "Schedule duration in ISO 8601 format.";
+       }
+       leaf repeat-interval {
+         type string {
+           pattern
+             'R\d*/P(\d+Y)?(\d+M)?(\d+W)?(\d+D)?T(\d+H)?(\d+M)?'
+             + '(\d+S)?';
+         }
+         description "Repeat interval in ISO 8601 format.";
+       }
+     } // schedule-config-attributes
+
+     grouping schedule-config-notification {
+       description
+         "A group of attributes for a schedule notification.";
+
+/****TODO: FIXME: cannot handle notification as child under a container??
+       notification execution {
+         description
+           "Notification event for an execution performed on a target
+            object.";
+         leaf operation {
+           type operation;
+           mandatory true;
+           description "Operation type.";
+         }
+         leaf datetime {
+           type yang:date-and-time;
+           description
+             "The date and time when the execution was performed.";
+         }
+         anydata results {
+           description
+             "This chunk of data contains the results of the execution
+              performed on the target object. The results are the same
+              or equivalent to the contents of a <rpc-reply> message,
+              Because of the nature of such a target execution, a
+              <rpc-reply> message is not used to return the execution
+              results. Instead, this notification is used to serve
+              the same purpose.";
+         }
+       }
+***TODO: FIXME***/
+     } // schedule-config-notification
+
+     grouping schedule-state-attributes {
+       description
+         "State attributes for a schedule.";
+       container future-executions {
+         description
+           "The state information of the nexte scheduled event.";
+         list execution {
+           key "start";
+           description
+             "List of scheduled future executions.";
+           leaf start {
+             type yang:date-and-time;
+             description "Start time.";
+           }
+           leaf duration {
+             type string {
+               pattern
+                 'P(\d+Y)?(\d+M)?(\d+W)?(\d+D)?T(\d+H)?(\d+M)?(\d+S)?';
+             }
+             description "Schedule duration in ISO 8601 format.";
+           }
+           leaf operation {
+             type operation;
+             description "Operation type.";
+           }
+         } // event
+       } // future-events
+     } // schedule-state-attributes
+
+     grouping schedules {
+       description
+         "A list of schedules defining when a particular
+          configuration takes effect.";
+       container schedules {
+         description
+           "Container of a schedule list defining when a particular
+            configuration takes effect.";
+         list schedule {
+           key "schedule-id";
+           description "A list of schedule elements.";
+           leaf schedule-id {
+             type uint32;
+             description "Identifies the schedule element.";
+           }
+           uses schedule-config-attributes;
+         }
+       }
+     } // schedules
+
+     /*
+      * Configuration data and operational state nodes
+      */
+     container configuration-schedules {
+       description
+         "Serves as top-level container for a list of configuration
+          schedules.";
+       list target {
+         key "object";
+         description
+           "A list of targets that configuration schedules are
+            applied.";
+         leaf object {
+           type yang:xpath1.0;
+           description
+             "Xpath defining the data items of interest.";
+         }
+         leaf operation {
+           type operation;
+           default "configure";
+           description
+             "Operation type.";
+         }
+
+         anydata data-value {
+           description
+             "The data value applied to the leaf data node
+              specified by data-objects.
+              The format of the data value depends on the value of the
+              leaf operation defined above:
+              configure:   data-value is the sub-tree added to the
+                           target object;
+              deconfigure: data-value is the child to be deleted from
+                           the target object;
+              set:         the target object MULST be a leaf, and
+                           data-value is the new value to be set to
+                           the target object;
+              reset:       data-value is ignored.";
+         }
+
+         uses schedules;
+         container state {
+           config false;
+           description
+             "Operational state data.";
+           uses schedule-state-attributes;
+         } // state
+
+         uses schedule-config-notification;
+       } // target
+     } // configuration-schedules
+   }
diff --git a/runtime/src/test/resources/schemaProviderTestYangFiles/actn-ietf-te-types@2017-03-10.yang b/runtime/src/test/resources/schemaProviderTestYangFiles/actn-ietf-te-types@2017-03-10.yang
new file mode 100755
index 0000000..161298f
--- /dev/null
+++ b/runtime/src/test/resources/schemaProviderTestYangFiles/actn-ietf-te-types@2017-03-10.yang
@@ -0,0 +1,1521 @@
+module actn-ietf-te-types {
+   namespace "urn:ietf:params:xml:ns:yang:actn-ietf-te-types";
+
+   /* Replace with IANA when assigned */
+   prefix "te-types";
+
+   import yrt-ietf-inet-types {
+     prefix inet;
+   }
+
+   import yrt-ietf-yang-types {
+     prefix "yang";
+   }
+
+   import actn-ietf-routing-types {
+     prefix "rt-types";
+   }
+
+   organization
+     "IETF Traffic Engineering Architecture and Signaling (TEAS)
+      Working Group";
+
+   contact
+     "WG Web:   <http://tools.ietf.org/wg/teas/>
+      WG List:  <mailto:teas@ietf.org>
+
+      WG Chair: Lou Berger
+                <mailto:lberger@labn.net>
+
+      WG Chair: Vishnu Pavan Beeram
+                <mailto:vbeeram@juniper.net>
+
+      Editor:   Tarek Saad
+                <mailto:tsaad@cisco.com>
+
+      Editor:   Rakesh Gandhi
+                <mailto:rgandhi@cisco.com>
+
+      Editor:   Vishnu Pavan Beeram
+                <mailto:vbeeram@juniper.net>
+
+      Editor:   Himanshu Shah
+                <mailto:hshah@ciena.com>
+
+      Editor:   Xufeng Liu
+                <mailto:xufeng.liu@ericsson.com>
+
+      Editor:   Xia Chen
+                <mailto:jescia.chenxia@huawei.com>
+
+      Editor:   Raqib Jones
+                <mailto:raqib@Brocade.com>
+
+      Editor:   Bin Wen
+                <mailto:Bin_Wen@cable.comcast.com>";
+
+   description
+     "This module contains a collection of generally
+     useful TE specific YANG data type defintions.";
+
+   revision "2017-03-10" {
+     description "Latest revision of TE types";
+     reference "RFC3209";
+   }
+
+   /*
+    * Identities
+    */
+
+   identity path-computation-method {
+     description
+      "base identity for supported path computation
+       mechanisms";
+   }
+
+   identity path-locally-computed {
+     base path-computation-method;
+     description
+       "indicates a constrained-path LSP in which the
+       path is computed by the local LER";
+   }
+
+   identity path-externally-queried {
+     base path-computation-method;
+     description
+      "Constrained-path LSP in which the path is
+       obtained by querying an external source, such as a PCE server.
+       In the case that an LSP is defined to be externally queried, it
+       may also have associated explicit definitions (which are provided
+       to the external source to aid computation); and the path that is
+       returned by the external source is not required to provide a
+       wholly resolved path back to the originating system - that is to
+       say, some local computation may also be required";
+   }
+
+   identity path-explicitly-defined {
+     base path-computation-method;
+     description
+      "constrained-path LSP in which the path is
+       explicitly specified as a collection of strict or/and loose
+       hops";
+   }
+
+   typedef te-ds-class {
+     type uint8 {
+       range "0..7";
+     }
+     description
+       "The Differentiatied Class-Type of traffic.";
+     reference "RFC4124: section-4.3.1";
+   }
+
+   typedef te-hop-type {
+     type enumeration {
+       enum LOOSE {
+         description
+           "loose hop in an explicit path";
+       }
+       enum STRICT {
+         description
+           "strict hop in an explicit path";
+       }
+     }
+     description
+      "enumerated type for specifying loose or strict
+       paths";
+   }
+
+   identity LSP_METRIC_TYPE {
+     description
+       "Base identity for types of LSP metric specification";
+   }
+
+   identity LSP_METRIC_RELATIVE {
+     base LSP_METRIC_TYPE;
+     description
+       "The metric specified for the LSPs to which this identity refers
+       is specified as a relative value to the IGP metric cost to the
+       LSP's tail-end.";
+   }
+
+   identity LSP_METRIC_ABSOLUTE {
+     base LSP_METRIC_TYPE;
+     description
+       "The metric specified for the LSPs to which this identity refers
+       is specified as an absolute value";
+   }
+
+   identity LSP_METRIC_INHERITED {
+     base LSP_METRIC_TYPE;
+     description
+       "The metric for for the LSPs to which this identity refers is
+       not specified explicitly - but rather inherited from the IGP
+       cost directly";
+   }
+
+   identity tunnel-type {
+     description
+       "Base identity from which specific tunnel types are
+       derived.";
+   }
+
+   identity tunnel-p2p {
+     base tunnel-type;
+     description
+       "TE point-to-point tunnel type.";
+   }
+
+   identity tunnel-p2mp {
+     base tunnel-type;
+     description
+       "TE point-to-multipoint tunnel type.";
+   }
+
+   identity tunnel-action-type {
+     description
+       "Base identity from which specific tunnel action types
+        are derived.";
+   }
+
+   identity tunnel-action-resetup {
+     base tunnel-action-type;
+     description
+       "TE tunnel action resetup. Tears the
+       tunnel's current LSP (if any) and
+       attempts to re-establish a new LSP";
+   }
+
+   identity tunnel-action-reoptimize {
+     base tunnel-action-type;
+     description
+       "TE tunnel action reoptimize.
+        Reoptimizes placement of the tunnel LSP(s)";
+   }
+
+   identity tunnel-action-switchpath {
+     base tunnel-action-type;
+     description
+       "TE tunnel action reoptimize
+        Switches the tunnel's LSP to use the specified path";
+   }
+
+   identity te-action-result {
+     description
+       "Base identity from which specific TE action results
+        are derived.";
+   }
+
+   identity te-action-success {
+     base te-action-result;
+     description "TE action successul.";
+   }
+
+   identity te-action-fail {
+     base te-action-result;
+     description "TE action failed.";
+   }
+
+   identity tunnel-action-inprogress {
+     base te-action-result;
+     description "TE action inprogress.";
+   }
+
+   identity state-type {
+     description
+       "Base identity for TE states";
+   }
+
+   identity state-up {
+     base state-type;
+     description
+       "State up";
+   }
+
+   identity state-down {
+     base state-type;
+     description
+       "State down";
+   }
+
+   identity prov-state-type {
+     description
+       "Base identity for TE tunnel provisioning states";
+   }
+
+   identity prov-state-down {
+     base prov-state-type;
+     description
+       "Provisioning state down";
+   }
+
+   identity prov-state-computing {
+     base prov-state-type;
+     description
+       "Provisioning state computing";
+   }
+
+   identity prov-state-computed-ok {
+     base prov-state-type;
+     description
+       "Provisioning state computation success";
+   }
+
+   identity prov-state-computed-fail {
+     base prov-state-type;
+     description
+       "Provisioning state computation failure";
+   }
+
+   identity prov-state-setting-up {
+     base prov-state-type;
+     description
+       "Provisioning state setting-up";
+   }
+
+   identity prov-state-setup-fail {
+     base prov-state-type;
+     description
+       "Provisioning state setup failure";
+   }
+
+   identity prov-state-active {
+     base prov-state-type;
+     description
+       "Provisioning state active (setup ok)";
+   }
+
+   identity prov-state-tearing-down {
+     base prov-state-type;
+     description
+       "Provisioning state tearing down";
+   }
+
+   identity path-invalidation-action-type {
+     description
+       "Base identity for TE path invalidation action types";
+   }
+
+   identity path-invalidation-action-drop-type {
+     base path-invalidation-action-type;
+     description
+       "TE path invalidation action drop";
+   }
+
+   identity path-invalidation-action-drop-tear {
+     base path-invalidation-action-type;
+     description
+       "TE path invalidation action tear";
+   }
+
+   identity lsp-prot-type {
+     description
+       "Base identity from which LSP protection types are
+       derived.";
+   }
+
+   identity lsp-prot-unprotected {
+     base lsp-prot-type;
+     description
+       "LSP protection 'Unprotected'";
+     reference "RFC4872";
+   }
+
+   identity lsp-prot-reroute-extra {
+     base lsp-prot-type;
+     description
+       "LSP protection '(Full) Rerouting'";
+     reference "RFC4872";
+   }
+
+   identity lsp-prot-reroute {
+     base lsp-prot-type;
+     description
+       "LSP protection 'Rerouting without Extra-Traffic'";
+     reference "RFC4872";
+   }
+
+   identity lsp-prot-1-for-n {
+     base lsp-prot-type;
+     description
+       "LSP protection '1:N Protection with Extra-Traffic'";
+     reference "RFC4872";
+   }
+
+   identity lsp-prot-unidir-1-to-1 {
+     base lsp-prot-type;
+     description
+       "LSP protection '1+1 Unidirectional Protection'";
+     reference "RFC4872";
+   }
+
+   identity lsp-prot-bidir-1-to-1 {
+     base lsp-prot-type;
+     description
+       "LSP protection '1+1 Bidirectional Protection'";
+     reference "RFC4872";
+   }
+
+   identity switching-capabilities {
+     description
+       "Base identity for interface switching capabilities";
+   }
+
+   identity switching-psc1 {
+     base switching-capabilities;
+     description
+       "Packet-Switch Capable-1 (PSC-1)";
+   }
+
+   identity switching-evpl {
+     base switching-capabilities;
+     description
+       "Ethernet Virtual Private Line (EVPL)";
+   }
+
+   identity switching-l2sc {
+     base switching-capabilities;
+     description
+       "Layer-2 Switch Capable (L2SC)";
+   }
+
+   identity switching-tdm {
+     base switching-capabilities;
+     description
+       "Time-Division-Multiplex Capable (TDM)";
+   }
+
+   identity switching-otn {
+     base switching-capabilities;
+     description
+       "OTN-TDM capable";
+   }
+
+   identity switching-dcsc {
+     base switching-capabilities;
+     description
+       "Data Channel Switching Capable (DCSC)";
+   }
+
+   identity switching-lsc {
+     base switching-capabilities;
+     description
+       "Lambda-Switch Capable (LSC)";
+   }
+
+   identity switching-fsc {
+     base switching-capabilities;
+     description
+       "Fiber-Switch Capable (FSC)";
+   }
+
+   identity lsp-encoding-types {
+     description
+       "Base identity for encoding types";
+   }
+
+   identity lsp-encoding-packet {
+     base lsp-encoding-types;
+     description
+       "Packet LSP encoding";
+   }
+
+   identity lsp-encoding-ethernet {
+     base lsp-encoding-types;
+     description
+       "Ethernet LSP encoding";
+   }
+
+   identity lsp-encoding-pdh {
+     base lsp-encoding-types;
+     description
+       "ANSI/ETSI LSP encoding";
+   }
+
+   identity lsp-encoding-sdh {
+     base lsp-encoding-types;
+     description
+       "SDH ITU-T G.707 / SONET ANSI T1.105 LSP encoding";
+   }
+
+   identity lsp-encoding-digital-wrapper {
+     base lsp-encoding-types;
+     description
+       "Digital Wrapper LSP encoding";
+   }
+
+   identity lsp-encoding-lambda {
+     base lsp-encoding-types;
+     description
+       "Lambda (photonic) LSP encoding";
+   }
+
+   identity lsp-encoding-fiber {
+     base lsp-encoding-types;
+     description
+       "Fiber LSP encoding";
+   }
+
+   identity lsp-encoding-fiber-channel {
+     base lsp-encoding-types;
+     description
+       "FiberChannel LSP encoding";
+   }
+
+   identity lsp-encoding-oduk {
+     base lsp-encoding-types;
+     description
+       "G.709 ODUk (Digital Path)LSP encoding";
+   }
+
+   identity lsp-encoding-optical-channel {
+     base lsp-encoding-types;
+     description
+       "Line (e.g., 8B/10B) LSP encoding";
+   }
+
+   identity lsp-encoding-line {
+     base lsp-encoding-types;
+     description
+       "Line (e.g., 8B/10B) LSP encoding";
+   }
+
+   identity path-signaling-type {
+     description
+       "Base identity from which specific path signaling
+        types are derived.";
+   }
+
+   identity path-signaling-rsvpte {
+     base tunnel-type;
+     description
+       "RSVP-TE path signaling type";
+   }
+
+   identity path-signaling-sr {
+     base tunnel-type;
+     description
+       "Segment-routing path signaling type";
+   }
+
+   identity te-path-setup-protocol {
+     description
+       "base identity for supported TE LSPs signaling
+        protocols";
+   }
+
+   identity te-path-setup-static {
+     base te-path-setup-protocol;
+     description
+       "Static LSP provisioning";
+   }
+
+   identity te-path-setup-rsvp {
+     base te-path-setup-protocol;
+     description
+       "RSVP-TE signaling protocol";
+   }
+
+   identity te-path-setup-sr {
+     base te-path-setup-protocol;
+     description
+       "Segment routing";
+   }
+
+   /* TE basic features */
+   feature p2mp-te {
+     description
+       "Indicates support for P2MP-TE";
+   }
+
+   feature frr-te {
+     description
+       "Indicates support for TE FastReroute (FRR)";
+   }
+
+   feature extended-admin-groups {
+     description
+       "Indicates support for TE link extended admin
+       groups.";
+   }
+
+   feature named-path-affinities {
+     description
+       "Indicates support for named path affinities";
+   }
+
+   feature named-extended-admin-groups {
+     description
+       "Indicates support for named extended admin groups";
+   }
+
+   feature named-srlg-groups {
+     description
+       "Indicates support for named SRLG groups";
+   }
+
+   feature named-path-constraints {
+     description
+       "Indicates support for named path constraints";
+   }
+
+   grouping explicit-route-hop_config {
+     description
+       "The explicit route subobject grouping";
+     leaf index {
+       type uint32;
+       description "ERO subobject index";
+     }
+     choice type {
+       description
+         "The explicit route subobject type";
+       case ip-address {
+         description
+           "IP address explicit route subobject";
+         container ip-address-hop {
+           description "IP address hop type";
+           leaf address {
+             type inet:ip-address;
+             description
+               "ERO IP address.";
+           }
+           leaf hop-type {
+             type te-hop-type;
+               description
+                 "strict or loose hop";
+           }
+         }
+       }
+       case as-number {
+         container as-number-hop {
+           leaf as-number {
+             type binary {
+               length 16;
+             }
+             description "AS number";
+           }
+           leaf hop-type {
+             type te-hop-type;
+               description
+                 "strict or loose hop";
+           }
+           description
+             "Autonomous System explicit route subobject";
+         }
+       }
+       case unnumbered-link {
+         container unnumbered-hop {
+           leaf router-id {
+             type inet:ip-address;
+             description
+               "A router-id address";
+           }
+           leaf interface-id {
+             type uint32;
+             description "The interface identifier";
+           }
+           leaf hop-type {
+             type te-hop-type;
+               description
+                 "strict or loose hop";
+           }
+           description
+             "Unnumbered link explicit route subobject";
+           reference
+             "RFC3477: Signalling Unnumbered Links in
+             RSVP-TE";
+         }
+       }
+       case label {
+         container label-hop {
+           description "Label hop type";
+           leaf value {
+             type rt-types:generalized-label;
+             description "the label value";
+           }
+         }
+         description
+           "The Label ERO subobject";
+       }
+       case sid {
+         container sid-hop {
+           description "foo";
+           leaf sid {
+             type rt-types:generalized-label;
+             description "Segment-routing identifier";
+           }
+         }
+         description "Segment-routing identifier";
+       }
+     }
+   }
+
+   grouping explicit-route-hop {
+     description "Explicit route hop grouping";
+     container config {
+       description
+         "Configuration parameters for the explicit route hop";
+       uses explicit-route-hop_config;
+     }
+     container state {
+       config false;
+       description
+         "State parameters for the explicit route hop";
+       uses explicit-route-hop_config;
+     }
+   }
+
+   grouping record-route-subobject {
+     description
+       "The record route subobject grouping";
+     choice type {
+       description
+         "The record route subobject type";
+       case ip-address {
+         leaf ip-address {
+           type inet:ip-address;
+           description
+             "RRO IP address subobject.";
+         }
+         leaf ip-flags {
+           type binary {
+             length 8;
+           }
+           description
+             "RRO IP address sub-object flags";
+           reference "RFC3209";
+         }
+       }
+       case unnumbered-link {
+         leaf router-id {
+           type inet:ip-address;
+           description
+             "A router-id address";
+         }
+         leaf interface-id {
+           type uint32;
+           description "The interface identifier";
+         }
+         description
+           "Unnumbered link record route subobject";
+         reference
+           "RFC3477: Signalling Unnumbered Links in
+            RSVP-TE";
+       }
+       case label {
+         leaf value {
+           type rt-types:generalized-label;
+           description "the label value";
+         }
+         leaf label-flags {
+           type binary {
+             length 8;
+           }
+           description
+             "Label sub-object flags";
+           reference "RFC3209";
+         }
+         description
+           "The Label ERO subobject";
+       }
+     }
+   }
+
+   identity route-usage-type {
+     description
+       "Base identity for route usage";
+   }
+
+   identity route-include-ero {
+     base route-usage-type;
+     description
+       "Include ERO from route";
+   }
+
+   identity route-exclude-ero {
+     base route-usage-type;
+     description
+       "Exclude ERO from route";
+   }
+
+   identity route-exclude-srlg {
+     base route-usage-type;
+     description
+       "Exclude SRLG from route";
+   }
+
+   identity path-metric-type {
+     description
+       "Base identity for path metric type";
+   }
+
+   identity path-metric-te {
+     base path-metric-type;
+     description
+       "TE path metric";
+   }
+
+   identity path-metric-igp {
+     base path-metric-type;
+     description
+       "IGP path metric";
+   }
+
+   identity path-metric-hop {
+     base path-metric-type;
+     description
+       "Hop path metric";
+   }
+
+   identity path-metric-delay {
+     base path-metric-type;
+     description
+       "Delay path metric";
+   }
+
+   identity path-tiebreaker-type {
+     description
+       "Base identity for path tie-breaker type";
+   }
+
+   identity path-tiebreaker-minfill {
+     base path-tiebreaker-type;
+     description
+       "Min-Fill LSP path placement";
+   }
+
+   identity path-tiebreaker-maxfill {
+     base path-tiebreaker-type;
+     description
+       "Max-Fill LSP path placement";
+   }
+
+   identity path-tiebreaker-randoom {
+     base path-tiebreaker-type;
+     description
+       "Random LSP path placement";
+   }
+
+   identity bidir-provisioning-mode {
+     description
+       "Base identity for bidirectional provisioning
+       mode.";
+   }
+
+   identity bidir-provisioning-single-sided {
+     base bidir-provisioning-mode;
+     description
+       "Single-sided bidirectional provioning mode";
+   }
+
+   identity bidir-provisioning-double-sided {
+     base bidir-provisioning-mode;
+     description
+       "Double-sided bidirectional provioning mode";
+   }
+
+   identity bidir-association-type {
+     description
+       "Base identity for bidirectional association type";
+   }
+
+   identity bidir-assoc-corouted {
+     base bidir-association-type;
+     description
+       "Co-routed bidirectional association type";
+   }
+
+   identity bidir-assoc-non-corouted {
+     base bidir-association-type;
+     description
+       "Non co-routed bidirectional association type";
+   }
+
+   identity resource-affinities-type {
+     description
+       "Base identity for resource affinities";
+   }
+
+   identity resource-aff-include-all {
+     base resource-affinities-type;
+     description
+       "The set of attribute filters associated with a
+       tunnel all of which must be present for a link
+       to be acceptable";
+   }
+
+   identity resource-aff-include-any {
+     base resource-affinities-type;
+     description
+       "The set of attribute filters associated with a
+       tunnel any of which must be present for a link
+       to be acceptable";
+   }
+
+   identity resource-aff-exclude-any {
+     base resource-affinities-type;
+     description
+       "The set of attribute filters associated with a
+       tunnel any of which renders a link unacceptable";
+   }
+
+   identity te-optimization-criterion {
+     description
+       "Base identity for TE optimization criterion.";
+     reference
+       "RFC3272: Overview and Principles of Internet Traffic
+        Engineering.";
+   }
+
+   identity not-optimized {
+     base te-optimization-criterion;
+     description "Optimization is not applied.";
+   }
+
+   identity cost {
+     base te-optimization-criterion;
+     description "Optimized on cost.";
+   }
+
+   identity delay {
+     base te-optimization-criterion;
+     description "Optimized on delay.";
+   }
+
+   /*
+    * Typedefs
+    */
+
+   typedef percentage {
+     type uint8 {
+       range "0..100";
+     }
+     description
+       "Integer indicating a percentage value";
+   }
+
+   typedef performance-metric-normality {
+     type enumeration {
+       enum "unknown" {
+         value 0;
+         description
+           "Unknown.";
+       }
+       enum "normal" {
+         value 1;
+         description
+           "Normal.";
+       }
+       enum "abnormal" {
+         value 2;
+         description
+           "Abnormal. The anomalous bit is set.";
+       }
+     }
+     description
+       "Indicates whether a performance metric is normal, abnormal, or
+        unknown.";
+     reference
+       "RFC7471: OSPF Traffic Engineering (TE) Metric Extensions.
+        RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.
+        RFC7823: Performance-Based Path Selection for Explicitly
+        Routed Label Switched Paths (LSPs) Using TE Metric
+        Extensions";
+   }
+
+   typedef te-admin-status {
+     type enumeration {
+       enum up {
+         description
+           "Enabled.";
+       }
+       enum down {
+         description
+           "Disabled.";
+       }
+       enum testing {
+         description
+           "In some test mode.";
+       }
+       enum preparing-maintenance {
+         description
+           "Resource is disabled in the control plane to prepare for
+            graceful shutdown for maintenance purposes.";
+         reference
+           "RFC5817: Graceful Shutdown in MPLS and Generalized MPLS
+            Traffic Engineering Networks";
+       }
+       enum maintenance {
+         description
+           "Resource is disabled in the data plane for maintenance
+            purposes.";
+       }
+     }
+     description
+       "Defines a type representing the administrative status of
+        a TE resource.";
+   }
+
+   typedef te-global-id {
+     type uint32;
+     description
+       "An identifier to uniquely identify an operator, which can be
+        either a provider or a client.
+        The definition of this type is taken from RFC6370 and RFC5003.
+        This attribute type is used solely to provide a globally
+        unique context for TE topologies.";
+   }
+
+   typedef te-link-access-type {
+     type enumeration {
+       enum point-to-point {
+         description
+           "The link is point-to-point.";
+       }
+       enum multi-access {
+         description
+           "The link is multi-access, including broacast and NBMA.";
+       }
+     }
+     description
+       "Defines a type representing the access type of a TE link.";
+     reference
+       "RFC3630: Traffic Engineering (TE) Extensions to OSPF
+        Version 2.";
+   }
+
+   typedef te-node-id {
+     type yang:dotted-quad;
+     description
+       "An identifier for a node in a topology.
+        The identifier is represented as 32-bit unsigned integer in
+        the dotted-quad notation.
+        This attribute is mapped to Router ID in
+        RFC3630, RFC5329, RFC5305, and RFC6119.";
+   }
+
+   typedef te-oper-status {
+     type enumeration {
+       enum up {
+         description
+         "Operational up.";
+       }
+       enum down {
+         description
+         "Operational down.";
+       }
+       enum testing {
+         description
+         "In some test mode.";
+       }
+       enum unknown {
+         description
+         "Status cannot be determined for some reason.";
+       }
+       enum preparing-maintenance {
+         description
+           "Resource is disabled in the control plane to prepare for
+            graceful shutdown for maintenance purposes.";
+         reference
+           "RFC5817: Graceful Shutdown in MPLS and Generalized MPLS
+            Traffic Engineering Networks";
+       }
+       enum maintenance {
+         description
+           "Resource is disabled in the data plane for maintenance
+            purposes.";
+       }
+     }
+     description
+       "Defines a type representing the operational status of
+        a TE resource.";
+   }
+
+   typedef te-recovery-status {
+     type enumeration {
+       enum normal {
+         description
+           "Both the recovery and working spans are fully
+            allocated and active, data traffic is being
+            transported over (or selected from) the working
+            span, and no trigger events are reported.";
+       }
+       enum recovery-started {
+         description
+           "The recovery action has been started, but not completed.";
+       }
+       enum recovery-succeeded {
+         description
+           "The recovery action has succeeded. The working span has
+            reported a failure/degrade condition and the user traffic
+            is being transported (or selected) on the recovery span.";
+       }
+       enum recovery-failed {
+         description
+           "The recovery action has failed.";
+       }
+       enum reversion-started {
+         description
+           "The reversion has started.";
+       }
+       enum reversion-failed {
+         description
+           "The reversion has failed.";
+       }
+       enum recovery-unavailable {
+         description
+           "The recovery is unavailable -- either as a result of an
+            operator Lockout command or a failure condition detected
+            on the recovery span.";
+       }
+       enum recovery-admin {
+         description
+           "The operator has issued a command switching the user
+            traffic to the recovery span.";
+       }
+       enum wait-to-restore {
+         description
+           "The recovery domain is recovering from a failuer/degrade
+            condition on the working span that is being controlled by
+            the Wait-to-Restore (WTR) timer.";
+       }
+     }
+     description
+       "Defines the status of a recovery action.";
+     reference
+       "RFC4427: Recovery (Protection and Restoration) Terminology
+        for Generalized Multi-Protocol Label Switching (GMPLS).
+        RFC6378: MPLS Transport Profile (MPLS-TP) Linear Protection";
+   }
+
+   typedef te-template-name {
+     type string {
+       pattern '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*';
+     }
+     description
+       "A type for the name of a TE node template or TE link
+        template.";
+   }
+
+   typedef te-topology-event-type {
+     type enumeration {
+       enum "add" {
+         value 0;
+         description
+           "A TE node or te-link has been added.";
+       }
+       enum "remove" {
+         value 1;
+         description
+           "A TE node or te-link has been removed.";
+       }
+       enum "update" {
+         value 2;
+         description
+           "A TE node or te-link has been updated.";
+       }
+     }
+     description "TE  Event type for notifications";
+   } // te-topology-event-type
+
+   typedef te-topology-id {
+     type string {
+       pattern
+         '([a-zA-Z0-9\-_.]+:)*'
+       + '/?([a-zA-Z0-9\-_.]+)(/[a-zA-Z0-9\-_.]+)*';
+     }
+     description
+       "An identifier for a topology.
+        It is optional to have one or more prefixes at the begining,
+        separated by colons. The prefixes can be the network-types,
+        defined in ietf-network.yang, to help user to understand the
+        topology better before further inquiry.";
+   }
+
+   typedef te-tp-id {
+     type union {
+       type uint32;          // Unnumbered
+       type inet:ip-address; // IPv4 or IPv6 address
+     }
+     description
+       "An identifier for a TE link endpoint on a node.
+        This attribute is mapped to local or remote link identifier in
+        RFC3630 and RFC5305.";
+   }
+
+   typedef admin-group {
+     type binary {
+       length 4;
+     }
+     description
+       "Administrative group/Resource class/Color.";
+   }
+
+   typedef extended-admin-group {
+     type binary;
+     description
+       "Extended administrative group/Resource class/Color.";
+   }
+
+   typedef admin-groups {
+     type union {
+       type admin-group;
+       type extended-admin-group;
+     }
+     description "TE administrative group derived type";
+   }
+
+   typedef srlg {
+     type uint32;
+     description "SRLG type";
+   }
+
+   identity path-computation-srlg-type {
+     description
+       "Base identity for SRLG path computation";
+   }
+
+   identity srlg-ignore {
+     base path-computation-srlg-type;
+     description
+       "Ignores SRLGs in path computation";
+   }
+
+   identity srlg-strict {
+     base path-computation-srlg-type;
+     description
+       "Include strict SRLG check in path computation";
+   }
+
+   identity srlg-preferred {
+     base path-computation-srlg-type;
+     description
+       "Include preferred SRLG check in path computation";
+   }
+
+   identity srlg-weighted {
+     base path-computation-srlg-type;
+     description
+       "Include weighted SRLG check in path computation";
+   }
+
+   typedef te-metric {
+     type uint32;
+     description
+       "TE link metric";
+   }
+
+   /**
+    * TE performance metric groupings
+    **/
+   grouping performance-metric-container {
+     description
+       "A container containing performance metric attributes.";
+     container performance-metric {
+       description
+         "Link performance information in real time.";
+       reference
+         "RFC7471: OSPF Traffic Engineering (TE) Metric Extensions.
+          RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.
+          RFC7823: Performance-Based Path Selection for Explicitly
+          Routed Label Switched Paths (LSPs) Using TE Metric
+          Extensions";
+       container measurement {
+         description
+           "Measured performance metric values. Static configuration
+            and manual overrides of these measurements are also
+            allowed.";
+         uses performance-metric-attributes;
+       }
+       container normality
+       {
+         description
+           "Performance metric normality values.";
+         uses performance-metric-normality-attributes;
+       }
+       uses performance-metric-throttle-container;
+     }
+   } // performance-metric-container
+
+   grouping performance-metric-attributes {
+     description
+       "Link performance information in real time.";
+     reference
+       "RFC7471: OSPF Traffic Engineering (TE) Metric Extensions.
+        RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.
+        RFC7823: Performance-Based Path Selection for Explicitly
+        Routed Label Switched Paths (LSPs) Using TE Metric
+        Extensions";
+     leaf unidirectional-delay {
+       type uint32 {
+         range 0..16777215;
+       }
+       description "Delay or latency in micro seconds.";
+     }
+     leaf unidirectional-min-delay {
+       type uint32 {
+         range 0..16777215;
+       }
+       description "Minimum delay or latency in micro seconds.";
+     }
+     leaf unidirectional-max-delay {
+       type uint32 {
+         range 0..16777215;
+       }
+       description "Maximum delay or latency in micro seconds.";
+     }
+     leaf unidirectional-delay-variation {
+       type uint32 {
+         range 0..16777215;
+       }
+       description "Delay variation in micro seconds.";
+     }
+     leaf unidirectional-packet-loss {
+       type decimal64 {
+         fraction-digits 6;
+         range "0 .. 50.331642";
+       }
+       description
+         "Packet loss as a percentage of the total traffic sent
+          over a configurable interval. The finest precision is
+          0.000003%.";
+     }
+     leaf unidirectional-residual-bandwidth {
+       type rt-types:bandwidth-ieee-float32;
+       description
+         "Residual bandwidth that subtracts tunnel
+          reservations from Maximum Bandwidth (or link capacity)
+          [RFC3630] and provides an aggregated remainder across QoS
+          classes.";
+     }
+     leaf unidirectional-available-bandwidth {
+       type rt-types:bandwidth-ieee-float32;
+       description
+         "Available bandwidth that is defined to be residual
+          bandwidth minus the measured bandwidth used for the
+          actual forwarding of non-RSVP-TE LSP packets.  For a
+          bundled link, available bandwidth is defined to be the
+          sum of the component link available bandwidths.";
+     }
+     leaf unidirectional-utilized-bandwidth {
+       type rt-types:bandwidth-ieee-float32;
+       description
+         "Bandwidth utilization that represents the actual
+          utilization of the link (i.e. as measured in the router).
+          For a bundled link, bandwidth utilization is defined to
+          be the sum of the component link bandwidth
+          utilizations.";
+     }
+   } // performance-metric-attributes
+
+   grouping performance-metric-normality-attributes {
+     description
+       "Link performance metric normality attributes.";
+     reference
+       "RFC7471: OSPF Traffic Engineering (TE) Metric Extensions.
+        RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.
+        RFC7823: Performance-Based Path Selection for Explicitly
+        Routed Label Switched Paths (LSPs) Using TE Metric
+        Extensions";
+     leaf unidirectional-delay {
+       type te-types:performance-metric-normality;
+       description "Delay normality.";
+     }
+     leaf unidirectional-min-delay {
+       type te-types:performance-metric-normality;
+       description "Minimum delay or latency normality.";
+     }
+     leaf unidirectional-max-delay {
+       type te-types:performance-metric-normality;
+       description "Maximum delay or latency normality.";
+     }
+     leaf unidirectional-delay-variation {
+       type te-types:performance-metric-normality;
+       description "Delay variation normality.";
+     }
+     leaf unidirectional-packet-loss {
+       type te-types:performance-metric-normality;
+       description "Packet loss normality.";
+     }
+     leaf unidirectional-residual-bandwidth {
+       type te-types:performance-metric-normality;
+       description "Residual bandwidth normality.";
+     }
+     leaf unidirectional-available-bandwidth {
+       type te-types:performance-metric-normality;
+       description "Available bandwidth normality.";
+     }
+     leaf unidirectional-utilized-bandwidth {
+       type te-types:performance-metric-normality;
+       description "Bandwidth utilization normality.";
+     }
+   } // performance-metric-normality-attributes
+
+   grouping performance-metric-throttle-container {
+     description
+       "A container controlling performance metric throttle.";
+     container throttle {
+       must "suppression-interval >= measure-interval" {
+         error-message
+           "suppression-interval cannot be less then
+            measure-interval.";
+         description
+           "Constraint on suppression-interval and
+            measure-interval.";
+       }
+       description
+         "Link performance information in real time.";
+       reference
+         "RFC7471: OSPF Traffic Engineering (TE) Metric Extensions.
+          RFC7810: IS-IS Traffic Engineering (TE) Metric Extensions.
+          RFC7823: Performance-Based Path Selection for Explicitly
+          Routed Label Switched Paths (LSPs) Using TE Metric
+          Extensions";
+       leaf unidirectional-delay-offset {
+         type uint32 {
+           range 0..16777215;
+         }
+         description
+           "Offset value to be added to the measured delay value.";
+       }
+       leaf measure-interval {
+         type uint32;
+         default 30;
+         description
+           "Interval in seconds to measure the extended metric
+            values.";
+       }
+       leaf advertisement-interval {
+         type uint32;
+         description
+           "Interval in seconds to advertise the extended metric
+            values.";
+       }
+       leaf suppression-interval {
+         type uint32 {
+           range "1 .. max";
+         }
+         default 120;
+         description
+           "Interval in seconds to suppress advertising the extended
+            metric values.";
+       }
+       container threshold-out {
+         uses performance-metric-attributes;
+         description
+           "If the measured parameter falls outside an upper bound
+            for all but the min delay metric (or lower bound for
+            min-delay metric only) and the advertised value is not
+            already outside that bound, anomalous announcement will be
+            triggered.";
+       }
+       container threshold-in {
+         uses performance-metric-attributes;
+         description
+           "If the measured parameter falls inside an upper bound
+            for all but the min delay metric (or lower bound for
+            min-delay metric only) and the advertised value is not
+            already inside that bound, normal (anomalous-flag cleared)
+            announcement will be triggered.";
+       }
+       container threshold-accelerated-advertisement {
+         description
+           "When the difference between the last advertised value and
+            current measured value exceed this threshold, anomalous
+            announcement will be triggered.";
+         uses performance-metric-attributes;
+       }
+     }
+   } // performance-metric-throttle-container
+
+   /**
+    * TE tunnel generic groupings
+    **/
+
+   /* Tunnel path selection parameters */
+   /*** End of TE tunnel groupings ***/
+
+   /**
+    * TE interface generic groupings
+    **/
+
+
+/**************************************************************/
+//TODO: FIXME: HENRY added begins
+  identity te-path-numerical-property {
+    description "Base TE path property type";
+  }
+  identity te-path-cost {
+    base te-path-numerical-property;
+    description "TE path property";
+  }
+  identity te-path-delay {
+    base te-path-numerical-property;
+    description "TE path property";
+  }
+  identity te-path-hop {
+    base te-path-numerical-property;
+    description "TE path property";
+  }
+  identity te-path-igp-metric {
+    base te-path-numerical-property;
+    description "TE path property";
+  }
+  identity te-path-metric {
+    base te-path-numerical-property;
+    description "TE path property";
+  }
+
+  typedef te-path-disjointness {
+    type bits {
+      bit node {
+        position 0;
+        description "Node disjoint.";
+      }
+      bit link {
+        position 1;
+        description "Link disjoint.";
+      }
+      bit srlg {
+        position 2;
+        description "SRLG (Shared Risk Link Group) disjoint.";
+      }
+    }
+    description
+      "Type of the resource disjointness for a TE tunnel path.";
+    reference
+      "RFC4872: RSVP-TE Extensions in Support of End-to-End
+       Generalized Multi-Protocol Label Switching (GMPLS)
+       Recovery";
+  } // te-path-disjointness
+
+  typedef te-bandwidth {
+    type string {
+      pattern
+        '0[xX](0((\.0?)?[pP](\+)?0?|(\.0?))|'
+      + '1(\.([\da-fA-F]{0,5}[02468aAcCeE]?)?)?[pP](\+)?(12[0-7]|'
+      + '1[01]\d|0?\d?\d)?)|0[xX][\da-fA-F]{1,8}|\d+'
+      + '(,(0[xX](0((\.0?)?[pP](\+)?0?|(\.0?))|'
+      + '1(\.([\da-fA-F]{0,5}[02468aAcCeE]?)?)?[pP](\+)?(12[0-7]|'
+      + '1[01]\d|0?\d?\d)?)|0[xX][\da-fA-F]{1,8}|\d+))*';
+    }
+    description
+      "This is the generic bandwidth type that is a string containing
+       a list of numbers separated by commas, with each of these
+       number can be non-negative decimal, hex integer, or hex float:
+       (dec | hex | float)[*(','(dec | hex | float))]
+       For packet switching type, a float number is used, such as
+       0x1p10.
+       For OTN switching type, a list of integers can be used, such
+       as '0,2,3,1', indicating 2 odu0's and 1 odu3.
+       For DWDM, a list of pairs of slot number and width can be
+       used, such as '0, 2, 3, 3', indicating a frequency slot 0 with
+       slot width 2 and a frequency slot 3 with slot width 3.";
+  } // te-bandwidth
+
+
+
+//TODO: FIXME: HENRY added finish
+/**************************************************************/
+
+ }
diff --git a/runtime/src/test/resources/schemaProviderTestYangFiles/actn-ietf-te@2017-03-10.yang b/runtime/src/test/resources/schemaProviderTestYangFiles/actn-ietf-te@2017-03-10.yang
new file mode 100755
index 0000000..d9127aa
--- /dev/null
+++ b/runtime/src/test/resources/schemaProviderTestYangFiles/actn-ietf-te@2017-03-10.yang
@@ -0,0 +1,2169 @@
+module actn-ietf-te {
+  yang-version 1.1;
+
+  namespace "urn:ietf:params:xml:ns:yang:actn-ietf-te";
+
+  /* Replace with IANA when assigned */
+  prefix "te";
+
+  /* Import TE generic types */
+  import actn-ietf-te-types {
+    prefix te-types;
+  }
+
+  import yrt-ietf-te-mpls-types {
+    prefix "te-mpls-types";
+  }
+
+  import yrt-ietf-inet-types {
+    prefix inet;
+  }
+
+  organization
+    "IETF Traffic Engineering Architecture and Signaling (TEAS)
+     Working Group";
+
+  contact
+    "WG Web:   <http://tools.ietf.org/wg/teas/>
+     WG List:  <mailto:teas@ietf.org>
+
+     WG Chair: Lou Berger
+               <mailto:lberger@labn.net>
+
+     WG Chair: Vishnu Pavan Beeram
+               <mailto:vbeeram@juniper.net>
+
+     Editor:   Tarek Saad
+               <mailto:tsaad@cisco.com>
+
+     Editor:   Rakesh Gandhi
+               <mailto:rgandhi@cisco.com>
+
+     Editor:   Vishnu Pavan Beeram
+               <mailto:vbeeram@juniper.net>
+
+     Editor:   Himanshu Shah
+               <mailto:hshah@ciena.com>
+
+     Editor:   Xufeng Liu
+               <mailto:Xufeng_Liu@jabil.com>
+
+     Editor:   Xia Chen
+               <mailto:jescia.chenxia@huawei.com>
+
+     Editor:   Raqib Jones
+               <mailto:raqib@Brocade.com>
+
+     Editor:   Bin Wen
+               <mailto:Bin_Wen@cable.comcast.com>";
+
+  description
+    "YANG data module for TE configuration,
+    state, RPC and notifications.";
+
+  revision "2017-03-10" {
+    description "Latest update to TE generic YANG module.";
+    reference "TBD";
+  }
+
+  typedef tunnel-ref {
+    type leafref {
+      path "/te:te/te:tunnels/te:tunnel/te:name";
+    }
+    description
+      "This type is used by data models that need to reference
+       configured TE tunnel.";
+  }
+
+  typedef tunnel-p2mp-ref {
+    type leafref {
+      path "/te:te/te:tunnels/te:tunnel-p2mp/te:name";
+    }
+    description
+      "This type is used by data models that need to reference
+       configured P2MP TE tunnel.";
+  }
+
+  /**
+   * TE tunnel generic groupings
+   */
+  grouping path-route-objects {
+    description
+      "List of EROs to be included or excluded when performing
+       the path computation.";
+    container explicit-route-objects {
+      description
+        "Container for the include or exclude route object list";
+      list explicit-route-object {
+        key index;
+        description
+          "List of explicit route objects to include or
+           exclude in path computation";
+        leaf index {
+          type leafref {
+            path "../config/index";
+          }
+          description
+            "Index of this explicit route object";
+        }
+        leaf explicit-route-usage {
+          type identityref {
+            base te-types:route-usage-type;
+          }
+          description "An explicit-route hop action.";
+        }
+        uses te-types:explicit-route-hop;
+      }
+    }
+  }
+
+  grouping path-affinities {
+    description
+      "Path affinities grouping";
+    container path-affinities {
+      description
+        "Path affinities container";
+      choice style {
+        description
+          "Path affinities representation style";
+        case values {
+          leaf value {
+            type uint32 {
+              range "0..4294967295";
+            }
+            description
+              "Affinity value";
+          }
+          leaf mask {
+            type uint32 {
+              range "0..4294967295";
+            }
+            description
+              "Affinity mask";
+          }
+        }
+        case named {
+          list constraints {
+            key "usage";
+            leaf usage {
+              type identityref {
+                base te-types:resource-affinities-type;
+              }
+              description "Affinities usage";
+            }
+            container constraint {
+              description
+                "Container for named affinities";
+              list affinity-names {
+                key "name";
+                leaf name {
+                  type string;
+                  description
+                    "Affinity name";
+                }
+                description
+                  "List of named affinities";
+              }
+            }
+            description
+              "List of named affinity constraints";
+          }
+        }
+      }
+    }
+  }
+
+  grouping path-srlgs {
+    description
+      "Path SRLG properties grouping";
+    container path-srlgs {
+      description
+        "Path SRLG properties container";
+      choice style {
+        description
+          "Type of SRLG representation";
+        case values {
+          leaf usage {
+            type identityref {
+              base te-types:route-exclude-srlg;
+            }
+            description "SRLG usage";
+          }
+          leaf-list values {
+            type te-types:srlg;
+            description "SRLG value";
+          }
+        }
+        case named {
+          list constraints {
+            key "usage";
+            leaf usage {
+              type identityref {
+                base te-types:route-exclude-srlg;
+              }
+              description "SRLG usage";
+            }
+            container constraint {
+              description
+                "Container for named SRLG list";
+              list srlg-names {
+                key "name";
+                leaf name {
+                  type string;
+                  description
+                    "The SRLG name";
+                }
+                description
+                  "List named SRLGs";
+              }
+            }
+            description
+              "List of named SRLG constraints";
+          }
+        }
+      }
+    }
+  }
+
+  grouping bidir-assoc-properties {
+    description
+      "TE tunnel associated bidirectional properties
+      grouping";
+    container bidirectional {
+      description
+        "TE tunnel associated bidirectional attributes.";
+      container association {
+        description
+          "Tunnel bidirectional association properties";
+        leaf id {
+          type uint16;
+          description
+            "The TE tunnel association identifier.";
+        }
+        leaf source {
+          type inet:ip-address;
+          description
+            "The TE tunnel association source.";
+        }
+        leaf global-source {
+          type inet:ip-address;
+          description
+            "The TE tunnel association global
+            source.";
+        }
+        leaf type {
+          type identityref {
+            base te-types:bidir-association-type;
+          }
+          default te-types:bidir-assoc-non-corouted;
+          description
+            "The TE tunnel association type.";
+        }
+        leaf provisioing {
+          type identityref {
+            base te-types:bidir-provisioning-mode;
+          }
+          description
+            "Describes the provisioning model of the
+            associated bidirectional LSP";
+          reference
+            "draft-ietf-teas-mpls-tp-rsvpte-ext-
+            associated-lsp, section-3.2";
+        }
+      }
+    }
+  }
+
+  grouping p2p-secondary-path-properties {
+    description
+      "tunnel path properties.";
+    container config {
+      description
+        "Configuration parameters relating to
+        tunnel properties";
+      uses p2p-path-properties_config;
+    }
+    container state {
+      config false;
+      description
+        "State information associated with tunnel
+        properties";
+      uses p2p-path-properties_config;
+      uses p2p-secondary-path-properties_state;
+    }
+  }
+
+  grouping p2p-primary-path-properties {
+    description
+      "TE tunnel primary path properties grouping";
+    container config {
+      description
+        "Configuration parameters relating to
+        tunnel properties";
+      uses p2p-path-properties_config;
+    }
+    container state {
+      config false;
+      description
+        "State information associated with tunnel
+        properties";
+      uses p2p-path-properties_config;
+      uses p2p-primary-path-properties_state;
+    }
+  }
+
+  grouping p2p-primary-path-properties_state {
+    description "TE path state parameters";
+    container lsps {
+      description "TE LSPs container";
+      list lsp {
+        key
+          "source destination tunnel-id lsp-id "+
+          "extended-tunnel-id type";
+        description "List of LSPs associated with the tunnel.";
+
+        leaf source {
+          type leafref {
+            path "../../../../../../../../lsps-state/lsp/source";
+          }
+          description
+            "Tunnel sender address extracted from
+            SENDER_TEMPLATE  object";
+          reference "RFC3209";
+        }
+        leaf destination {
+          type leafref {
+            path "../../../../../../../../lsps-state/lsp/destination";
+          }
+          description
+            "Tunnel endpoint address extracted from
+            SESSION object";
+          reference "RFC3209";
+        }
+        leaf tunnel-id {
+          type leafref {
+            path "../../../../../../../../lsps-state/lsp/tunnel-id";
+          }
+          description
+            "Tunnel identifier used in the SESSION
+            that remains constant over the life
+            of the tunnel.";
+          reference "RFC3209";
+        }
+        leaf lsp-id {
+          type leafref {
+            path "../../../../../../../../lsps-state/lsp/lsp-id";
+          }
+          description
+            "Identifier used in the SENDER_TEMPLATE
+            and the FILTER_SPEC that can be changed
+            to allow a sender to share resources with
+            itself.";
+          reference "RFC3209";
+        }
+        leaf extended-tunnel-id {
+          type leafref {
+            path "../../../../../../../../lsps-state/lsp/" +
+                 "extended-tunnel-id";
+          }
+          description
+            "Extended Tunnel ID of the LSP.";
+          reference "RFC3209";
+        }
+        leaf type {
+          type leafref {
+            path "../../../../../../../../lsps-state/lsp/type";
+          }
+          description "LSP type P2P or P2MP";
+        }
+        leaf signaling-type {
+          type identityref {
+            base te-types:path-signaling-type;
+          }
+          description "TE tunnel path signaling type";
+        }
+      }
+    }
+  }
+
+  grouping p2p-secondary-path-properties_state {
+    description "TE secondary path state parameters";
+    list lsp {
+      key "source";
+      description "List of LSPs associated with the tunnel.";
+
+      leaf source {
+        type leafref {
+          path "../../../../../../../../lsps-state/lsp/source";
+        }
+        description
+          "Tunnel sender address extracted from
+          SENDER_TEMPLATE  object";
+        reference "RFC3209";
+      }
+      leaf destination {
+        type leafref {
+          path "../../../../../../../../lsps-state/lsp/destination";
+        }
+        description
+          "Tunnel endpoint address extracted from
+          SESSION object";
+        reference "RFC3209";
+      }
+      leaf tunnel-id {
+        type leafref {
+          path "../../../../../../../../lsps-state/lsp/tunnel-id";
+        }
+        description
+          "Tunnel identifier used in the SESSION
+          that remains constant over the life
+          of the tunnel.";
+        reference "RFC3209";
+      }
+      leaf lsp-id {
+        type leafref {
+          path "../../../../../../../../lsps-state/lsp/lsp-id";
+        }
+        description
+          "Identifier used in the SENDER_TEMPLATE
+          and the FILTER_SPEC that can be changed
+          to allow a sender to share resources with
+          itself.";
+        reference "RFC3209";
+      }
+      leaf extended-tunnel-id {
+        type leafref {
+          path "../../../../../../../../lsps-state/lsp" +
+               "/extended-tunnel-id";
+        }
+        description
+          "Extended Tunnel ID of the LSP.";
+        reference "RFC3209";
+      }
+      leaf type {
+        type leafref {
+          path "../../../../../../../../lsps-state/lsp/type";
+        }
+        description "LSP type P2P or P2MP";
+      }
+      leaf active {
+        type boolean;
+        description
+          "Indicates the current active path option that has
+          been selected of the candidate secondary paths";
+      }
+    }
+  }
+
+  grouping p2p-path-properties_config {
+    description
+      "TE tunnel path properties configuration grouping";
+    leaf name {
+      type string;
+      description "TE path name";
+    }
+    leaf preference {
+      type uint8 {
+        range "1..255";
+      }
+      description
+        "Specifies a preference for this path. The lower the
+        number higher the preference";
+    }
+    leaf path-setup-protocol {
+      type identityref {
+        base te-types:te-path-setup-protocol;
+      }
+      description
+        "Signaling protocol used to set up this tunnel";
+    }
+    leaf path-computation-method {
+      type identityref {
+        base te-types:path-computation-method;
+      }
+      default te-types:path-locally-computed;
+      description
+        "The method used for computing the path, either
+        locally computed, queried from a server or not
+        computed at all (explicitly configured).";
+    }
+    leaf path-computation-server {
+      when "../path-computation-method = 'path-externally-queried'" {
+        description
+          "The path-computation server when the path is
+           externally queried";
+      }
+      type inet:ip-address;
+      description
+        "Address of the external path computation
+         server";
+    }
+    leaf compute-only {
+      type empty;
+      description
+        "When set, the path is computed and updated whenever
+         the topology is updated. No resources are committed
+         or reserved in the network.";
+    }
+    leaf use-cspf {
+      when "../path-computation-method = 'path-locally-computed'";
+      type boolean;
+      description "A CSPF dynamically computed path";
+    }
+    leaf verbatim {
+      type empty;
+      description
+        "Indicates no topology or CSPF is attempted on the
+         specified path.";
+    }
+    leaf lockdown {
+      type empty;
+      description
+        "Indicates no reoptimization to be attempted for
+         this path.";
+    }
+    //TODO: added te-default-metric, te-delay-metric, te-srlgs, te-nsrlgs
+    leaf te-default-metric {
+      type uint32;
+      description
+        "Traffic engineering metric.";
+    }
+    leaf te-delay-metric {
+      type uint32;
+      description
+        "Traffic engineering delay metric.";
+    }
+    leaf te-hop-metric {
+      type uint32;
+      description
+        "Traffic engineering hop metric.";
+    }
+    container te-srlgs {
+      description
+        "Containing a list of SLRGs.";
+      leaf-list value {
+        type te-types:srlg;
+        description "SRLG value.";
+        reference
+          "RFC4202: Routing Extensions in Support of
+           Generalized Multi-Protocol Label Switching (GMPLS).";
+      }
+    }
+    container te-nsrlgs {
+      if-feature nsrlg;
+      description
+        "Containing a list of NSRLGs (Not Sharing Risk Link
+         Groups).
+         When an abstract TE link is configured, this list specifies
+         the request that underlay TE paths need to be mutually
+         disjoint with other TE links in the same groups.";
+      leaf-list id {
+        type uint32;
+        description
+          "NSRLG ID, uniquely configured within a topology.";
+        reference
+          "RFC4872: RSVP-TE Extensions in Support of End-to-End
+           Generalized Multi-Protocol Label Switching (GMPLS)
+           Recovery";
+      }
+    }
+    leaf named-explicit-path {
+      when "../path-computation-method = 'path-explicitly-defined'";
+      type leafref {
+        path "../../../../../../globals/named-explicit-paths/"
+        + "named-explicit-path/config/name";
+      }
+      description "The explicit-path name";
+    }
+    leaf named-path-constraint {
+      if-feature te-types:named-path-constraints;
+      type leafref {
+        path "../../../../../../globals/"
+        + "named-path-constraints/named-path-constraint/"
+        + "config/name";
+      }
+      description
+        "Reference to a globally defined named path
+        constraint set";
+    }
+  }
+
+  /* TE tunnel configuration data */
+  grouping tunnel-p2mp-params_config {
+    description
+      "Configuration parameters relating to TE tunnel";
+    leaf name {
+      type string;
+      description "TE tunnel name.";
+    }
+    leaf type {
+      type identityref {
+        base te-types:tunnel-type;
+      }
+      description "TE tunnel type.";
+    }
+    leaf identifier {
+      type uint16;
+      description
+        "TE tunnel Identifier.";
+    }
+    leaf description {
+      type string;
+      description
+        "Textual description for this TE tunnel";
+    }
+    leaf setup-priority {
+      type uint8 {
+        range "0..7";
+      }
+      description
+        "TE LSP setup priority";
+    }
+    leaf hold-priority {
+      type uint8 {
+        range "0..7";
+      }
+      description
+        "TE LSP hold priority";
+    }
+    leaf lsp-protection-type {
+      type identityref {
+        base te-types:lsp-prot-type;
+      }
+      description "LSP protection type.";
+    }
+    leaf admin-status {
+      type identityref {
+        base te-types:state-type;
+      }
+      default te-types:state-up;
+      description "TE tunnel administrative state.";
+    }
+    leaf reoptimize-timer {
+      type uint16;
+      units seconds;
+      description
+       "frequency of reoptimization of
+        a traffic engineered LSP";
+    }
+  }
+
+  grouping te-tunnel-bandwidth_config {
+    description
+      "Configuration parameters related to bandwidth for a tunnel";
+
+    leaf specification-type {
+      type te-mpls-types:te-bandwidth-type;
+      default SPECIFIED;
+      description
+        "The method used for settign the bandwidth, either explicitly
+        specified or configured";
+    }
+
+    leaf set-bandwidth {
+      when "../specification-type = 'te-mpls-types:SPECIFIED'" {
+       description
+         "The bandwidth value when bandwidth is explicitly
+          specified";
+      }
+      type te-mpls-types:bandwidth-kbps;
+      description
+       "set bandwidth explicitly, e.g., using
+        offline calculation";
+    }
+    leaf class-type {
+      type te-types:te-ds-class;
+      description
+        "The Class-Type of traffic transported by the LSP.";
+      reference "RFC4124: section-4.3.1";
+    }
+  }
+
+  grouping te-tunnel-bandwidth_state {
+    description
+      "Operational state parameters relating to bandwidth for a tunnel";
+
+    leaf signaled-bandwidth {
+      type te-mpls-types:bandwidth-kbps;
+      description
+        "The currently signaled bandwidth of the LSP. In the case where
+        the bandwidth is specified explicitly, then this will match the
+        value of the set-bandwidth leaf; in cases where the bandwidth is
+        dynamically computed by the system, the current value of the
+        bandwidth should be reflected.";
+    }
+  }
+
+  grouping te-lsp-auto-bandwidth_config {
+    description
+      "Configuration parameters related to autobandwidth";
+
+    leaf enabled {
+      type boolean;
+      default false;
+      description
+        "enables mpls auto-bandwidth on the
+         lsp";
+    }
+
+    leaf min-bw {
+      type te-mpls-types:bandwidth-kbps;
+      description
+        "set the minimum bandwidth in Kbps for an
+         auto-bandwidth LSP";
+    }
+
+    leaf max-bw {
+      type te-mpls-types:bandwidth-kbps;
+      description
+        "set the maximum bandwidth in Kbps for an
+         auto-bandwidth LSP";
+    }
+
+    leaf adjust-interval {
+      type uint32;
+      description
+        "time in seconds between adjustments to
+         LSP bandwidth";
+    }
+
+    leaf adjust-threshold {
+      type te-types:percentage;
+      description
+        "percentage difference between the LSP's
+         specified bandwidth and its current bandwidth
+         allocation -- if the difference is greater than the
+         specified percentage, auto-bandwidth adjustment is
+         triggered";
+    }
+  }
+
+  grouping te-lsp-overflow_config {
+    description
+     "configuration for mpls lsp bandwidth
+      overflow adjustment";
+
+    leaf enabled {
+      type boolean;
+      default false;
+      description
+       "enables mpls lsp bandwidth overflow
+        adjustment on the lsp";
+    }
+
+    leaf overflow-threshold {
+      type te-types:percentage;
+      description
+       "bandwidth percentage change to trigger
+        an overflow event";
+
+    }
+
+    leaf trigger-event-count {
+      type uint16;
+      description
+       "number of consecutive overflow sample
+        events needed to trigger an overflow adjustment";
+    }
+  }
+
+  grouping te-lsp-underflow_config {
+    description
+      "configuration for mpls lsp bandwidth
+      underflow adjustment";
+
+    leaf enabled {
+      type boolean;
+      default false;
+      description
+       "enables bandwidth underflow
+        adjustment on the lsp";
+    }
+
+    leaf underflow-threshold {
+      type te-types:percentage;
+      description
+       "bandwidth percentage change to trigger
+        and underflow event";
+    }
+
+    leaf trigger-event-count {
+      type uint16;
+      description
+       "number of consecutive underflow sample
+        events needed to trigger an underflow adjustment";
+    }
+  }
+
+  grouping te-path-bandwidth_top {
+    description
+      "Top level grouping for specifying bandwidth for a TE path";
+
+    container bandwidth {
+      description
+        "Bandwidth configuration for TE LSPs";
+
+      container config {
+        description
+          "Configuration parameters related to bandwidth on TE
+          tunnels:";
+        uses te-tunnel-bandwidth_config;
+      }
+
+      container state {
+        config false;
+        description
+          "State parameters related to bandwidth
+          configuration of TE tunnels";
+        uses te-tunnel-bandwidth_config;
+        uses te-tunnel-bandwidth_state;
+      }
+    }
+  }
+
+  grouping te-tunnel-bandwidth_top {
+    description
+      "Top level grouping for specifying bandwidth for a tunnel";
+
+    container bandwidth {
+      description
+        "Bandwidth configuration for TE LSPs";
+
+      container config {
+        description
+          "Configuration parameters related to bandwidth on TE
+          tunnels:";
+        uses te-tunnel-bandwidth_config;
+      }
+
+      container state {
+        config false;
+        description
+          "State parameters related to bandwidth
+          configuration of TE tunnels";
+        uses te-tunnel-bandwidth_config;
+        uses te-tunnel-bandwidth_state;
+      }
+
+      container auto-bandwidth {
+        when "../config/specification-type = 'AUTO'" {
+          description
+            "Include this container for auto bandwidth
+            specific configuration";
+        }
+        description
+          "Parameters related to auto-bandwidth";
+
+        container config {
+          description
+            "Configuration parameters relating to MPLS
+            auto-bandwidth on the tunnel.";
+          uses te-lsp-auto-bandwidth_config;
+        }
+        container state {
+          config false;
+          description
+            "State parameters relating to MPLS
+            auto-bandwidth on the tunnel.";
+          uses te-lsp-auto-bandwidth_config;
+        }
+
+        container overflow {
+          description
+            "configuration of MPLS overflow bandwidth
+            adjustement for the LSP";
+
+          container config {
+            description
+              "Config information for MPLS overflow bandwidth
+              adjustment";
+            uses te-lsp-overflow_config;
+          }
+
+          container state {
+            config false;
+            description
+              "Config information for MPLS overflow bandwidth
+              adjustment";
+            uses te-lsp-overflow_config;
+          }
+        }
+
+        container underflow {
+          description
+            "configuration of MPLS underflow bandwidth
+            adjustement for the LSP";
+
+          container config {
+            description
+              "Config information for MPLS underflow bandwidth
+              adjustment";
+            uses te-lsp-underflow_config;
+          }
+
+          container state {
+            config false;
+            description
+              "State information for MPLS underflo
+              adjustment";
+            uses te-lsp-underflow_config;
+          }
+        }
+      }
+    }
+  }
+
+  grouping tunnel-p2p-params_config {
+    description
+      "Configuration parameters relating to TE tunnel";
+    leaf name {
+      type string;
+      description "TE tunnel name.";
+    }
+    leaf type {
+      type identityref {
+        base te-types:tunnel-type;
+      }
+      description "TE tunnel type.";
+    }
+    leaf identifier {
+      type uint16;
+      description
+        "TE tunnel Identifier.";
+    }
+    leaf description {
+      type string;
+      description
+        "Textual description for this TE tunnel";
+    }
+    leaf switching-layer {
+      type identityref {
+        base te-types:switching-capabilities;
+      }
+      description
+        "Switching layer of this TE tunnel";
+    }
+    leaf encoding {
+      type identityref {
+        base te-types:lsp-encoding-types;
+      }
+      description "LSP encoding type";
+    }
+    leaf protection-type {
+      type identityref {
+        base te-types:lsp-prot-type;
+      }
+      description "LSP protection type.";
+    }
+    leaf admin-status {
+      type identityref {
+        base te-types:state-type;
+      }
+      default te-types:state-up;
+      description "TE tunnel administrative state.";
+    }
+    leaf preference {
+      type uint8 {
+        range "1..255";
+      }
+      description
+        "Specifies a preference for this tunnel.
+        A lower number signifies a better preference";
+    }
+    leaf reoptimize-timer {
+      type uint16;
+      units seconds;
+      description
+       "frequency of reoptimization of
+        a traffic engineered LSP";
+    }
+    /*****************************************************/
+            //TODO: HENRY added begin
+           leaf provider-id {
+             type te-types:te-global-id;
+             description
+               "An identifier to uniquely identify a provider.";
+           }
+           leaf client-id {
+             type te-types:te-global-id;
+             description
+               "An identifier to uniquely identify a client.";
+           }
+           leaf te-topology-id {
+             type te-types:te-topology-id;
+             description
+               "It is presumed that a datastore will contain many
+                topologies. To distinguish between topologies it is
+                vital to have UNIQUE topology identifiers.";
+           }
+
+            //TODO: HENRY added end
+            /*****************************************************/
+
+    leaf source {
+      type inet:ip-address;
+      description
+        "TE tunnel source address.";
+    }
+    leaf destination {
+      /* Add when check */
+      type inet:ip-address;
+      description
+        "P2P tunnel destination address";
+    }
+    leaf src-tp-id {
+      type binary;
+      description
+        "TE tunnel source termination point identifier.";
+    }
+    leaf dst-tp-id {
+      /* Add when check */
+      type binary;
+      description
+        "TE tunnel destination termination point identifier.";
+    }
+    leaf setup-priority {
+      type uint8 {
+        range "0..7";
+      }
+      description
+        "TE LSP setup priority";
+    }
+    leaf hold-priority {
+      type uint8 {
+        range "0..7";
+      }
+      description
+        "TE LSP hold priority";
+    }
+    leaf signaling-type {
+      type identityref {
+    	//TODO: FIXME
+        //base te-types:path-signaling-type;
+        base te-types:tunnel-type;
+    	  
+      }
+      description "TE tunnel path signaling type";
+    }
+    container hierarchical-link-id {
+        description
+          "Identifies a hierarchical link (in server layer)
+           that this tunnel is associated with.";
+        leaf local-te-node-id {
+          type te-types:te-node-id;
+          description
+            "Local TE node identifier";
+        }
+        leaf local-te-link-tp-id {
+          type te-types:te-tp-id;
+          description
+            "Local TE link termination point identifier";
+        }
+        leaf remote-te-node-id {
+          type te-types:te-node-id;
+          description
+            "Remote TE node identifier";
+        }
+        leaf te-topology-id {
+          type te-types:te-topology-id;
+          description
+            "It is presumed that a datastore will contain many
+             topologies. To distinguish between topologies it is
+             vital to have UNIQUE topology identifiers.";
+        }
+    }
+    uses bidir-assoc-properties;
+  }
+
+  grouping tunnel-p2p-params_state {
+    description
+      "State parameters relating to TE tunnel";
+    leaf oper-status {
+      type identityref {
+        base te-types:state-type;
+      }
+      description "TE tunnel operational state.";
+    }
+    leaf prov-state {
+      type identityref {
+        base te-types:prov-state-type;
+      }
+      description "TE tunnel provisioning state.";
+    }
+  }
+
+  /* TE tunnel configuration/state grouping */
+  grouping tunnel-p2mp-properties {
+    description
+      "Top level grouping for P2MP tunnel properties.";
+    container config {
+      description
+        "Configuration parameters relating to
+         tunnel P2MP properties";
+      uses tunnel-p2mp-params_config;
+    }
+
+    container state {
+      config false;
+      description
+        "State information associated with tunnel
+         properties";
+      uses tunnel-p2mp-params_config;
+    }
+  }
+
+  grouping p2p-path-candidate-secondary-path-config {
+    description
+      "Configuration parameters relating to a secondary path which
+      is a candidate for a particular primary path";
+
+    leaf secondary-path {
+      type leafref {
+        path "../../../../../../p2p-secondary-paths/" +
+             "p2p-secondary-path/config/name";
+      }
+      description
+        "A reference to the secondary path that should be utilised
+        when the containing primary path option is in use";
+    }
+
+    leaf priority {
+      type uint16;
+      description
+        "The priority of the specified secondary path option. Higher
+        priority options are less preferable - such that a secondary
+        path reference with a priority of 0 is the most preferred";
+    }
+    leaf path-setup-protocol {
+      type identityref {
+        base te-types:te-path-setup-protocol;
+      }
+      description
+        "Signaling protocol used to set up this tunnel";
+    }
+  }
+
+  grouping p2p-path-candidate-secondary-path-state {
+    description
+      "Operational state parameters relating to a secondary path
+      which is a candidate for a particular primary path";
+
+    leaf active {
+      type boolean;
+      description
+        "Indicates the current active path option that has
+        been selected of the candidate secondary paths";
+    }
+  }
+
+  grouping tunnel-p2p-properties {
+    description
+      "Top level grouping for tunnel properties.";
+    container config {
+      description
+        "Configuration parameters relating to
+         tunnel properties";
+      uses tunnel-p2p-params_config;
+    }
+    container state {
+      config false;
+      description
+        "State information associated with tunnel
+         properties";
+      uses tunnel-p2p-params_config;
+      uses tunnel-p2p-params_state;
+    }
+                uses te-tunnel-bandwidth_top;
+
+    container p2p-primary-paths {
+      description "Set of P2P primary aths container";
+      list p2p-primary-path {
+        key "name";
+        description
+          "List of primary paths for this tunnel.";
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description "TE path name";
+        }
+        uses p2p-primary-path-properties;
+        container candidate-p2p-secondary-paths {
+          description
+            "The set of candidate secondary paths which may be used
+            for this primary path. When secondary paths are specified
+            in the list the path of the secondary LSP in use must be
+            restricted to those path options referenced. The
+            priority of the secondary paths is specified within the
+            list. Higher priority values are less preferred - that is
+            to say that a path with priority 0 is the most preferred
+            path. In the case that the list is empty, any secondary
+            path option may be utilised when the current primary path
+            is in use.";
+          list candidate-p2p-secondary-path {
+            key "secondary-path";
+            description
+              "List of secondary paths for this tunnel.";
+            leaf secondary-path {
+              type leafref {
+                path "../config/secondary-path";
+              }
+              description "TE path name";
+            }
+            container config {
+              description
+                "Configuration parameters relating to the candidate
+                secondary path";
+
+              uses p2p-path-candidate-secondary-path-config;
+            }
+
+            container state {
+              config false;
+              description
+                "Operational state parameters relating to the candidate
+                secondary path";
+
+              uses p2p-path-candidate-secondary-path-config;
+              uses p2p-path-candidate-secondary-path-state;
+            }
+          }
+        }
+      }
+    }
+    container p2p-secondary-paths {
+      description "Set of P2P secondary paths container";
+      list p2p-secondary-path {
+        key "name";
+        description
+          "List of secondary paths for this tunnel.";
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description "TE path name";
+        }
+        uses p2p-primary-path-properties;
+      }
+    }
+  }
+
+  grouping tunnel-actions {
+    description "Tunnel actions";
+/***TODO: FIXME: actions are not supported by yangtools yet
+    action tunnel-action {
+      description "Tunnel action";
+      input {
+        leaf action-type {
+          type identityref {
+            base te-types:tunnel-action-type;
+          }
+          description "Tunnel action type";
+        }
+      }
+      output {
+        leaf action-result {
+          type identityref {
+            base te-types:te-action-result;
+          }
+          description "The result of the RPC operation";
+        }
+      }
+    }
+****TODO: FIXME****/
+  }
+  /*** End of TE tunnel groupings ***/
+
+  /**
+   * LSP related generic groupings
+   */
+  grouping lsp-record-route-information_state {
+    description "recorded route information grouping";
+    container lsp-record-route-subobjects {
+      description "RSVP recorded route object information";
+      list record-route-subobject {
+        when "../../origin-type = 'ingress'" {
+          description "Applicable on non-ingress LSPs only";
+        }
+        key "index";
+        description "Record route sub-object list";
+        leaf index {
+          type uint32;
+          description "RRO subobject index";
+        }
+        uses te-types:record-route-subobject;
+      }
+    }
+  }
+
+  grouping lsp-properties_state {
+    description
+      "State parameters relating to LSP";
+    leaf oper-status {
+      type identityref {
+        base te-types:state-type;
+      }
+      description "LSP operational state.";
+    }
+    leaf path-setup-protocol {
+      type identityref {
+        base te-types:te-path-setup-protocol;
+      }
+      description
+        "Signaling protocol used to set up this tunnel";
+    }
+    leaf origin-type {
+      type enumeration {
+        enum ingress {
+          description
+            "Origin ingress";
+        }
+        enum egress {
+          description
+            "Origin egress";
+        }
+        enum transit {
+          description
+            "transit";
+        }
+      }
+      description
+        "Origin type of LSP relative to the location
+        of the local switch in the path.";
+    }
+
+    leaf lsp-resource-status {
+      type enumeration {
+        enum primary {
+          description
+            "A primary LSP is a fully established LSP for
+             which the resource allocation has been committed
+             at the data plane";
+        }
+        enum secondary {
+          description
+            "A secondary LSP is an LSP that has been provisioned
+             in the control plane only; e.g. resource allocation
+             has not been committed at the data plane";
+        }
+      }
+      description "LSP resource allocation type";
+      reference "rfc4872, section 4.2.1";
+    }
+
+    leaf lsp-protection-role {
+      type enumeration {
+        enum working {
+          description
+            "A working LSP must be a primary LSP whilst a protecting
+             LSP can be either a primary or a secondary LSP. Also,
+             known as protected LSPs when working LSPs are associated
+             with protecting LSPs.";
+        }
+        enum protecting {
+          description
+            "A secondary LSP is an LSP that has been provisioned
+             in the control plane only; e.g. resource allocation
+             has not been committed at the data plane";
+        }
+      }
+      description "LSP role type";
+      reference "rfc4872, section 4.2.1";
+    }
+
+    leaf lsp-carry-normal-traffic {
+      type empty;
+      description
+        "This bit is set when a protecting LSP is carrying the normal
+         traffic after protection switching";
+    }
+  }
+  /*** End of TE LSP groupings ***/
+
+  /**
+   * TE global generic groupings
+   */
+
+  /* Global named admin-groups configuration data */
+  grouping named-admin-groups_config {
+    description
+      "Global named administrative groups configuration
+      grouping";
+    leaf name {
+      type string;
+      description
+        "A string name that uniquely identifies a TE
+        interface named admin-group";
+    }
+    leaf bit-position {
+      type uint32;
+      description
+        "Bit position representing the administrative group";
+    }
+  }
+  grouping named-admin-groups {
+    description
+      "Global named administrative groups configuration
+      grouping";
+    container named-admin-groups {
+      description "TE named admin groups container";
+      list named-admin-group {
+        if-feature te-types:extended-admin-groups;
+        if-feature te-types:named-extended-admin-groups;
+        key "name";
+        description
+          "List of named TE admin-groups";
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description "Admin-group name";
+        }
+        container config {
+          description
+            "Configuration parameters related to admin-groups";
+          uses named-admin-groups_config;
+        }
+        container state {
+          config false;
+          description
+            "State parameters related to admin-groups";
+          uses named-admin-groups_config;
+        }
+      }
+    }
+  }
+
+  /* Global named admin-srlgs configuration data */
+  grouping named-srlgs_config {
+    description
+      "Global named SRLGs configuration grouping";
+    leaf name {
+      type string;
+      description
+        "A string name that uniquely identifies a TE
+        interface named srlg";
+    }
+    leaf group {
+      type te-types:srlg;
+      description "An SRLG value";
+    }
+    leaf cost {
+      type uint32;
+      description
+        "SRLG associated cost. Used during path to append
+         the path cost when traversing a link with this SRLG";
+    }
+  }
+
+  grouping named-srlgs {
+    description
+      "Global named SRLGs configuration grouping";
+    container named-srlgs {
+      description "TE named SRLGs container";
+      list named-srlg {
+        if-feature te-types:named-srlg-groups;
+        key "name";
+        description
+          "A list of named SRLG groups";
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description "SRLG name";
+        }
+        container config {
+          description
+            "Configuration parameters related to named SRLGs";
+          uses named-srlgs_config;
+        }
+        container state {
+          config false;
+          description
+            "State parameters related to named SRLGs";
+          uses named-srlgs_config;
+        }
+      }
+    }
+  }
+
+  /* Global named explicit-paths configuration data */
+  grouping named-explicit-paths_config {
+    description
+      "Global explicit path configuration
+      grouping";
+    leaf name {
+      type string;
+      description
+        "A string name that uniquely identifies an
+        explicit path";
+    }
+    container explicit-route-objects {
+      description "Explicit route objects container";
+      list explicit-route-object {
+        key "index";
+        description
+          "List of explicit route objects";
+        leaf index {
+          type leafref {
+            path "../config/index";
+          }
+          description
+            "Index of this explicit route object";
+        }
+        leaf explicit-route-usage {
+          type identityref {
+            base te-types:route-usage-type;
+          }
+          description "An explicit-route hop action.";
+        }
+        uses te-types:explicit-route-hop;
+      }
+    }
+  }
+
+  grouping named-explicit-paths {
+    description
+      "Global explicit path configuration
+      grouping";
+    container named-explicit-paths {
+      description "TE named explicit path container";
+      list named-explicit-path {
+        key "name";
+        description
+          "A list of explicit paths";
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description "Explicit-path name";
+        }
+
+        container config {
+          description
+            "Configuration parameters related to named paths";
+          uses named-explicit-paths_config;
+        }
+        container state {
+          config false;
+          description
+            "State parameters related to named paths";
+          uses named-explicit-paths_config;
+        }
+      }
+    }
+  }
+
+  /* Global named paths constraints configuration data */
+  grouping named-path-constraints_config {
+    description
+      "Global named path constraints configuration
+      grouping";
+    leaf name {
+      type string;
+      description
+        "A string name that uniquely identifies a
+        path constraint set";
+    }
+    leaf topology-id {
+      type te-types:te-topology-id;
+      description
+        "The tunnel path is computed using the specific
+        topology identified by this identifier";
+    }
+    leaf cost-limit {
+      type uint32 {
+        range "1..4294967295";
+      }
+      description
+        "The tunnel path cost limit.";
+    }
+    leaf hop-limit {
+      type uint8 {
+        range "1..255";
+      }
+      description
+        "The tunnel path hop limit.";
+    }
+    leaf metric-type {
+      type identityref {
+        base te-types:path-metric-type;
+      }
+      default te-types:path-metric-te;
+      description
+        "The tunnel path metric type.";
+    }
+    leaf tiebreaker-type {
+      type identityref {
+        base te-types:path-tiebreaker-type;
+      }
+      default te-types:path-tiebreaker-maxfill;
+      description
+        "The tunnel path computation tie breakers.";
+    }
+    leaf ignore-overload {
+      type boolean;
+      description
+        "The tunnel path can traverse overloaded node.";
+    }
+    leaf setup-priority {
+      type uint8 {
+        range "0..7";
+      }
+      description
+        "TE LSP setup priority";
+    }
+    leaf hold-priority {
+      type uint8 {
+        range "0..7";
+      }
+      description
+        "TE LSP hold priority";
+    }
+    uses path-affinities;
+    uses path-srlgs;
+    uses path-route-objects;
+    uses te-path-bandwidth_top;
+  }
+
+  grouping named-path-constraints {
+    description
+      "Global named path constraints configuration
+      grouping";
+    container named-path-constraints {
+      description "TE named path constraints container";
+      list named-path-constraint {
+        if-feature te-types:named-path-constraints;
+        key "name";
+        description
+          "A list of named path constraints";
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description "Path constraint name";
+        }
+        container config {
+          description
+            "Configuration parameters related to admin-groups";
+          uses named-path-constraints_config;
+        }
+        container state {
+          config false;
+          description
+            "State parameters related to admin-groups";
+          uses named-path-constraints_config;
+        }
+      }
+    }
+  }
+
+  /* TE globals container data */
+  grouping globals-grouping {
+    description
+      "Globals TE system-wide configuration data grouping";
+    container globals {
+      description
+        "Globals TE system-wide configuration data container";
+      uses named-admin-groups;
+      uses named-srlgs;
+      uses named-explicit-paths;
+      uses named-path-constraints;
+    }
+  }
+
+  /* TE tunnels container data */
+  grouping tunnels-grouping {
+    description
+      "Tunnels TE configuration data grouping";
+    container tunnels {
+      description
+        "Tunnels TE configuration data container";
+
+      list tunnel {
+        key "name";
+        unique "identifier";
+        description "P2P TE tunnels list.";
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description "TE tunnel name.";
+        }
+        leaf identifier {
+          type leafref {
+            path "../config/identifier";
+          }
+          description
+            "TE tunnel Identifier.";
+        }
+
+
+        uses tunnel-p2p-properties;
+        uses tunnel-actions;
+      }
+      list tunnel-p2mp {
+        key "name";
+        unique "identifier";
+        description "P2MP TE tunnels list.";
+        leaf name {
+          type leafref {
+            path "../config/name";
+          }
+          description "TE tunnel name.";
+        }
+        leaf identifier {
+          type leafref {
+            path "../config/identifier";
+          }
+          description
+            "TE tunnel Identifier.";
+        }
+        uses tunnel-p2mp-properties;
+      }
+    }
+  }
+
+  /* TE LSPs ephemeral state container data */
+  grouping lsps-state-grouping {
+    description
+      "LSPs state operational data grouping";
+    container lsps-state {
+      config "false";
+      description "LSPs operational state data.";
+
+      list lsp {
+        key
+          "source destination tunnel-id lsp-id "+
+          "extended-tunnel-id type";
+        description
+          "List of LSPs associated with the tunnel.";
+        leaf source {
+          type inet:ip-address;
+          description
+            "Tunnel sender address extracted from
+            SENDER_TEMPLATE  object";
+          reference "RFC3209";
+        }
+        leaf destination {
+          type inet:ip-address;
+          description
+            "Tunnel endpoint address extracted from
+            SESSION object";
+          reference "RFC3209";
+        }
+        leaf tunnel-id {
+          type uint16;
+          description
+            "Tunnel identifier used in the SESSION
+            that remains constant over the life
+            of the tunnel.";
+          reference "RFC3209";
+        }
+        leaf lsp-id {
+          type uint16;
+          description
+            "Identifier used in the SENDER_TEMPLATE
+            and the FILTER_SPEC that can be changed
+            to allow a sender to share resources with
+            itself.";
+          reference "RFC3209";
+        }
+        leaf extended-tunnel-id {
+          type inet:ip-address;
+           description
+            "Extended Tunnel ID of the LSP.";
+          reference "RFC3209";
+        }
+        leaf type {
+          type identityref {
+            base te-types:tunnel-type;
+          }
+          description "The LSP type P2P or P2MP";
+        }
+
+        uses lsp-properties_state;
+        uses lsp-record-route-information_state;
+      }
+    }
+  }
+  /*** End of TE global groupings ***/
+
+  /**
+   * TE configurations container
+   */
+  container te {
+    presence "Enable TE feature.";
+    description
+       "TE global container.";
+
+    /* TE Global Configuration Data */
+    uses globals-grouping;
+
+    /* TE Tunnel Configuration Data */
+    uses tunnels-grouping;
+
+    /* TE LSPs State Data */
+    uses lsps-state-grouping;
+  }
+
+  /* TE Global RPCs/execution Data */
+  rpc globals-rpc {
+    description
+      "Execution data for TE global.";
+  }
+
+  /* TE interfaces RPCs/execution Data */
+  rpc interfaces-rpc {
+    description
+      "Execution data for TE interfaces.";
+  }
+
+  /* TE Tunnel RPCs/execution Data */
+  rpc tunnels-rpc {
+    description "TE tunnels RPC nodes";
+    input {
+      container tunnel-info {
+        description "Tunnel Identification";
+        choice type {
+          description "Tunnel information type";
+          case tunnel-p2p {
+            leaf p2p-id {
+              type te:tunnel-ref;
+              description "P2P TE tunnel";
+            }
+          }
+          case tunnel-p2mp {
+            leaf p2mp-id {
+              type te:tunnel-p2mp-ref;
+              description "P2MP TE tunnel";
+            }
+          }
+        }
+      }
+    }
+    output {
+      container result {
+        description
+          "The container result of the RPC operation";
+        leaf result {
+          type enumeration {
+            enum success {
+              description "Origin ingress";
+            }
+            enum in-progress {
+              description "Origin egress";
+            }
+            enum fail {
+              description "transit";
+            }
+          }
+          description "The result of the RPC operation";
+        }
+      }
+    }
+  }
+
+/**************************************************************/
+//TODO: FIXME: HENRY added begins
+
+  grouping te-optimization-criterion {
+    description
+      "";
+    container optimization-criterion {
+      description "Optimization criterion.";
+      list metric {
+        key "name";
+        description 
+          "Name of the numerical property";
+        
+        leaf name {
+          type identityref {
+            base te-types:te-path-numerical-property;
+          }
+          description "";
+        }
+        leaf goal {
+          type enumeration {
+            enum minimize {
+              description "Minimize";
+            }
+            enum maxmize {
+              description "Maxmize";
+            }
+          }
+          description "";
+        }
+        leaf weight {
+          type uint8;
+          description "";
+        }
+      }
+      list tiebreaker {
+        key "metric";
+        description 
+          "A list of numerical properties used as tiebreakers.
+           The order of a property in the list is the precedence
+           of tiebreaking.";
+        
+        leaf metric {
+          type identityref {
+            base te-types:te-path-numerical-property;
+          }
+          description "";
+        }
+        leaf tiebreaker-type {
+          type identityref {
+            base te-types:path-tiebreaker-type;
+          }
+          default te-types:path-tiebreaker-minfill;
+          description
+            "The tunnel path computation tie breakers.";
+        }
+      }
+    }
+  }
+
+  grouping te-path-constraints {
+    description
+      "TE path constraints configuration grouping";
+
+    container path-constraints {
+      description "Path constraints.";
+      list metric {
+        key "name";
+        description "";
+        
+        leaf name {
+          type identityref {
+            base te-types:te-path-numerical-property;
+          }
+          description 
+            "Name of the numerical property";
+        }
+        leaf low-limit {
+          type uint64;
+          description 
+            "";
+        }
+        leaf high-limit {
+          type uint64;
+          description 
+            "";
+        }
+      }
+      leaf bandwidth-generic {
+        type te-types:te-bandwidth;
+        description
+          "A technology agnostic requested bandwidth to use
+           for path computation";
+      }
+      leaf setup-priority {
+        type uint8 {
+          range "0..7";
+        }
+        description
+          "TE LSP requested setup priority";
+      }
+      leaf hold-priority {
+        type uint8 {
+          range "0..7";
+        }
+        description
+          "TE LSP requested hold priority";
+      }
+      leaf ignore-overload {
+        type boolean;
+        description
+          "The tunnel path can traverse overloaded node.";
+      }
+      uses path-affinities;
+      uses path-srlgs;
+    }
+  }
+
+  grouping te-path-properties {
+    description
+      "";
+
+    container path-properties {
+      description "";
+      list metric {
+        key "name";
+        description "";
+        
+        leaf name {
+          type identityref {
+            base te-types:te-path-numerical-property;
+          }
+          description "";
+        }
+        leaf value {
+          type uint64;
+          description "";
+        }
+      }
+      leaf bandwidth-generic {
+        type te-types:te-bandwidth;
+        description
+          "A technology agnostic requested bandwidth to use
+          for path computation";
+      }
+      leaf setup-priority {
+        type uint8 {
+          range "0..7";
+        }
+        description
+          "TE LSP requested setup priority";
+      }
+      leaf hold-priority {
+        type uint8 {
+          range "0..7";
+        }
+        description
+          "TE LSP requested hold priority";
+      }
+      leaf ignore-overload {
+        type boolean;
+        description
+          "The tunnel path can traverse overloaded node.";
+      }
+      uses path-affinities;
+      uses path-srlgs;
+    }
+  }
+
+  rpc te-tunnel-path-compute {
+    description "TE tunnel path computation ";
+    input {
+      leaf inter-request-diversity {
+        type te-types:te-path-disjointness;
+        description
+          "Diversity requirement between requests. 
+           If not specified, requests are computed independently.";
+      }
+      uses te-optimization-criterion;
+
+      list request {
+        key "id";
+        description "A list of request items.";
+
+        leaf id {
+          type uint8;
+          description
+            "Request ID.";
+        }
+
+        leaf source {
+          type te-types:te-node-id;
+          description
+            "TE tunnel source address.";
+        }
+        leaf destination {
+          type te-types:te-node-id;
+          description
+            "P2P tunnel destination address";
+        }
+        leaf src-tp-id {
+          type binary;
+          description
+            "TE tunnel source termination point identifier.";
+        }
+        leaf dst-tp-id {
+          type binary;
+          description
+            "TE tunnel destination termination point identifier.";
+        }
+        leaf switching-layer {
+          type identityref {
+            base te-types:switching-capabilities;
+          }
+          description
+            "Switching layer where the requests are computed.";
+        }
+        leaf encoding {
+          type identityref {
+            base te-types:lsp-encoding-types;
+          }
+          description "LSP encoding type";
+        }
+        
+        uses te-path-constraints;
+
+        container explicit-route-objects {
+          description "";
+        }
+      }
+    }
+    output {
+      leaf return-code {
+        type enumeration {
+          enum success {
+            description "success";
+          }
+          enum aborted {
+            description "";
+          }
+          enum destination-not-found {
+            description "";
+          }
+          enum invalid-argument {
+            description "";
+          }
+          enum no-memory {
+            description "";
+          }
+          enum no-path-found{
+            description "";
+          }
+          enum other-error {
+            description "";
+          }
+          enum some-path-not-found{
+            description "";
+          }
+          enum source-not-found {
+            description "";
+          }
+          enum topology-error {
+            description "";
+          }
+        }
+        description
+          "Return code.";
+      }
+      list result {
+        key "id";
+        description
+          "A list of results for all requests.";
+
+        leaf id {
+          type uint8;
+          description
+            "Request ID.";
+        }
+
+        uses te-path-properties;
+
+        container explicit-route-objects {
+          description "";
+        }        
+      }
+    }
+  }
+
+//TODO: FIXME: HENRY added finish
+/**************************************************************/
+
+  /* TE Global Notification Data */
+  notification globals-notif {
+    description
+      "Notification messages for Global TE.";
+  }
+
+  /* TE Tunnel Notification Data */
+  notification tunnels-notif {
+    description
+      "Notification messages for TE tunnels.";
+  }
+}
diff --git a/runtime/src/test/resources/schemaProviderTestYangFiles/yrt-ietf-te-mpls-types@2017-03-10.yang b/runtime/src/test/resources/schemaProviderTestYangFiles/yrt-ietf-te-mpls-types@2017-03-10.yang
new file mode 100644
index 0000000..ff03438
--- /dev/null
+++ b/runtime/src/test/resources/schemaProviderTestYangFiles/yrt-ietf-te-mpls-types@2017-03-10.yang
@@ -0,0 +1,132 @@
+module yrt-ietf-te-mpls-types {
+
+     namespace "urn:ietf:params:xml:ns:yang:yrt-ietf-te-mpls-types";
+
+     /* Replace with IANA when assigned */
+     prefix "te-mpls-types";
+
+     organization
+       "IETF TEAS Working Group";
+
+     contact "Fill me";
+
+     description
+       "This module contains a collection of generally
+       useful TE specific YANG data type defintions.";
+
+     revision "2017-03-10" {
+       description "Latest revision of TE MPLS types";
+       reference "RFC3209";
+     }
+
+     identity backup-protection-type {
+       description
+         "Base identity for backup protection type";
+     }
+
+     identity backup-protection-link {
+       base backup-protection-type;
+       description
+         "backup provides link protection only";
+     }
+
+     identity backup-protection-node-link {
+       base backup-protection-type;
+       description
+         "backup offers node (preferred) or link protection";
+     }
+
+     identity bc-model-type {
+       description
+         "Base identity for Diffserv-TE bandwidth constraint
+         model type";
+     }
+
+     identity bc-model-rdm {
+       base bc-model-type;
+       description
+         "Russian Doll bandwidth constraint model type.";
+     }
+
+     identity bc-model-mam {
+       base bc-model-type;
+       description
+         "Maximum Allocation bandwidth constraint
+         model type.";
+     }
+
+     identity bc-model-mar {
+       base bc-model-type;
+       description
+         "Maximum Allocation with Reservation
+         bandwidth constraint model type.";
+     }
+
+     typedef bandwidth-kbps {
+       type uint64;
+       units "Kbps";
+       description
+         "Bandwidth values expressed in kilobits per second";
+     }
+
+     typedef bandwidth-mbps {
+       type uint64;
+       units "Mbps";
+       description
+         "Bandwidth values expressed in megabits per second";
+     }
+
+     typedef bandwidth-gbps {
+       type uint64;
+       units "Gbps";
+       description
+         "Bandwidth values expressed in gigabits per second";
+     }
+
+     typedef te-bandwidth-type {
+       type enumeration {
+         enum SPECIFIED {
+           description
+             "Bandwidth is explicitly specified";
+         }
+         enum AUTO {
+           description
+             "Bandwidth is automatically computed";
+         }
+       }
+       description
+         "enumerated type for specifying whether bandwidth is
+          explicitly specified or automatically computed";
+     }
+
+     typedef bfd-type {
+       type enumeration {
+         enum classical {
+           description "BFD classical session type.";
+         }
+         enum seamless {
+           description "BFD seamless session type.";
+         }
+       }
+       default "classical";
+       description
+         "Type of BFD session";
+     }
+
+     typedef bfd-encap-mode-type {
+       type enumeration {
+         enum gal {
+           description
+             "BFD with GAL mode";
+         }
+         enum ip {
+           description
+             "BFD with IP mode";
+         }
+       }
+       default ip;
+       description
+         "Possible BFD transport modes when running over TE
+         LSPs.";
+     }
+   }
\ No newline at end of file