diff --git a/apps/tenbi/topology/src/main/java/org/onosproject/tenbi/topology/impl/TeTopologyNbiManager.java b/apps/tenbi/topology/src/main/java/org/onosproject/tenbi/topology/impl/TeTopologyNbiManager.java
index 799f4ed..a014a48 100644
--- a/apps/tenbi/topology/src/main/java/org/onosproject/tenbi/topology/impl/TeTopologyNbiManager.java
+++ b/apps/tenbi/topology/src/main/java/org/onosproject/tenbi/topology/impl/TeTopologyNbiManager.java
@@ -28,6 +28,7 @@
 import org.onosproject.teyang.api.OperationType;
 import org.onosproject.teyang.utils.topology.NetworkConverter;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.IetfNetwork;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.IetfNetwork.OnosYangOpType;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.IetfNetworkOpParam;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.IetfNetworkService;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.Networks;
@@ -102,12 +103,14 @@
         IetfNetworkOpParam.IetfNetworkBuilder builder =  new IetfNetworkOpParam.IetfNetworkBuilder();
         IetfNetwork newNetwork = builder.networks(networks)
                                         .networksState(networkStates)
-                                        .onosYangNodeOperationType(IetfNetworkOpParam.OnosYangNodeOperationType.NONE)
+                                        .yangIetfNetworkOpType(OnosYangOpType.NONE)
                                         .build();
 
         // processSubtreeFiltering() filters the entire data tree based on the
         // user's query and returns the filtered data.
-        return ietfNetwork.processSubtreeFiltering(newNetwork, false);
+        return ietfNetwork.processSubtreeFiltering(
+                                                   (IetfNetworkOpParam) newNetwork,
+                                                   false);
     }
 
     @Override
diff --git a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/LinkConverter.java b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/LinkConverter.java
index 24518d8..f8aeca2 100644
--- a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/LinkConverter.java
+++ b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/LinkConverter.java
@@ -19,11 +19,16 @@
 
 import java.util.List;
 
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpAddress.Version;
 import org.onosproject.tetopology.management.api.KeyId;
+import org.onosproject.tetopology.management.api.link.ElementType;
 import org.onosproject.tetopology.management.api.link.ExternalDomain;
 import org.onosproject.tetopology.management.api.link.LinkProtectionType;
 import org.onosproject.tetopology.management.api.link.NetworkLinkKey;
 import org.onosproject.tetopology.management.api.link.PathElement;
+import org.onosproject.tetopology.management.api.link.TeIpv4;
 import org.onosproject.tetopology.management.api.link.TeLink;
 import org.onosproject.tetopology.management.api.link.UnderlayBackupPath;
 import org.onosproject.tetopology.management.api.link.UnderlayPath;
@@ -58,93 +63,54 @@
                .ietfnetworktopology.networks.network.augmentedndnetwork.link.SupportingLink
                .SupportingLinkBuilder;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.augmentednwnetworks.te.templates.linktemplate
-               .telinkattributes.LinkProtectionTypeEnum;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
                .ietftetopology.networks.network.link.AugmentedNtLink;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
                .ietftetopology.networks.network.link.DefaultAugmentedNtLink;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
                .ietftetopology.networks.network.link.DefaultAugmentedNtLink.AugmentedNtLinkBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.DefaultTe;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.DefaultTe.TeBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.Config;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-.ietftetopology.networks.network.link.augmentedntlink.te.Config.ConfigBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.DefaultConfig;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.DefaultState;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.State;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-.ietftetopology.networks.network.link.augmentedntlink.te.State.StateBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.DefaultTeLinkAttributes;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.TeLinkAttributes;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.TeLinkAttributes
-               .TeLinkAttributesBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes
-               .DefaultExternalDomain;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes
-               .DefaultExternalDomain.ExternalDomainBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes.DefaultTeSrlgs;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes.DefaultUnderlay;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes
-               .DefaultUnreservedBandwidth;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes.TeSrlgs
-               .TeSrlgsBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes.Underlay;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes.Underlay
-               .UnderlayBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes
-               .UnreservedBandwidth;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes
-               .UnreservedBandwidth.UnreservedBandwidthBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes
-               .underlay.DefaultUnderlayBackupPath;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-               .networks.network.link.augmentedntlink.te.config.telinkattributes.underlay
-               .DefaultUnderlayBackupPath.UnderlayBackupPathBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes
-               .underlay.DefaultUnderlayPrimaryPath;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes
-               .underlay.DefaultUnderlayTrailDes.UnderlayTrailDesBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes
-               .underlay.DefaultUnderlayTrailSrc.UnderlayTrailSrcBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes
-               .underlay.UnderlayPrimaryPath;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes
-               .underlay.UnderlayPrimaryPath.UnderlayPrimaryPathBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes
-               .underlay.underlayprimarypath.DefaultPathElement;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.DefaultTe;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.DefaultTe.TeBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.Config;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultConfig;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultConfig.ConfigBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultState.StateBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.State;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.DefaultTeLinkAttributes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.DefaultTeLinkAttributes.TeLinkAttributesBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.TeLinkAttributes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultExternalDomain;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultExternalDomain.ExternalDomainBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultUnderlay;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultUnderlay.UnderlayBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.Underlay;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultTeSrlgs;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultTeSrlgs.TeSrlgsBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultUnreservedBandwidth;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultUnreservedBandwidth.UnreservedBandwidthBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.UnreservedBandwidth;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkinfoattributes.LinkProtectionTypeEnum;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayBackupPath;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayBackupPath.UnderlayBackupPathBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayPrimaryPath;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayPrimaryPath.UnderlayPrimaryPathBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayTrailDes.UnderlayTrailDesBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayTrailSrc.UnderlayTrailSrcBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.UnderlayPrimaryPath;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.underlayprimarypath.DefaultPathElement;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.underlayprimarypath.DefaultPathElement.PathElementBuilder;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.Srlg;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeLinkAccessType;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeNodeId;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyId;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTpId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.Type;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.AsNumber;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.DefaultAsNumber;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.DefaultIpv4Address;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.DefaultUnnumberedLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.Ipv4Address;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.UnnumberedLink;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705
                .ietftetypes.telinkaccesstype.TeLinkAccessTypeEnum;
 
@@ -157,7 +123,7 @@
     private static final String
         E_NULL_TELINK_UNDERLAY_PATH = "TeSubsystem link underlayPath object cannot be null";
     private static final String
-        E_NULL_TELINK_DATA = "TeSubsystem teLink data cannot be null";
+        E_NULL_TELINK_DATA = "TeSubsystem teLinkAttrBuilder data cannot be null";
     private static final String
         E_NULL_TELINK = "TeSubsystem teLink object cannot be null";
     private static final String
@@ -176,14 +142,13 @@
                                        DefaultUnderlayPrimaryPath.builder();
         if (tePath.pathElements() != null) {
             for (PathElement pathElementTe : tePath.pathElements()) {
-                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
-                   .rev20160708.ietftetopology.networks.network.link.augmentedntlink.te
-                   .config.telinkattributes.underlay.underlayprimarypath.PathElement
-                   .PathElementBuilder pathElementYangBuilder = DefaultPathElement.builder();
-                // FIXME: pathElementTe does not have any getter or
-                // setter at the moment --> pathElementYangBuilder =
-                // pathElementYangBuilder.pathElementId(pathElementTe.getPathElementId());
-                pathBuilder = pathBuilder.addToPathElement(pathElementYangBuilder.build());
+                PathElementBuilder pathElementYangBuilder = DefaultPathElement
+                        .builder();
+                pathElementYangBuilder = pathElementYangBuilder
+                        .pathElementId(pathElementTe.pathElementId())
+                        .type(findYangTypeConfigPrimaryPath(pathElementTe.type()));
+                pathBuilder = pathBuilder
+                        .addToPathElement(pathElementYangBuilder.build());
             }
         }
         pathBuilder = pathBuilder.networkIdRef(NetworkId.fromString(
@@ -205,18 +170,17 @@
                                      .teTopologyIdRef(TeTopologyId.fromString(
                                                         tePath.ref().getTopologyId().topologyId()));
             for (PathElement backupPathElementTe : tePath.pathElements()) {
-                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
-                   .rev20160708.ietftetopology.networks.network.link.augmentedntlink.te
-                   .config.telinkattributes.underlay.underlaybackuppath.PathElement
-                   .PathElementBuilder elementBuilder =
-                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
-                   .rev20160708.ietftetopology.networks.network.link.augmentedntlink.te
-                   .config.telinkattributes.underlay.underlaybackuppath.DefaultPathElement.builder();
-                // FIXME: backupPathElementTe does not have any
-                // getter or setter at the moment -->
-                // elementBuilder =
-                // elementBuilder.pathElementId(backupPathElementTe.getPathElementId());
-                pathBuilder = pathBuilder.addToPathElement(elementBuilder.build());
+                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+                .ietftetopology.telinkunderlayattributes.underlaybackuppath.DefaultPathElement.
+                PathElementBuilder backupPathElementYangBuilder =
+                    org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+                        .ietftetopology.telinkunderlayattributes.underlaybackuppath.DefaultPathElement.builder();
+                backupPathElementYangBuilder = backupPathElementYangBuilder
+                        .pathElementId(backupPathElementTe.pathElementId());
+                backupPathElementYangBuilder = backupPathElementYangBuilder
+                        .type(findYangTypeConfigPrimaryPath(backupPathElementTe
+                                .type()));
+                pathBuilder = pathBuilder.addToPathElement(backupPathElementYangBuilder.build());
             }
             yangBuilder = yangBuilder.addToUnderlayBackupPath(pathBuilder.build());
         }
@@ -224,6 +188,37 @@
         return yangBuilder;
     }
 
+    private static Type findYangTypeConfigPrimaryPath(ElementType type) {
+        if (type instanceof org.onosproject.tetopology.management.api.link.AsNumber) {
+            AsNumber.AsNumberBuilder yangAsNumberBuilder = DefaultAsNumber
+                    .builder();
+            yangAsNumberBuilder.asNumber(((AsNumber) type).asNumber());
+            return yangAsNumberBuilder.build();
+        } else if (type instanceof TeIpv4) {
+            Ipv4Address.Ipv4AddressBuilder yangIpv4AddrBuilder = DefaultIpv4Address
+                    .builder();
+            yangIpv4AddrBuilder = yangIpv4AddrBuilder
+                    .v4Address(new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types
+                               .rev20130715.ietfinettypes.Ipv4Address(((TeIpv4) type)
+                            .v4Address().toString()));
+            yangIpv4AddrBuilder = yangIpv4AddrBuilder
+                    .v4Loose(((TeIpv4) type).v4Loose());
+            yangIpv4AddrBuilder = yangIpv4AddrBuilder
+                    .v4PrefixLength((((TeIpv4) type).v4PrefixLength()));
+            return yangIpv4AddrBuilder.build();
+        } else if (type instanceof org.onosproject.tetopology.management.api.link.UnnumberedLink) {
+            UnnumberedLink.UnnumberedLinkBuilder unnumberedLinkBuilder = DefaultUnnumberedLink.builder();
+            unnumberedLinkBuilder.routerId(org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
+                                           .inet.types.rev20130715.ietfinettypes.IpAddress
+                                    .fromString(((org.onosproject.tetopology.management.api.link.UnnumberedLink) type)
+                                            .routerId().toString()))
+                                 .interfaceId(((org.onosproject.tetopology.management.api.link.UnnumberedLink) type)
+                                              .interfaceId());
+            return unnumberedLinkBuilder.build();
+        }
+        return null;
+    }
+
     /**
      * TE Link underlay path Config object conversion from TE Topology subsystem to YANG.
      *
@@ -267,151 +262,15 @@
         return builder.build();
     }
 
-    private static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
-                      .rev20160708.ietftetopology.networks.network.link.augmentedntlink.te
-                      .state.telinkattributes.Underlay.UnderlayBuilder
-            te2YangStateUnderlayPrimaryPath(
-                   org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
-                      .rev20160708.ietftetopology.networks.network.link.augmentedntlink.te
-                      .state.telinkattributes.Underlay.UnderlayBuilder yangBuilder,
-                   org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath tePath) {
-        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-            .ietftetopology.networks.network.link.augmentedntlink.te.state.telinkattributes
-            .underlay.UnderlayPrimaryPath.UnderlayPrimaryPathBuilder pathBuilder =
-        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-            .ietftetopology.networks.network.link.augmentedntlink.te.state.telinkattributes
-            .underlay.DefaultUnderlayPrimaryPath.builder();
-        if (tePath.pathElements() != null) {
-            for (PathElement pathElementTe : tePath.pathElements()) {
-                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
-                   .rev20160708.ietftetopology.networks.network.link.augmentedntlink.te
-                   .state.telinkattributes.underlay.underlayprimarypath.PathElement
-                   .PathElementBuilder pathElementYangBuilder =
-                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
-                   .rev20160708.ietftetopology.networks.network.link.augmentedntlink.te
-                   .state.telinkattributes.underlay.underlayprimarypath.DefaultPathElement
-                   .builder();
-                // FIXME: pathElementTe does not have any getter or
-                // setter at the moment --> pathElementYangBuilder =
-                // pathElementYangBuilder.pathElementId(pathElementTe.getPathElementId());
-                pathBuilder = pathBuilder.addToPathElement(pathElementYangBuilder.build());
-            }
-        }
-        pathBuilder = pathBuilder.networkIdRef(NetworkId.fromString(
-                                               tePath.ref().getNetworkId().toString()))
-                                 .teTopologyIdRef(TeTopologyId.fromString(
-                                               tePath.ref().getTopologyId().topologyId()));
-        return yangBuilder.underlayPrimaryPath(pathBuilder.build());
+    private static Config teLink2YangConfig(TeLinkAttributesBuilder teLinkAttrBuilder) {
+        checkNotNull(teLinkAttrBuilder, E_NULL_TELINK_DATA);
+
+        ConfigBuilder yangConfigBuilder = DefaultConfig.builder()
+                                                       .teLinkAttributes(teLinkAttrBuilder.build());
+        return yangConfigBuilder.build();
     }
 
-    private static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
-                      .rev20160708.ietftetopology.networks.network.link.augmentedntlink.te
-                      .state.telinkattributes.Underlay.UnderlayBuilder
-           te2YangStateUnderlayBackupPaths(
-                   org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
-                   .rev20160708.ietftetopology.networks.network.link.augmentedntlink.te
-                   .state.telinkattributes.Underlay.UnderlayBuilder yangBuilder,
-            List<org.onosproject.tetopology.management.api.link.UnderlayBackupPath> tePaths) {
-
-        for (UnderlayBackupPath tePath : tePaths) {
-            org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-            .ietftetopology.networks.network.link.augmentedntlink.te.state.telinkattributes
-            .underlay.UnderlayBackupPath.UnderlayBackupPathBuilder
-            pathBuilder = org.onosproject.yang.gen.v1.urn.ietf.params.xml
-            .ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks.network.link.augmentedntlink
-            .te.state.telinkattributes.underlay.DefaultUnderlayBackupPath
-                    .builder();
-
-            pathBuilder = pathBuilder.index(tePath.index());
-            pathBuilder = pathBuilder.networkIdRef(NetworkId.fromString(
-                                                        tePath.ref().getNetworkId().toString()))
-                                     .teTopologyIdRef(TeTopologyId.fromString(
-                                                        tePath.ref().getTopologyId().topologyId()));
-            for (PathElement backupPathElementTe : tePath.pathElements()) {
-                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
-                   .rev20160708.ietftetopology.networks.network.link.augmentedntlink.te
-                   .state.telinkattributes.underlay.underlaybackuppath.PathElement
-                   .PathElementBuilder elementBuilder =
-                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
-                   .rev20160708.ietftetopology.networks.network.link.augmentedntlink.te
-                   .state.telinkattributes.underlay.underlaybackuppath.DefaultPathElement.builder();
-                // FIXME: backupPathElementTe does not have any
-                // getter or setter at the moment -->
-                // elementBuilder =
-                // elementBuilder.pathElementId(backupPathElementTe.getPathElementId());
-                pathBuilder = pathBuilder.addToPathElement(elementBuilder.build());
-            }
-            yangBuilder = yangBuilder.addToUnderlayBackupPath(pathBuilder.build());
-        }
-
-        return yangBuilder;
-    }
-
-    /**
-     * TE Link underlay path State object conversion from TE Topology subsystem to YANG.
-     *
-     * @param tePath TE underlay object
-     * @return Link underlay path State YANG object
-     */
-    private static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
-                       .rev20160708.ietftetopology.networks.network.link.augmentedntlink.te
-                       .state.telinkattributes.Underlay
-                   teSubsystem2YangStateUnderlayPath(UnderlayPath tePath) {
-        checkNotNull(tePath, E_NULL_TELINK_UNDERLAY_PATH);
-
-        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-            .ietftetopology.networks.network.link.augmentedntlink.te.state.telinkattributes
-            .Underlay.UnderlayBuilder builder =
-        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-            .ietftetopology.networks.network.link.augmentedntlink.te.state.telinkattributes
-            .DefaultUnderlay.builder().underlayProtectionType(tePath.protectionType());
-
-        if (tePath.primaryPath() != null) {
-            builder = te2YangStateUnderlayPrimaryPath(builder, tePath.primaryPath());
-
-        }
-        if (tePath.trailSrc() != null) {
-            builder = builder.underlayTrailSrc(
-                          new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te
-                                  .topology.rev20160708.ietftetopology.networks.network.link
-                                  .augmentedntlink.te.state.telinkattributes.underlay
-                                  .DefaultUnderlayTrailSrc.UnderlayTrailSrcBuilder()
-                              .networkRef(NetworkId.fromString(
-                                              tePath.trailSrc().networkId().toString()))
-                              .nodeRef(NodeId.fromString(
-                                              tePath.trailSrc().nodeId().toString()))
-                              .tpRef(TpId.fromString(
-                                              tePath.trailSrc().tpId().toString()))
-                              .build());
-        }
-        if (tePath.trailDes() != null) {
-            builder = builder.underlayTrailDes(
-                          new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te
-                                   .topology.rev20160708.ietftetopology.networks.network.link
-                                   .augmentedntlink.te.state.telinkattributes.underlay
-                                   .DefaultUnderlayTrailDes.UnderlayTrailDesBuilder()
-                              .networkRef(NetworkId.fromString(
-                                              tePath.trailDes().networkId().toString()))
-                              .nodeRef(NodeId.fromString(
-                                              tePath.trailDes().nodeId().toString()))
-                              .tpRef(TpId.fromString(
-                                              tePath.trailDes().tpId().toString()))
-                              .build());
-        }
-        if (tePath.backupPaths() != null) {
-            builder = te2YangStateUnderlayBackupPaths(builder, tePath.backupPaths());
-        }
-
-        return builder.build();
-    }
-
-    /**
-     * TE Link Config object conversion from TE Topology subsystem to YANG.
-     *
-     * @param teLink TE link object
-     * @return TE Link Config YANG object
-     */
-    private static Config teLink2YangConfig(TeLink teLink) {
+    private static TeLinkAttributesBuilder teLink2YangAttrBuilder(TeLink teLink) {
         checkNotNull(teLink, E_NULL_TELINK_DATA);
 
         TeLinkAttributesBuilder attrBuilder = DefaultTeLinkAttributes.builder();
@@ -478,9 +337,7 @@
             }
         }
 
-        ConfigBuilder yangConfigBuilder = DefaultConfig.builder()
-                                                       .teLinkAttributes(attrBuilder.build());
-        return yangConfigBuilder.build();
+        return attrBuilder;
     }
 
     private static LinkProtectionTypeEnum
@@ -515,95 +372,10 @@
         }
     }
 
-    /**
-     * TE Link State object conversion from TE Topology subsystem to YANG.
-     *
-     * @param teLink TE link object
-     * @return TE Link State YANG object
-     */
-    private static State teLink2YangState(TeLink teLink) {
-        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-            .ietftetopology.networks.network.link.augmentedntlink.te.state.TeLinkAttributes
-            .TeLinkAttributesBuilder attrBuilder =
-        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-            .ietftetopology.networks.network.link.augmentedntlink.te.state.DefaultTeLinkAttributes
-            .builder()
-            .teDefaultMetric(teLink.teDefaultMetric())
-            .isAbstract(teLink.isAbstract());
-        if (teLink.linkIndex() != null) {
-            attrBuilder = attrBuilder.linkIndex(teLink.linkIndex());
-        }
-        if (teLink.name() != null) {
-            attrBuilder = attrBuilder.name(teLink.name());
-        }
-        if (teLink.adminStatus() != null) {
-            attrBuilder = attrBuilder
-                    .adminStatus(EnumConverter
-                            .teSubsystem2YangAdminStatus(teLink
-                            .adminStatus()));
-        }
-        if (teLink.accessType() != null) {
-            attrBuilder = attrBuilder
-                    .accessType(teSubsystem2YangTeLinkAccess(teLink
-                            .accessType()));
-        }
-        if (teLink.linkProtectionType() != null) {
-            attrBuilder = attrBuilder
-                    .linkProtectionType(teSubsystem2YangStateLinkProtectionType(teLink
-                            .linkProtectionType()));
-        }
-        if (teLink.maxLinkBandwidth() != null) {
-            attrBuilder = attrBuilder.maxLinkBandwidth(teLink.maxLinkBandwidth());
-        }
-        if (teLink.maxResvLinkBandwidth() != null) {
-            attrBuilder = attrBuilder.maxResvLinkBandwidth(teLink.maxResvLinkBandwidth());
-        }
-        if (teLink.teSrlgs() != null) {
-            org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                .ietftetopology.networks.network.link.augmentedntlink.te.state.telinkattributes
-                .TeSrlgs.TeSrlgsBuilder srlgsBuilder =
-            org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                .ietftetopology.networks.network.link.augmentedntlink.te.state.telinkattributes
-                .DefaultTeSrlgs.builder();
-            for (Long srlgLongVal : teLink.teSrlgs()) {
-                srlgsBuilder = srlgsBuilder.addToValue(new Srlg(srlgLongVal));
-            }
-            attrBuilder = attrBuilder.teSrlgs(srlgsBuilder.build());
-        }
-        if (teLink.underlayPath() != null) {
-            attrBuilder = attrBuilder.underlay(teSubsystem2YangStateUnderlayPath(teLink.underlayPath()));
-        }
-        if (teLink.externalDomain() != null) {
-            org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                    .ietftetopology.networks.network.link.augmentedntlink.te.state.telinkattributes
-                    .ExternalDomain.ExternalDomainBuilder edBuilder =
-            org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                    .ietftetopology.networks.network.link.augmentedntlink.te.state.telinkattributes
-                    .DefaultExternalDomain.builder()
-                                          .plugId(teLink.externalDomain().plugId())
-                                          .remoteTeLinkTpId(TeTpId.fromString(
-                                                  teLink.externalDomain().remoteTeLinkTpId().toString()))
-                                          .remoteTeNodeId(TeNodeId.fromString(
-                                                  teLink.externalDomain().remoteTeNodeId().toString()));
-            attrBuilder = attrBuilder.externalDomain(edBuilder.build());
-        }
-        if (teLink.unreservedBandwidths() != null) {
-            for (org.onosproject.tetopology.management.api.link.UnreservedBandwidth unResBwTe :
-                    teLink.unreservedBandwidths()) {
-                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                    .ietftetopology.networks.network.link.augmentedntlink.te.state.telinkattributes
-                    .UnreservedBandwidth.UnreservedBandwidthBuilder urBuilder =
-                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                    .ietftetopology.networks.network.link.augmentedntlink.te.state.telinkattributes
-                    .DefaultUnreservedBandwidth.builder()
-                                               .bandwidth(unResBwTe.bandwidth())
-                                               .priority(unResBwTe.priority());
-                attrBuilder = attrBuilder.addToUnreservedBandwidth(urBuilder.build());
-            }
-        }
-
+    private static State teLink2YangState(TeLinkAttributesBuilder teLinkAttrBuilder, TeLink teLink) {
         StateBuilder yangStateBuilder = DefaultState.builder()
-                                                    .teLinkAttributes(attrBuilder.build());
+                                                    .teLinkAttributes(teLinkAttrBuilder.build());
+
         if (teLink.opStatus() != null) {
             yangStateBuilder = yangStateBuilder
                     .operStatus(EnumConverter
@@ -611,40 +383,13 @@
                             .opStatus()));
         }
 
-        return yangStateBuilder.build();
-    }
+        // TODO: once stateDerived Underlay is available in core TE Topology
+        // object model, set the value properly
+        // stateDerivedUnderlay = org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
+        // .rev20160708.ietftetopology.telinkstatederived.Underlay
+        // yangStateBuilder = yangStateBuilder.underlay(stateDerivedUnderlay);
 
-    private static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
-        rev20160708.ietftetopology.networks.network.link.augmentedntlink.te.state.informationsourceentry.
-        LinkProtectionTypeEnum teSubsystem2YangStateLinkProtectionType(LinkProtectionType linkProtectionType) {
-        switch (linkProtectionType) {
-        case ENHANCED:
-            return org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
-                    rev20160708.ietftetopology.networks.network.link.augmentedntlink.te.state.informationsourceentry.
-                    LinkProtectionTypeEnum.ENHANCED;
-        case EXTRA_TRAFFIC:
-            return org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
-                    rev20160708.ietftetopology.networks.network.link.augmentedntlink.te.state.informationsourceentry.
-                    LinkProtectionTypeEnum.EXTRA_TRAFFIC;
-        case SHARED:
-            return org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
-                    rev20160708.ietftetopology.networks.network.link.augmentedntlink.te.state.informationsourceentry.
-                    LinkProtectionTypeEnum.SHARED;
-        case UNPROTECTED:
-            return org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
-                    rev20160708.ietftetopology.networks.network.link.augmentedntlink.te.state.informationsourceentry.
-                    LinkProtectionTypeEnum.UNPROTECTED;
-        case YANGAUTOPREFIX1_FOR_1:
-            return org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
-                    rev20160708.ietftetopology.networks.network.link.augmentedntlink.te.state.informationsourceentry.
-                    LinkProtectionTypeEnum.YANGAUTOPREFIX1_FOR_1;
-        case YANGAUTOPREFIX1_PLUS_1:
-            return org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
-                    rev20160708.ietftetopology.networks.network.link.augmentedntlink.te.state.informationsourceentry.
-                    LinkProtectionTypeEnum.YANGAUTOPREFIX1_PLUS_1;
-        default:
-            return null;
-        }
+        return yangStateBuilder.build();
     }
 
     /**
@@ -692,9 +437,11 @@
 
         if (teLink.getTe() != null) {
             TeLink teData = teLink.getTe();
+            TeLinkAttributesBuilder attrBuilder = teLink2YangAttrBuilder(teData);
+
             TeBuilder yangTeBuilder = DefaultTe.builder()
-                                               .config(teLink2YangConfig(teData))
-                                               .state(teLink2YangState(teData));
+                                               .config(teLink2YangConfig(attrBuilder))
+                                               .state(teLink2YangState(attrBuilder, teData));
             AugmentedNtLinkBuilder linkAugmentBuilder =
                     DefaultAugmentedNtLink.builder()
                                           .te(yangTeBuilder.build());
@@ -713,22 +460,17 @@
         teUnderlayPrimaryPath.setRef(new TeNetworkTopologyId(KeyId.keyId(
                                              yangpath.networkIdRef().toString()),
                                      new org.onosproject.tetopology.management.api.TeTopologyId(
-                                             yangpath.providerIdRef().uint32(),
-                                             yangpath.clientIdRef().uint32(),
+                                             ((long) yangpath.providerIdRef()),
+                                             ((long) yangpath.clientIdRef()),
                                              yangpath.teTopologyIdRef().toString())));
 
         List<PathElement> pathElementList = Lists.newArrayList();
-        for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes
-                .underlay.underlayprimarypath.PathElement pathElementConfigYang :
+        for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+                .telinkunderlayattributes.underlayprimarypath.PathElement pathElementConfigYang :
                     yangpath.pathElement()) {
-            //PathElement tePathElement = new PathElement();
-            // FIXME: tePathElement does not have any getter
-            // or setter at the moment -->
-            // tePathElement.set...
-            // TODO: construct the tePathElement object
-            // properly using pathElementConfigYang
-            //pathElementList.add(tePathElement);
+            PathElement tePathElement = new PathElement(pathElementConfigYang.pathElementId(),
+                                                        findElementType(pathElementConfigYang.type()));
+            pathElementList.add(tePathElement);
         }
         teUnderlayPrimaryPath.setPathElement(pathElementList);
         teUnderlay.setPrimaryPath(teUnderlayPrimaryPath);
@@ -739,42 +481,67 @@
     private static org.onosproject.tetopology.management.api.link.UnderlayPath
             yang2TeSubsystemUnderlayBackupPaths(
                      org.onosproject.tetopology.management.api.link.UnderlayPath teUnderlay,
-                     List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te
-                             .topology.rev20160708.ietftetopology.networks.network.link
-                             .augmentedntlink.te.config.telinkattributes.underlay
-                             .UnderlayBackupPath> yangpaths) {
+                     List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
+                         .rev20160708.ietftetopology.telinkunderlayattributes.UnderlayBackupPath> yangpaths) {
         List<UnderlayBackupPath> underlayBackupPathsList = Lists.newArrayList();
         for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                .ietftetopology.networks.network.link.augmentedntlink.te.config.telinkattributes
-                    .underlay.UnderlayBackupPath yangConfig : yangpaths) {
+                .ietftetopology.telinkunderlayattributes.UnderlayBackupPath yangConfig : yangpaths) {
             UnderlayBackupPath ubp = new UnderlayBackupPath();
             ubp.setIndex(yangConfig.index());
             ubp.setRef(new TeNetworkTopologyId(KeyId.keyId(yangConfig.networkIdRef().toString()),
                                                new org.onosproject.tetopology.management.api.TeTopologyId(
-                                                       yangConfig.providerIdRef().uint32(),
-                                                       yangConfig.clientIdRef().uint32(),
+                                                       ((long) yangConfig.providerIdRef()),
+                                                       ((long) yangConfig.clientIdRef()),
                                                        yangConfig.teTopologyIdRef().toString()
                                               )));
             List<PathElement> backupPathElementList = Lists.newArrayList();
-            for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
-                    .rev20160708.ietftetopology.networks.network.link.augmentedntlink.te.config
-                    .telinkattributes.underlay.underlaybackuppath.PathElement
+            for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+                    .ietftetopology.telinkunderlayattributes.underlaybackuppath.PathElement
                         pathElementBackupYang : yangConfig.pathElement()) {
-                //PathElement tePathElementBackup = new PathElement();
-                // FIXME: tePathElement does not have any
-                // getter or setter at the moment -->
-                // tePathElement.set...
-                // TODO: construct the tePathElement object
-                // properly using pathElementBackupYang
-                //backupPathElementList.add(tePathElementBackup);
+                PathElement tePathElementBackup =
+                        new PathElement(pathElementBackupYang.pathElementId(),
+                                        findElementType(pathElementBackupYang.type()));
+                backupPathElementList.add(tePathElementBackup);
             }
             ubp.setPathElement(backupPathElementList);
+            underlayBackupPathsList.add(ubp);
         }
         teUnderlay.setBackupPath(underlayBackupPathsList);
 
         return teUnderlay;
     }
 
+    private static ElementType findElementType(Type type) {
+        ElementType el = null;
+        if (type instanceof AsNumber) {
+            org.onosproject.tetopology.management.api.link.AsNumber elementTypeAsNumber = new org.onosproject
+                    .tetopology.management.api.link.AsNumber(((AsNumber) type).asNumber());
+            return elementTypeAsNumber;
+        } else if (type instanceof Ipv4Address) {
+            TeIpv4 elementTypeIpv4 = new TeIpv4();
+            String ipVal = ((Ipv4Address) type).v4Address().toString();
+            elementTypeIpv4.setV4Address(Ip4Address.valueOf(Version.INET, ipVal.getBytes()).getIp4Address());
+            boolean v4Loose = ((Ipv4Address) type).v4Loose();
+            elementTypeIpv4.setV4Loose(v4Loose);
+            short v4PrefixLength = ((Ipv4Address) type).v4PrefixLength();
+            elementTypeIpv4.setV4PrefixLength(v4PrefixLength);
+            return elementTypeIpv4;
+        } else if (type instanceof UnnumberedLink) {
+            org.onosproject.tetopology.management.api.link.UnnumberedLink elementTypeUnnumberedLink = new org
+                    .onosproject.tetopology.management.api.link.UnnumberedLink();
+            long interfaceId = ((UnnumberedLink) type).interfaceId();
+            elementTypeUnnumberedLink.setInterfaceId(interfaceId);
+            IpAddress routerId = IpAddress.valueOf(((UnnumberedLink) type).routerId().toString());
+            elementTypeUnnumberedLink.setRouterId(routerId);
+            return elementTypeUnnumberedLink;
+        }
+        // TODO: as an improvement in future, construct the tePathElement object
+        // properly using pathElementConfigYang
+        // More types need to be added to the above if/else statements.
+        // Now, I only have AsNumber, Ipv4Address, and UnnumberedLink
+        return el;
+    }
+
     /**
      * TE Link underlay path Config object conversion from YANG to TE Topology subsystem.
      *
@@ -803,21 +570,21 @@
         if (yangLinkAtrr.underlay().underlayTrailSrc() != null) {
             teUnderlay.setTrailSrc(new TerminationPointKey(
                                             KeyId.keyId(yangLinkAtrr.underlay().underlayTrailSrc()
-                                                            .networkRef().uri().toString()),
+                                                            .networkRef().toString()),
                                             KeyId.keyId(yangLinkAtrr.underlay().underlayTrailSrc()
-                                                            .nodeRef().uri().toString()),
+                                                            .nodeRef().toString()),
                                             KeyId.keyId(yangLinkAtrr.underlay().underlayTrailSrc()
-                                                            .tpRef().uri().toString())));
+                                                            .tpRef().toString())));
         }
 
         if (yangLinkAtrr.underlay().underlayTrailDes() != null) {
             teUnderlay.setTrailDes(new TerminationPointKey(
                                             KeyId.keyId(yangLinkAtrr.underlay().underlayTrailDes()
-                                                            .networkRef().uri().toString()),
+                                                            .networkRef().toString()),
                                             KeyId.keyId(yangLinkAtrr.underlay().underlayTrailDes()
-                                                            .nodeRef().uri().toString()),
+                                                            .nodeRef().toString()),
                                             KeyId.keyId(yangLinkAtrr.underlay().underlayTrailDes()
-                                                            .tpRef().uri().toString())));
+                                                            .tpRef().toString())));
         }
 
         return teUnderlay;
diff --git a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NetworkConverter.java b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NetworkConverter.java
index f529d6a..74eed10 100644
--- a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NetworkConverter.java
+++ b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NetworkConverter.java
@@ -24,11 +24,10 @@
 import org.onosproject.tetopology.management.api.link.NetworkLink;
 import org.onosproject.tetopology.management.api.node.NetworkNode;
 import org.onosproject.teyang.api.OperationType;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.IetfNetwork.OnosYangOpType;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
         .ietfnetwork.DefaultNetworks;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
-        .ietfnetwork.DefaultNetworks.OnosYangNodeOperationType;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
         .ietfnetwork.DefaultNetworksState;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
         .ietfnetwork.NetworkId;
@@ -65,17 +64,13 @@
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
         .ietftetopology.networks.network.DefaultAugmentedNwNetwork;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-        .ietftetopology.networks.network.augmentednwnetwork.DefaultTe;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-        .ietftetopology.networks.network.augmentednwnetwork.Te;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
         .ietftetopology.networks.network.networktypes.AugmentedNwNetworkTypes;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
         .ietftetopology.networks.network.networktypes.DefaultAugmentedNwNetworkTypes;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-        .ietftetopology.networks.network.networktypes.augmentednwnetworktypes.DefaultTeTopology;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-        .ietftetopology.networks.network.networktypes.augmentednwnetworktypes.TeTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tetopologyaugment.DefaultTe;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tetopologyaugment.Te;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tetopologytype.DefaultTeTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tetopologytype.TeTopology;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705
         .ietftetypes.TeGlobalId;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705
@@ -121,25 +116,25 @@
     private NetworkConverter() {
     }
 
-    private static OnosYangNodeOperationType toNetworksOperationType(OperationType operation) {
+    private static OnosYangOpType toNetworksOperationType(OperationType operation) {
         switch (operation) {
         case CREATE:
-            return OnosYangNodeOperationType.CREATE;
+            return OnosYangOpType.CREATE;
 
         case DELETE:
-            return OnosYangNodeOperationType.DELETE;
+            return OnosYangOpType.DELETE;
 
         case REMOVE:
-            return OnosYangNodeOperationType.REMOVE;
+            return OnosYangOpType.REMOVE;
 
         case MERGE:
-            return OnosYangNodeOperationType.MERGE;
+            return OnosYangOpType.MERGE;
 
         case REPLACE:
-            return OnosYangNodeOperationType.REPLACE;
+            return OnosYangOpType.REPLACE;
 
         default:
-            return OnosYangNodeOperationType.NONE;
+            return OnosYangOpType.NONE;
         }
     }
 
@@ -156,7 +151,8 @@
         checkNotNull(teSubsystem, E_NULL_TE_NETWORKS);
         checkNotNull(teSubsystem.networks(), E_NULL_TE_NETWORK_LIST);
         Networks.NetworksBuilder builder =
-                DefaultNetworks.builder().onosYangNodeOperationType(toNetworksOperationType(operation));
+                DefaultNetworks.builder()
+                        .yangNetworksOpType(toNetworksOperationType(operation));
         List<Network> networks = Lists.newArrayList();
         for (org.onosproject.tetopology.management.api.Network teNetwork : teSubsystem.networks()) {
             networks.add(teSubsystem2YangNetwork(teNetwork, operation));
@@ -165,29 +161,6 @@
         return builder.build();
     }
 
-    private static DefaultNetworksState.OnosYangNodeOperationType
-                           toNetworksStateOperationType(OperationType operation) {
-        switch (operation) {
-        case CREATE:
-            return DefaultNetworksState.OnosYangNodeOperationType.CREATE;
-
-        case DELETE:
-            return DefaultNetworksState.OnosYangNodeOperationType.DELETE;
-
-        case REMOVE:
-            return DefaultNetworksState.OnosYangNodeOperationType.REMOVE;
-
-        case MERGE:
-            return DefaultNetworksState.OnosYangNodeOperationType.MERGE;
-
-        case REPLACE:
-            return DefaultNetworksState.OnosYangNodeOperationType.REPLACE;
-
-        default:
-            return DefaultNetworksState.OnosYangNodeOperationType.NONE;
-        }
-    }
-
     /**
      * Network States object conversion from TE Topology subsystem to YANG.
      *
@@ -201,7 +174,8 @@
         checkNotNull(teSubsystem, "teSubsystem object cannot be null");
         checkNotNull(teSubsystem.networks(), "TeSubsystem Networks object cannot be null");
         NetworksState.NetworksStateBuilder builder =
-                DefaultNetworksState.builder().onosYangNodeOperationType(toNetworksStateOperationType(operation));
+                DefaultNetworksState.builder()
+                        .yangNetworksStateOpType(toNetworksOperationType(operation));
         List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
                 .ietfnetwork.networksstate.Network> networks = Lists.newArrayList();
         for (org.onosproject.tetopology.management.api.Network teNetwork : teSubsystem.networks()) {
@@ -264,28 +238,6 @@
         return defaultNetworks;
     }
 
-    private static DefaultNetwork.OnosYangNodeOperationType toNetworkOperationType(OperationType operation) {
-        switch (operation) {
-        case CREATE:
-            return DefaultNetwork.OnosYangNodeOperationType.CREATE;
-
-        case DELETE:
-            return DefaultNetwork.OnosYangNodeOperationType.DELETE;
-
-        case REMOVE:
-            return DefaultNetwork.OnosYangNodeOperationType.REMOVE;
-
-        case MERGE:
-            return DefaultNetwork.OnosYangNodeOperationType.MERGE;
-
-        case REPLACE:
-            return DefaultNetwork.OnosYangNodeOperationType.REPLACE;
-
-        default:
-            return DefaultNetwork.OnosYangNodeOperationType.NONE;
-        }
-    }
-
     private static NetworkBuilder te2YangSupportingNetwork(NetworkBuilder builder,
                                                            List<KeyId> teSpptNetworkIds) {
         List<SupportingNetwork> snws = Lists.newArrayList();
@@ -370,8 +322,8 @@
         // Generate a network builder with the specific networkId.
         NetworkId networkId = NetworkId.fromString(teSubsystem.networkId().toString());
         NetworkBuilder builder = DefaultNetwork.builder()
-                                               .onosYangNodeOperationType(
-                                                       toNetworkOperationType(operation))
+                                               .yangNetworkOpType(
+                                                       toNetworksOperationType(operation))
                                                .networkId(networkId);
 
         // Supporting networks
@@ -519,7 +471,7 @@
 
         checkNotNull(yangNetworkState, E_NULL_YANG_NETWORKSSTATE_NETWORK);
         checkNotNull(yangNetworkState.networkRef(), E_NULL_YANG_NETWORKSSTATE_NETWORKREF);
-        String networkref = yangNetworkState.networkRef().uri().string();
+        String networkref = yangNetworkState.networkRef().toString();
         checkState(teNetwork.networkId().toString().equals(networkref),
                    E_DIFF_YANG_NETWORKID);
 
diff --git a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NodeConverter.java b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NodeConverter.java
index 0af2b13..9f85e79 100644
--- a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NodeConverter.java
+++ b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NodeConverter.java
@@ -48,46 +48,25 @@
                .ietftetopology.networks.network.node.AugmentedNwNode;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
                .ietftetopology.networks.network.node.DefaultAugmentedNwNode;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.augmentednwnode.DefaultTe;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.augmentednwnode.DefaultTe.TeBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.augmentednwnode.Te;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.augmentednwnode.te.Config;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.augmentednwnode.te.DefaultConfig;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.augmentednwnode.te.DefaultState;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.augmentednwnode.te.DefaultTunnelTerminationPoint;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.augmentednwnode.te.State;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.augmentednwnode.te.TunnelTerminationPoint;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.augmentednwnode.te.config.DefaultTeNodeAttributes;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.augmentednwnode.te.config.TeNodeAttributes;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.augmentednwnode.te.config.tenodeattributes.ConnectivityMatrix;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.augmentednwnode.te.config.tenodeattributes
-                       .DefaultConnectivityMatrix;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-              .ietftetopology.networks.network.node.augmentednwnode.te.config.tenodeattributes.DefaultUnderlayTopology;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.augmentednwnode.te.config.tenodeattributes.UnderlayTopology;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.augmentednwnode.te.config.tenodeattributes
-                       .connectivitymatrix.DefaultFrom;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.augmentednwnode.te.config.tenodeattributes
-                       .connectivitymatrix.DefaultTo;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.augmentednwnode.te.tunnelterminationpoint
-                       .config.DefaultTerminationCapability;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.DefaultTe;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.DefaultTe.TeBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.Te;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.Config;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.DefaultConfig;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.DefaultState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.DefaultTunnelTerminationPoint;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.State;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.TunnelTerminationPoint;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconfigattributes.DefaultTeNodeAttributes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconfigattributes.TeNodeAttributes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.ConnectivityMatrix;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.DefaultConnectivityMatrix;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.connectivitymatrix.DefaultFrom;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.connectivitymatrix.DefaultTo;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeinfoattributes.DefaultUnderlayTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeinfoattributes.UnderlayTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodetunnelterminationcapability.DefaultTerminationCapability;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodetunnelterminationcapability.DefaultTerminationCapability.TerminationCapabilityBuilder;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeNodeId;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyId;
 
@@ -115,7 +94,6 @@
      */
     private static Config teNode2YangConfig(TeNode teSubsystemTeNode) {
         checkNotNull(teSubsystemTeNode, E_NULL_TE_SUBSYSTEM_TE_NODE);
-
         TeNodeAttributes.TeNodeAttributesBuilder teNodeAttributesConfigBuilder =
                 DefaultTeNodeAttributes.builder()
                                        .isAbstract(teSubsystemTeNode.isAbstract());
@@ -184,11 +162,8 @@
     private static State teNode2YangState(TeNode teSubsystemTeNode) {
         checkNotNull(teSubsystemTeNode, E_NULL_TE_SUBSYSTEM_TE_NODE);
 
-        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-                .networks.network.node.augmentednwnode.te.state.TeNodeAttributes
-                        .TeNodeAttributesBuilder teNodeAttributesStateBuilder =
-        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-                .networks.network.node.augmentednwnode.te.state.DefaultTeNodeAttributes.builder()
+        TeNodeAttributes.TeNodeAttributesBuilder teNodeAttributesStateBuilder = DefaultTeNodeAttributes
+                .builder()
                 .isAbstract(teSubsystemTeNode.isAbstract());
 
         if (teSubsystemTeNode.adminStatus() != null) {
@@ -204,12 +179,8 @@
         }
 
         if (teSubsystemTeNode.underlayTopology() != null) {
-            org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-                    .networks.network.node.augmentednwnode.te.state.tenodeattributes.UnderlayTopology.
-                            UnderlayTopologyBuilder underlayStateBuilder =
-            org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-                    .networks.network.node.augmentednwnode.te.state.tenodeattributes.DefaultUnderlayTopology
-                            .builder();
+            UnderlayTopology.UnderlayTopologyBuilder underlayStateBuilder = DefaultUnderlayTopology
+                    .builder();
             underlayStateBuilder = underlayStateBuilder
                     .networkIdRef(NetworkId.fromString(teSubsystemTeNode
                                                        .underlayTopology().getNetworkId().toString()))
@@ -220,27 +191,18 @@
         }
 
         if (teSubsystemTeNode.connectivityMatrices() != null) {
-            org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-            .networks.network.node.augmentednwnode.te.state.tenodeattributes.ConnectivityMatrix
-            .ConnectivityMatrixBuilder
-            connectivityMatrixStateBuilder = org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
-            .te.topology.rev20160708.ietftetopology.networks.network.node.augmentednwnode
-            .te.state.tenodeattributes.DefaultConnectivityMatrix
+            ConnectivityMatrix.ConnectivityMatrixBuilder connectivityMatrixStateBuilder = DefaultConnectivityMatrix
                     .builder();
             for (org.onosproject.tetopology.management.api.node.ConnectivityMatrix teCm : teSubsystemTeNode
                     .connectivityMatrices()) {
                 connectivityMatrixStateBuilder = connectivityMatrixStateBuilder
                         .id(teCm.id())
                         .isAllowed(teCm.isAllowed())
-                        .from(new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
-                                .rev20160708.ietftetopology.networks.network.node.augmentednwnode.te.state
-                                .tenodeattributes.connectivitymatrix.DefaultFrom.FromBuilder()
+                        .from(new DefaultFrom.FromBuilder()
                                 .tpRef(TpId.fromString(teCm.from().tpId()
                                         .toString()))
                                 .build())
-                        .to(new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
-                            .rev20160708.ietftetopology.networks.network.node.augmentednwnode.te.state
-                            .tenodeattributes.connectivitymatrix.DefaultTo.ToBuilder()
+                        .to(new DefaultTo.ToBuilder()
                                 .tpRef(TpId.fromString(teCm.to().tpId()
                                         .toString()))
                                 .build());
@@ -276,17 +238,15 @@
                 DefaultTunnelTerminationPoint.builder().tunnelTpId(teTunnelTp.getTunnelTpId());
 
         org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                .ietftetopology.networks.network.node.augmentednwnode.te.tunnelterminationpoint
-                        .Config.ConfigBuilder ttpConfigBuilder =
+                .ietftetopology.tenodeaugment.te.tunnelterminationpoint.
+                Config.ConfigBuilder ttpConfigBuilder =
         org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                .ietftetopology.networks.network.node.augmentednwnode.te.tunnelterminationpoint
-                        .DefaultConfig.builder();
+                .ietftetopology.tenodeaugment.te.tunnelterminationpoint.DefaultConfig.builder();
         org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                .ietftetopology.networks.network.node.augmentednwnode.te.tunnelterminationpoint
-                        .State.StateBuilder ttpStateBuilder =
+                .ietftetopology.tenodeaugment.te.tunnelterminationpoint.
+                State.StateBuilder ttpStateBuilder =
         org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                .ietftetopology.networks.network.node.augmentednwnode.te.tunnelterminationpoint
-                        .DefaultState.builder();
+                .ietftetopology.tenodeaugment.te.tunnelterminationpoint.DefaultState.builder();
 
         if (Long.valueOf(teTunnelTp.getInterLayerLockId()) != null) {
             ttpConfigBuilder = ttpConfigBuilder.interLayerLockId(teTunnelTp.getInterLayerLockId());
@@ -307,27 +267,16 @@
 
         if (teTunnelTp.getTerminationCapabilities() != null) {
             for (TerminationCapability tcap : teTunnelTp.getTerminationCapabilities()) {
-                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                        .ietftetopology.networks.network.node.augmentednwnode.te.tunnelterminationpoint.config
-                                .TerminationCapability.TerminationCapabilityBuilder
-                tcapConfigBuilder = DefaultTerminationCapability.builder();
+                TerminationCapabilityBuilder tcapBuilder = DefaultTerminationCapability
+                        .builder();
                 // FIXME: at this moment, tcap does not have any getter or setter.
                 // add the following getLinkTpId possibly other attributes to Core data structure
                 // tcapConfigBuilder =
                 // tcapConfigBuilder.linkTp(TpId.fromString(tcap.getLinkTpId.toString()));
-                ttpConfigBuilder = ttpConfigBuilder.addToTerminationCapability(tcapConfigBuilder.build());
-
-                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                        .ietftetopology.networks.network.node.augmentednwnode.te.tunnelterminationpoint.state
-                                .TerminationCapability.TerminationCapabilityBuilder tcapStateBuilder =
-                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                        .ietftetopology.networks.network.node.augmentednwnode.te.tunnelterminationpoint.state
-                                .DefaultTerminationCapability.builder();
-                // FIXME: at this moment, tcap does not have any getter or setter.
-                // add the following getLinkTpId possibly other attributes to Core data structure
-                // tcapConfigBuilder =
-                // tcapConfigBuilder.linkTp(TpId.fromString(tcap.getLinkTpId.toString()));
-                ttpStateBuilder = ttpStateBuilder.addToTerminationCapability(tcapStateBuilder.build());
+                ttpConfigBuilder = ttpConfigBuilder
+                        .addToTerminationCapability(tcapBuilder.build());
+                ttpStateBuilder = ttpStateBuilder
+                        .addToTerminationCapability(tcapBuilder.build());
             }
         }
 
@@ -463,11 +412,11 @@
             TerminationPointKey from = new TerminationPointKey(
                                            KeyId.keyId(networkId),
                                            KeyId.keyId(nodeId),
-                                           KeyId.keyId(cmYang.from().tpRef().uri().toString()));
+                                           KeyId.keyId(cmYang.from().tpRef().toString()));
             TerminationPointKey to = new TerminationPointKey(
                                            KeyId.keyId(networkId),
                                            KeyId.keyId(nodeId),
-                                           KeyId.keyId(cmYang.to().tpRef().uri().toString()));
+                                           KeyId.keyId(cmYang.to().tpRef().toString()));
             boolean isAllowed = cmYang.isAllowed();
             org.onosproject.tetopology.management.api.node.ConnectivityMatrix cmTe =
                     new org.onosproject.tetopology.management.api.node.ConnectivityMatrix(
@@ -481,10 +430,10 @@
     private static TeNode yang2TeSubsystemNodeUnderlayTopology(TeNode teNode,
                                                                UnderlayTopology ut) {
         TeNetworkTopologyId underlayTopology =
-                new TeNetworkTopologyId(KeyId.keyId(ut.networkIdRef().uri().toString()),
+                new TeNetworkTopologyId(KeyId.keyId(ut.networkIdRef().toString()),
                 new org.onosproject.tetopology.management.api.TeTopologyId(
-                            ut.providerIdRef().uint32(),
-                            ut.clientIdRef().uint32(),
+                            ((long) ut.providerIdRef()),
+                            ((long) ut.clientIdRef()),
                             ut.teTopologyIdRef().toString()));
         teNode.setUnderlayTopology(underlayTopology);
         return teNode;
diff --git a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/TerminationPointConverter.java b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/TerminationPointConverter.java
index ec74b9e..945ad56 100644
--- a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/TerminationPointConverter.java
+++ b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/TerminationPointConverter.java
@@ -36,29 +36,19 @@
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
                .ietfnetworktopology.networks.network.node.augmentedndnode.terminationpoint
                        .SupportingTerminationPoint;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.terminationpoint.augmentedntterminationpoint.DefaultTe;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.terminationpoint.augmentedntterminationpoint.Te.TeBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.terminationpoint.augmentedntterminationpoint.te.Config;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.terminationpoint.augmentedntterminationpoint.te.DefaultConfig;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.terminationpoint.augmentedntterminationpoint.te.DefaultState;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.terminationpoint.augmentedntterminationpoint.te.State;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.terminationpoint.augmentedntterminationpoint
-                       .te.config.DefaultInterfaceSwitchingCapability;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.terminationpoint.augmentedntterminationpoint
-                       .te.config.InterfaceSwitchingCapability;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTpId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.interfaceswitchingcapabilitylist.DefaultInterfaceSwitchingCapability;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.interfaceswitchingcapabilitylist.InterfaceSwitchingCapability;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
                .ietftetopology.networks.network.node.terminationpoint.AugmentedNtTerminationPoint;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
                .ietftetopology.networks.network.node.terminationpoint.DefaultAugmentedNtTerminationPoint;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.teterminationpointaugment.DefaultTe;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.teterminationpointaugment.DefaultTe.TeBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.teterminationpointaugment.te.Config;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.teterminationpointaugment.te.DefaultConfig;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.teterminationpointaugment.te.DefaultState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.teterminationpointaugment.te.State;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTpId;
 
 import com.google.common.collect.Lists;
 
@@ -132,12 +122,8 @@
         if (teSubsystemTe.interfaceSwitchingCapabilities() != null) {
             for (org.onosproject.tetopology.management.api.node.InterfaceSwitchingCapability teIsc :
                     teSubsystemTe.interfaceSwitchingCapabilities()) {
-                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                    .ietftetopology.networks.network.node.terminationpoint.augmentedntterminationpoint
-                        .te.state.InterfaceSwitchingCapability.InterfaceSwitchingCapabilityBuilder
-                isc = org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
-                          .rev20160708.ietftetopology.networks.network.node.terminationpoint
-                              .augmentedntterminationpoint.te.state.DefaultInterfaceSwitchingCapability.builder();
+                InterfaceSwitchingCapability.InterfaceSwitchingCapabilityBuilder isc =
+                        DefaultInterfaceSwitchingCapability.builder();
                 // FIXME: teIsc at this moment is empty, therefore we cannot
                 // really add its attributes to isc
                 yangStateBuilder.addToInterfaceSwitchingCapability(isc.build());
@@ -197,9 +183,6 @@
                     long interLayerLockId = yangTpAugment.te().config().interLayerLockId();
                     List<org.onosproject.tetopology.management.api.node.InterfaceSwitchingCapability>
                             teIscList = Lists.newArrayList();
-                    // FIXME: the following line is for config. State also has
-                    // similar stuff, but Te Subsystem does not diffrentiate
-                    // between the two
                     if (yangTpAugment.te().config().interfaceSwitchingCapability() != null) {
                         for (InterfaceSwitchingCapability iscConfigYang :
                                 yangTpAugment.te().config().interfaceSwitchingCapability()) {
diff --git a/apps/tenbi/yangmodel/pom.xml b/apps/tenbi/yangmodel/pom.xml
index 6211f7f..c87becf 100644
--- a/apps/tenbi/yangmodel/pom.xml
+++ b/apps/tenbi/yangmodel/pom.xml
@@ -33,12 +33,12 @@
         <dependency>
             <groupId>org.onosproject</groupId>
             <artifactId>onos-yang-maven-plugin</artifactId>
-            <version>1.8</version>
+            <version>1.9</version>
         </dependency>
         <dependency>
             <groupId>org.onosproject</groupId>
             <artifactId>onos-yang-datamodel</artifactId>
-            <version>1.8</version>
+            <version>1.9</version>
         </dependency>
     </dependencies>
 
@@ -47,7 +47,7 @@
            <plugin>
                 <groupId>org.onosproject</groupId>
                 <artifactId>onos-yang-maven-plugin</artifactId>
-                <version>1.8</version>
+                <version>1.9</version>
                 <executions>
                     <execution>
                         <goals>
