Improving the converter utility for YANG to TE Subsystem and vice versa.

Change-Id: I6d82f2dfb09932768121a27f7601690fb6942344
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 fcf24ea..16ea08a 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
@@ -107,6 +107,7 @@
         ymsService.unRegisterService(this, IetfNetworkTopologyService.class);
         ymsService.unRegisterService(this, IetfTeTopologyService.class);
 
+        teTopologyService.removeListener(new InternalTeTopologyListener());
         log.info("Stopped");
     }
 
@@ -117,8 +118,14 @@
         // Get the entire data tree from TE Subsystem core.
         org.onosproject.tetopology.management.api.Networks teNetworks = teTopologyService.networks();
 
+        // Build the sample networks for RESTCONF/YMS integration test
+//        org.onosproject.tetopology.management.api.Networks teNetworks = new DefaultNetworks(DefaultBuilder
+//                .sampleDomain1Networks());
+
         // Convert the TE Subsystem core data into YANG Objects.
-        Networks networks = NetworkConverter.teSubsystem2YangNetworks(teNetworks, OperationType.QUERY);
+        Networks networks = NetworkConverter
+                .teSubsystem2YangNetworks(teNetworks, OperationType.QUERY,
+                                          teTopologyService);
         NetworksState networkStates = NetworkConverter.teSubsystem2YangNetworkStates(teNetworks, OperationType.QUERY);
 
         IetfNetworkOpParam.IetfNetworkBuilder builder = new IetfNetworkOpParam.IetfNetworkBuilder();
@@ -132,6 +139,7 @@
         IetfNetwork result = ietfNetwork.processSubtreeFiltering(
                 (IetfNetworkOpParam) newNetwork,
                 false);
+        log.debug("result is: {}", result);
         return result;
     }
 
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 fc4f9de..3bc16a6 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
@@ -33,6 +33,7 @@
 import org.onosproject.tetopology.management.api.link.ExternalLink;
 import org.onosproject.tetopology.management.api.link.LinkBandwidth;
 import org.onosproject.tetopology.management.api.link.NetworkLink;
+import org.onosproject.tetopology.management.api.link.NetworkLinkEventSubject;
 import org.onosproject.tetopology.management.api.link.NetworkLinkKey;
 import org.onosproject.tetopology.management.api.link.PathElement;
 import org.onosproject.tetopology.management.api.link.TeLink;
@@ -107,7 +108,6 @@
 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.ExternalDomain;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultTeSrlgs;
@@ -251,20 +251,20 @@
 //            attrBuilder = attrBuilder.maxResvLinkBandwidth(teLink.maxResvLinkBandwidth());
 //        }
 
-        UnderlayBuilder builder = DefaultUnderlay.builder();
-        if (teLink.primaryPath() != null) {
-
-            // TODO: what is underlayProtectionType in tePath?
-            // builder = builder.underlayProtectionType(tePath.protectionType());
-
-            builder = te2YangConfigUnderlayPrimaryPath(builder, teLink);
-        }
-
-        if (teLink.backupPaths() != null) {
-            builder = te2YangConfigUnderlayBackupPaths(builder, teLink);
-        }
-
-        attrBuilder = attrBuilder.underlay(builder.build());
+//        UnderlayBuilder builder = DefaultUnderlay.builder();
+//        if (teLink.primaryPath() != null) {
+//
+//            // TODO: what is underlayProtectionType in tePath?
+//            // builder = builder.underlayProtectionType(tePath.protectionType());
+//
+//            builder = te2YangConfigUnderlayPrimaryPath(builder, teLink);
+//        }
+//
+//        if (teLink.backupPaths() != null) {
+//            builder = te2YangConfigUnderlayBackupPaths(builder, teLink);
+//        }
+//
+//        attrBuilder = attrBuilder.underlay(builder.build());
 
         ConfigBuilder yangConfigBuilder = DefaultConfig.builder()
                                                        .teLinkAttributes(attrBuilder.build());
@@ -297,10 +297,10 @@
                     .linkProtectionType(teSubsystem2YangLinkProtectionType(teLink
                             .tunnelProtectionType()));
         }
-        // FIXME: maxBandwidth stuff are array[] in TE but not in yang...
-//        if (teLink.maxLinkBandwidth() != null) {
-//            attrBuilder = attrBuilder.maxLinkBandwidth(teLink.maxLinkBandwidth());
-//        }
+        if (teLink.maxBandwidth() != null) {
+            // maxBandwidth is an array of float[], but in yang is just a big decimal
+            attrBuilder = attrBuilder.maxLinkBandwidth(BigDecimal.valueOf(teLink.maxBandwidth()[0]));
+        }
 //        if (teLink.maxResvLinkBandwidth() != null) {
 //            attrBuilder = attrBuilder.maxResvLinkBandwidth(teLink.maxResvLinkBandwidth());
 //        }
@@ -434,7 +434,7 @@
 
     private static UnderlayBuilder te2YangConfigUnderlayPrimaryPath(
             UnderlayBuilder yangBuilder,
-            TeLink teLink) {
+            TeLink teLink, TeTopologyService teTopologyService) {
 
         org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath tePath = teLink.primaryPath();
 
@@ -458,14 +458,14 @@
                                  .providerIdRef(teLink.underlayTeTopologyId().providerId())
                                  .teTopologyIdRef(teLink.underlayTeTopologyId().topologyId());
 
-        // TODO: get networkRefId from service
-//        pathBuilder = pathBuilder.networkIdRef(networkIdRef);
+        pathBuilder = pathBuilder.networkIdRef(teTopologyService.networkId(teLink.underlayTeTopologyId()));
 
         return yangBuilder.underlayPrimaryPath(pathBuilder.build());
     }
 
     private static UnderlayBuilder te2YangConfigUnderlayBackupPaths(UnderlayBuilder yangBuilder,
-                                                                    TeLink teLink) {
+                                                                    TeLink teLink,
+                                                                    TeTopologyService teTopologyService) {
         List<UnderlayBackupPath> tePaths = teLink.backupPaths();
 
         for (UnderlayBackupPath tePath : tePaths) {
@@ -475,8 +475,8 @@
             pathBuilder = pathBuilder.clientIdRef(teLink.underlayTeTopologyId().clientId())
                                      .providerIdRef(teLink.underlayTeTopologyId().providerId())
                                      .teTopologyIdRef(teLink.underlayTeTopologyId().topologyId());
-            // TODO: find networkIdRef from the service
-//            pathBuilder = pathBuilder.networkIdRef(networkIdRef);
+
+            pathBuilder = pathBuilder.networkIdRef(teTopologyService.networkId(teLink.underlayTeTopologyId()));
 
             for (PathElement backupPathElementTe : tePath.pathElements()) {
                 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
@@ -505,24 +505,35 @@
                                                 Network yangNetwork,
                                                 Networks yangNetworks) {
         TeNodeId teNodeId = findTeNodeId(yangNetwork,
-                                         yangLink.source().sourceNode(),
-                                         yangLink.source().sourceTp());
-        long teNodeIdLong = Ip4Address.valueOf(teNodeId.dottedQuad().string()).toInt();
+                                         yangLink.source().sourceNode());
+        long teNodeIdLong = -1;
+        if (teNodeId != null && teNodeId.dottedQuad() != null) {
+            teNodeIdLong = Ip4Address.valueOf(teNodeId.dottedQuad().string())
+                    .toInt();
+        }
 
         TeLinkTpKey teLinkKey = new TeLinkTpKey(teNodeIdLong,
                                                 findTeTpId(yangNetwork,
                                                            yangLink.source().sourceNode(),
                                                            yangLink.source().sourceTp()));
 
-        TeNodeId teNodeIdDest = findTeNodeId(yangNetwork,
-                                             yangLink.destination().destNode(),
-                                             yangLink.destination().destTp());
-        long teNodeIdDestLong = Ip4Address.valueOf(teNodeIdDest.dottedQuad().string()).toInt();
+        TeNodeId teNodeIdDest = null;
+        if (yangLink.destination() != null) {
+            teNodeIdDest = findTeNodeId(yangNetwork,
+                                        yangLink.destination().destNode());
+        }
+        long teNodeIdDestLong = -1;
+        if (teNodeIdDest != null && teNodeIdDest.dottedQuad() != null) {
+            teNodeIdDestLong = Ip4Address.valueOf(teNodeIdDest.dottedQuad().string()).toInt();
+        }
 
-        TeLinkTpKey peerTeLinkKey = new TeLinkTpKey(teNodeIdDestLong,
-                                                    findTeTpId(yangNetwork,
-                                                               yangLink.destination().destNode(),
-                                                               yangLink.destination().destTp()));
+        TeLinkTpKey peerTeLinkKey = null;
+        if (yangLink.destination() != null) {
+            peerTeLinkKey = new TeLinkTpKey(teNodeIdDestLong,
+                                                        findTeTpId(yangNetwork,
+                                                                   yangLink.destination().destNode(),
+                                                                   yangLink.destination().destTp()));
+        }
 
         TeLinkTpGlobalKey supportTeLinkId = findSupportTeLinkId(yangNetworks, yangLink);
 
@@ -551,9 +562,13 @@
         TeTopologyKey underlayTopologyId = null;
         CommonLinkData teData = null;
 
-        underlayTopologyId = new TeTopologyKey((long) yangLinkAtrr.underlay().underlayPrimaryPath().providerIdRef(),
-                                               (long) yangLinkAtrr.underlay().underlayPrimaryPath().clientIdRef(),
-                                               (long) yangLinkAtrr.underlay().underlayPrimaryPath().teTopologyIdRef());
+        if (yangLinkAtrr != null && yangLinkAtrr.underlay() != null &&
+                yangLinkAtrr.underlay().underlayPrimaryPath() != null) {
+            underlayTopologyId = new
+                    TeTopologyKey((long) yangLinkAtrr.underlay().underlayPrimaryPath().providerIdRef(),
+                                  (long) yangLinkAtrr.underlay().underlayPrimaryPath().clientIdRef(),
+                                  (long) yangLinkAtrr.underlay().underlayPrimaryPath().teTopologyIdRef());
+        }
 
         if (yangLinkAtrr.adminStatus() != null) {
             adminStatus = EnumConverter.yang2TeSubsystemAdminStatus(yangLinkAtrr.adminStatus());
@@ -564,12 +579,18 @@
             flags.set(TeLink.BIT_ABSTRACT);
         }
 
-        ExternalLink externalLink = new ExternalLink(null, yangLinkAtrr.externalDomain().plugId());
+        ExternalLink externalLink = null;
+        if (yangLinkAtrr != null && yangLinkAtrr.externalDomain() != null) {
+            externalLink = new ExternalLink(null, yangLinkAtrr.externalDomain().plugId());
+        }
 
         UnderlayPath underlayPath = null;
         underlayPath = yang2TeSubsystemUnderlayPath(yangLinkAtrr, teNodeIdLong,
                                                     teNodeIdDestLong);
-        Long adminGroup = Long.valueOf(yangLinkAtrr.administrativeGroup().toString());
+        Long adminGroup = null;
+        if (yangLinkAtrr != null && yangLinkAtrr.administrativeGroup() != null) {
+            adminGroup = Long.valueOf(yangLinkAtrr.administrativeGroup().toString());
+        }
         List<Long> interLayerLocks = null; // FIXME: how to find interLayerLocks?
 
         List<UnreservedBandwidth> listOfUnreservedBandwidth = yangLinkAtrr.unreservedBandwidth();
@@ -581,7 +602,9 @@
         }
 
         float[] maxBandwidth = new float[1];
-        maxBandwidth[0] = yangLinkAtrr.maxLinkBandwidth().floatValue();
+        if (yangLinkAtrr.maxLinkBandwidth() != null) {
+            maxBandwidth[0] = yangLinkAtrr.maxLinkBandwidth().floatValue();
+        }
 
         float[] maxAvailLspBandwidth = null; // FIXME: how to find this?
         float[] minAvailLspBandwidth = null; // FIXME: how to find this?
@@ -592,12 +615,18 @@
                 minAvailLspBandwidth,
                 null); // FIXME: how to find odu resource?
         List<Long> srlgs = Lists.newArrayList();
-        for (Srlg srlg : yangLinkAtrr.teSrlgs().value()) {
-            srlgs.add(srlg.uint32());
+        if (yangLinkAtrr.teSrlgs() != null
+                && yangLinkAtrr.teSrlgs().value() != null
+                && !yangLinkAtrr.teSrlgs().value().isEmpty()) {
+            for (Srlg srlg : yangLinkAtrr.teSrlgs().value()) {
+                srlgs.add(srlg.uint32());
+            }
         }
         TePathAttributes teAttributes =
                 new TePathAttributes(yangLinkAtrr.teDefaultMetric(),
-                                     yangLinkAtrr.performanceMetric().measurement().unidirectionalDelay(),
+                                     yangLinkAtrr.performanceMetric() == null ? null :
+                                           (yangLinkAtrr.performanceMetric().measurement() == null ? null :
+                                               yangLinkAtrr.performanceMetric().measurement().unidirectionalDelay()),
                                      srlgs);
         teData = new CommonLinkData(adminStatus,
                                     opStatus,
@@ -621,54 +650,64 @@
                                             Link yangLink) {
         Network teNetworkFound = null;
         LinkId teLinkIdFound = null;
-        for (Network ynetItem : yangNetworks.network()) {
-            if (ynetItem.networkId().equals(yangLink.supportingLink().get(0).networkRef())) {
-                teNetworkFound = ynetItem;
-                teLinkIdFound = yangLink.supportingLink().get(0).linkRef();
-                break;
-            }
-        }
-        Link teLinkFound = null;
-        if (teNetworkFound.yangAugmentedInfo(AugmentedNdNetwork.class) != null) {
-            AugmentedNdNetwork augmentLink =
-                    (AugmentedNdNetwork) teNetworkFound.yangAugmentedInfo(AugmentedNdNetwork.class);
-            for (Link link : augmentLink.link()) {
-                if (link.linkId().equals(teLinkIdFound)) {
-                    teLinkFound = link;
-                    break;
+        TeLinkTpGlobalKey supportTeLinkId = null;
+
+        if (yangLink != null && yangLink.supportingLink() != null && !yangLink.supportingLink().isEmpty()) {
+            if (yangNetworks.network() != null && !yangNetworks.network().isEmpty()) {
+                for (Network ynetItem : yangNetworks.network()) {
+                    if (ynetItem.networkId() != null) {
+                        if (ynetItem.networkId().equals(yangLink.supportingLink().get(0).networkRef())) {
+                            teNetworkFound = ynetItem;
+                            teLinkIdFound = yangLink.supportingLink().get(0).linkRef();
+                            break;
+                        }
+                    }
                 }
             }
-        }
+            Link teLinkFound = null;
+            if (teNetworkFound.yangAugmentedInfo(AugmentedNdNetwork.class) != null) {
+                AugmentedNdNetwork augmentLink =
+                        (AugmentedNdNetwork) teNetworkFound.yangAugmentedInfo(AugmentedNdNetwork.class);
+                for (Link link : augmentLink.link()) {
+                    if (link.linkId().equals(teLinkIdFound)) {
+                        teLinkFound = link;
+                        break;
+                    }
+                }
+            }
 
-        TeNodeId teSupportNodeId = findTeNodeId(teNetworkFound,
+            TeNodeId teSupportNodeId = findTeNodeId(teNetworkFound,
+                                                    teLinkFound.source().sourceNode());
+            long tenIdLong = -1;
+            if (teSupportNodeId != null) {
+                tenIdLong = Ip4Address.valueOf(teSupportNodeId.dottedQuad().string()).toInt();
+            }
+            long teSupportLinkTpId = findTeTpId(teNetworkFound,
                                                 teLinkFound.source().sourceNode(),
                                                 teLinkFound.source().sourceTp());
-        long tenIdLong = Ip4Address.valueOf(teSupportNodeId.dottedQuad().string()).toInt();
-        long teSupportLinkTpId = findTeTpId(teNetworkFound,
-                                            teLinkFound.source().sourceNode(),
-                                            teLinkFound.source().sourceTp());
 
-        org.onosproject.tetopology.management.api.TeTopologyId teTopologyId = null;
-        if (teNetworkFound.yangAugmentedInfo(AugmentedNwNetwork.class) != null) {
-            AugmentedNwNetwork augmentTeIds =
-                    (AugmentedNwNetwork) teNetworkFound.yangAugmentedInfo(AugmentedNwNetwork.class);
-            teTopologyId =
-                    new org.onosproject.tetopology.management.api.TeTopologyId(
-                            augmentTeIds.te().clientId().uint32(),
-                            augmentTeIds.te().providerId().uint32(),
-                            augmentTeIds.te().teTopologyId().string());
+            org.onosproject.tetopology.management.api.TeTopologyId teTopologyId = null;
+            if (teNetworkFound.yangAugmentedInfo(AugmentedNwNetwork.class) != null) {
+                AugmentedNwNetwork augmentTeIds =
+                        (AugmentedNwNetwork) teNetworkFound.yangAugmentedInfo(AugmentedNwNetwork.class);
+                teTopologyId =
+                        new org.onosproject.tetopology.management.api.TeTopologyId(
+                                augmentTeIds.te().clientId().uint32(),
+                                augmentTeIds.te().providerId().uint32(),
+                                augmentTeIds.te().teTopologyId().string());
+            }
+
+            supportTeLinkId = new TeLinkTpGlobalKey(teTopologyId.providerId(),
+                                                    teTopologyId.clientId(),
+                                                    Long.valueOf(teTopologyId
+                                                            .topologyId()),
+                                                    tenIdLong, teSupportLinkTpId);
         }
 
-        TeLinkTpGlobalKey supportTeLinkId = new TeLinkTpGlobalKey(teTopologyId.providerId(),
-                                                teTopologyId.clientId(),
-                                                Long.valueOf(teTopologyId
-                                                        .topologyId()),
-                                                tenIdLong, teSupportLinkTpId);
-
         return supportTeLinkId;
     }
 
-    private static TeNodeId findTeNodeId(Network yangNetwork, NodeId yangNodeId, TpId yangTpId) {
+    private static TeNodeId findTeNodeId(Network yangNetwork, NodeId yangNodeId) {
         TeNodeId teNodeId = null;
         for (Node node : yangNetwork.node()) {
             if (node.nodeId().equals(yangNodeId)) {
@@ -863,24 +902,26 @@
         List<UnderlayBackupPath> underlayBackupPathsList = null;
         TeTunnelId teTunnelId = new TeTunnelId(srcTeNodeId, dstTeNodeId, 0); // FIXME: how to find teTunnelId?
 
-        if (yangLinkAtrr.underlay().underlayPrimaryPath() != null) {
+        if (yangLinkAtrr.underlay() != null && yangLinkAtrr.underlay().underlayPrimaryPath() != null) {
             underlayPrimaryPath =
                     yang2TeSubsystemUnderlayPrimaryPath(yangLinkAtrr.underlay().underlayPrimaryPath(), srcTeNodeId);
         }
 
-        if (yangLinkAtrr.underlay().underlayBackupPath() != null) {
+        if (yangLinkAtrr.underlay() != null && yangLinkAtrr.underlay().underlayBackupPath() != null) {
             underlayBackupPathsList =
                     yang2TeSubsystemUnderlayBackupPaths(yangLinkAtrr.underlay().underlayBackupPath(), srcTeNodeId);
         }
 
-        org.onosproject.tetopology.management.api.link.UnderlayPath teUnderlay =
-                    new org.onosproject.tetopology.management.api.link.
-                    UnderlayPath(underlayPrimaryPath,
-                                 underlayBackupPathsList,
-                                 TunnelProtectionType.of(yangLinkAtrr.underlay().underlayProtectionType()),
-                                 (long) yangLinkAtrr.underlay().underlayTrailSrc().tpRef(), // Is this correct?
-                                 (long) yangLinkAtrr.underlay().underlayTrailDes().tpRef(), // Is this correct?
-                                 teTunnelId);
+        org.onosproject.tetopology.management.api.link.UnderlayPath teUnderlay = null;
+        if (yangLinkAtrr.underlay() != null) {
+            teUnderlay = new org.onosproject.tetopology.management.api.link.
+                        UnderlayPath(underlayPrimaryPath,
+                                     underlayBackupPathsList,
+                                     TunnelProtectionType.of(yangLinkAtrr.underlay().underlayProtectionType()),
+                                     (long) yangLinkAtrr.underlay().underlayTrailSrc().tpRef(), // Is this correct?
+                                     (long) yangLinkAtrr.underlay().underlayTrailDes().tpRef(), // Is this correct?
+                                     teTunnelId);
+        }
 
         return teUnderlay;
     }
@@ -894,30 +935,34 @@
      * @return YANG Object converted from linkData
      */
     public static TeLinkEvent teNetworkLink2yangTeLinkEvent(TeTopologyEventTypeEnum eventType,
-                                                            NetworkLink linkData) {
+                                                            NetworkLinkEventSubject linkData) {
         TeLinkEvent.TeLinkEventBuilder builder = new DefaultTeLinkEvent.TeLinkEventBuilder();
 
         TeTopologyEventType yangEventType = new TeTopologyEventType(eventType);
         builder.eventType(yangEventType);
-        LinkId linkId = LinkId.fromString(linkData.linkId().toString());
+        NetworkId newtorkId = NetworkId.fromString(linkData.key().networkId().toString());
+        builder.networkRef(newtorkId);
+        LinkId linkId = LinkId.fromString(linkData.key().linkId().toString());
         builder.linkRef(linkId);
 
-        TeLinkAttributes teLinkAttributes = teLink2YangConfig(linkData.teLink()).teLinkAttributes();
+        NetworkLink link = linkData.networkLink();
+        TeLinkAttributes teLinkAttributes = link == null ? null
+                                                         : teLink2YangConfig(link.teLink()).teLinkAttributes();
         builder.teLinkAttributes(teLinkAttributes);
 
         return builder.build();
     }
 
     public static NetworkLinkKey yangLinkEvent2NetworkLinkKey(TeLinkEvent yangLinkEvent) {
-        //TODO: Implementation will be submitted as a separate review
-        NetworkId networkRef = (NetworkId) (yangLinkEvent.networkRef());
-        LinkId linkRef = (LinkId) (yangLinkEvent.linkRef());
+        NetworkId networkRef = NetworkId.fromString(yangLinkEvent.networkRef().toString());
+        LinkId linkRef = LinkId.fromString(yangLinkEvent.linkRef().toString());
         KeyId networkId = KeyId.keyId(networkRef.uri().toString());
         KeyId linkId = KeyId.keyId(linkRef.uri().toString());
 
         NetworkLinkKey networkLinkKey = new NetworkLinkKey(networkId, linkId);
 
         return networkLinkKey;
+
     }
 
     public static NetworkLink yangLinkEvent2NetworkLink(TeLinkEvent yangLinkEvent,
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 f87b0b1..e1e2e01 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
@@ -20,8 +20,12 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.tetopology.management.api.KeyId;
 import org.onosproject.tetopology.management.api.TeTopologyEvent;
+import org.onosproject.tetopology.management.api.TeTopologyKey;
+import org.onosproject.tetopology.management.api.TeTopologyService;
 import org.onosproject.tetopology.management.api.link.NetworkLink;
+import org.onosproject.tetopology.management.api.link.NetworkLinkEventSubject;
 import org.onosproject.tetopology.management.api.node.NetworkNode;
+import org.onosproject.tetopology.management.api.node.NetworkNodeEventSubject;
 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;
@@ -150,12 +154,14 @@
      * Networks object conversion from TE Topology subsystem to YANG.
      *
      * @param teSubsystem TE Topology subsystem networks object
-     * @param operation   operation type
+     * @param operation operation type
+     * @param teTopologyService teTopology core service
      * @return Networks YANG object
      */
     public static Networks teSubsystem2YangNetworks(
             org.onosproject.tetopology.management.api.Networks teSubsystem,
-            OperationType operation) {
+                                                    OperationType operation,
+                                                    TeTopologyService teTopologyService) {
         checkNotNull(teSubsystem, E_NULL_TE_NETWORKS);
         checkNotNull(teSubsystem.networks(), E_NULL_TE_NETWORK_LIST);
         Networks.NetworksBuilder builder =
@@ -163,7 +169,8 @@
                         .yangNetworksOpType(toNetworksOperationType(operation));
         List<Network> networks = Lists.newArrayList();
         for (org.onosproject.tetopology.management.api.Network teNetwork : teSubsystem.networks()) {
-            networks.add(teSubsystem2YangNetwork(teNetwork, operation));
+            networks.add(teSubsystem2YangNetwork(teNetwork, operation,
+                                                 teTopologyService));
         }
         builder.network(networks);
         return builder.build();
@@ -258,11 +265,15 @@
     }
 
     private static NetworkBuilder te2YangNodes(NetworkBuilder builder,
-                                               Map<KeyId, NetworkNode> teNodes) {
+                                               Map<KeyId, NetworkNode> teNodes,
+                                               TeTopologyService teTopologyService,
+                                               TeTopologyKey teTopologyKey) {
         List<Node> nodeList = Lists.newArrayList();
 
         for (org.onosproject.tetopology.management.api.node.NetworkNode node : teNodes.values()) {
-            nodeList.add(NodeConverter.teSubsystem2YangNode(node));
+            nodeList.add(NodeConverter.teSubsystem2YangNode(node,
+                                                            teTopologyService,
+                                                            teTopologyKey));
         }
         return builder.node(nodeList);
     }
@@ -317,12 +328,14 @@
      * Network object conversion from TE Topology subsystem to YANG.
      *
      * @param teSubsystem TE Topology subsystem network object
-     * @param operation   operation type
+     * @param operation operation type
+     * @param teTopologyService teTopology core service
      * @return Network YANG object
      */
     public static Network teSubsystem2YangNetwork(
             org.onosproject.tetopology.management.api.Network teSubsystem,
-            OperationType operation) {
+                                                  OperationType operation,
+                                                  TeTopologyService teTopologyService) {
         checkNotNull(teSubsystem, E_NULL_TE_NETWORK);
         checkNotNull(teSubsystem.networkId(), E_NULL_TE_NETWORKID);
 
@@ -340,7 +353,13 @@
 
         // Nodes
         if (teSubsystem.nodes() != null) {
-            builder = te2YangNodes(builder, teSubsystem.nodes());
+            org.onosproject.tetopology.management.api.Network nt = teTopologyService.network(teSubsystem.networkId());
+            TeTopologyKey teTopoKey = new TeTopologyKey(nt.teTopologyId().providerId(),
+                                                        nt.teTopologyId().clientId(),
+                                                        Long.valueOf(nt.teTopologyId().topologyId()));
+            builder = te2YangNodes(builder, teSubsystem.nodes(),
+                                   teTopologyService,
+                                   teTopoKey);
         }
 
         // Network types
@@ -452,8 +471,8 @@
                     (AugmentedNwNetwork) yangNetwork.yangAugmentedInfo(AugmentedNwNetwork.class);
             teTopologyId =
                     new org.onosproject.tetopology.management.api.TeTopologyId(
-                            augmentTeIds.te().clientId().uint32(),
                             augmentTeIds.te().providerId().uint32(),
+                            augmentTeIds.te().clientId().uint32(),
                             augmentTeIds.te().teTopologyId().string());
         }
 
@@ -517,13 +536,13 @@
 
         IetfTeTopologyEvent.Type yangEventType = teTopoEventType2YangIetfTopoEventType(event.type());
         if (yangEventType == IetfTeTopologyEvent.Type.TE_LINK_EVENT) {
-            NetworkLink eventData = (NetworkLink) event.subject();
+            NetworkLinkEventSubject eventData = (NetworkLinkEventSubject) event.subject();
             TeTopologyEventTypeEnum linkEventType = teTopoEventType2YangTeTopoEventType(event.type());
             TeLinkEvent yangLinkEvent = LinkConverter.teNetworkLink2yangTeLinkEvent(linkEventType, eventData);
             eventSubject.teLinkEvent(yangLinkEvent);
             yangEvent = new IetfTeTopologyEvent(IetfTeTopologyEvent.Type.TE_LINK_EVENT, eventSubject);
         } else if (yangEventType == IetfTeTopologyEvent.Type.TE_NODE_EVENT) {
-            NetworkNode eventData = (NetworkNode) event.subject();
+            NetworkNodeEventSubject eventData = (NetworkNodeEventSubject) event.subject();
             TeTopologyEventTypeEnum nodeEventType = teTopoEventType2YangTeTopoEventType(event.type());
             TeNodeEvent yangNodeEvent = NodeConverter.teNetworkNode2yangTeNodeEvent(nodeEventType, eventData);
             eventSubject.teNodeEvent(yangNodeEvent);
@@ -571,7 +590,10 @@
                 returnType = TeTopologyEventTypeEnum.UPDATE;
                 break;
             default:
-                log.error("teTopoEventType2YangTeTopoEventType: unknown type: {}", type);
+                // log.warn("teTopoEventType2YangIetfTopoEventType: unsupported
+                // type: {}",
+                // type);
+            break;
         }
 
         return returnType;
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 4874af2..26255f8 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
@@ -17,11 +17,11 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import java.nio.ByteBuffer;
 import java.util.BitSet;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.collections.MapUtils;
 import org.onlab.packet.Ip4Address;
 import org.onosproject.tetopology.management.api.EncodingType;
 import org.onosproject.tetopology.management.api.KeyId;
@@ -30,7 +30,10 @@
 import org.onosproject.tetopology.management.api.TeTopologyKey;
 import org.onosproject.tetopology.management.api.TeTopologyService;
 import org.onosproject.tetopology.management.api.link.ElementType;
+import org.onosproject.tetopology.management.api.link.NetworkLink;
+import org.onosproject.tetopology.management.api.link.NetworkLinkKey;
 import org.onosproject.tetopology.management.api.link.TeLinkId;
+import org.onosproject.tetopology.management.api.link.TeLinkTpGlobalKey;
 import org.onosproject.tetopology.management.api.link.TePathAttributes;
 import org.onosproject.tetopology.management.api.link.UnderlayAbstractPath;
 import org.onosproject.tetopology.management.api.node.CommonNodeData;
@@ -39,6 +42,7 @@
 import org.onosproject.tetopology.management.api.node.DefaultTeNode;
 import org.onosproject.tetopology.management.api.node.LocalLinkConnectivity;
 import org.onosproject.tetopology.management.api.node.NetworkNode;
+import org.onosproject.tetopology.management.api.node.NetworkNodeEventSubject;
 import org.onosproject.tetopology.management.api.node.NetworkNodeKey;
 import org.onosproject.tetopology.management.api.node.TeNode;
 import org.onosproject.tetopology.management.api.node.TeNodeKey;
@@ -55,8 +59,7 @@
                .ietfnetwork.networks.network.node.DefaultSupportingNode;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
                .ietfnetwork.networks.network.node.SupportingNode;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology.networks.network.AugmentedNdNetwork;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology.networks.network.augmentedndnetwork.Link;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology.TpId;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
                .ietfnetworktopology.networks.network.node.AugmentedNdNode;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
@@ -71,6 +74,7 @@
                .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.terminationpoint.AugmentedNtTerminationPoint;
 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;
@@ -97,6 +101,7 @@
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyEventType;
 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.tetopologyeventtype.TeTopologyEventTypeEnum;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev20130715.ietfyangtypes.DottedQuad;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -123,9 +128,10 @@
      * TE Node Config object conversion from TE Topology subsystem to YANG.
      *
      * @param teSubsystemTeNode TE node object
+     * @param teTopologyService teTopolog core service
      * @return TE Node Config YANG object
      */
-    private static Config teNode2YangConfig(TeNode teSubsystemTeNode) {
+    private static Config teNode2YangConfig(TeNode teSubsystemTeNode, TeTopologyService teTopologyService) {
         checkNotNull(teSubsystemTeNode, E_NULL_TE_SUBSYSTEM_TE_NODE);
 
         TeNodeAttributes.TeNodeAttributesBuilder teNodeAttributesConfigBuilder = DefaultTeNodeAttributes
@@ -147,7 +153,7 @@
         if (teSubsystemTeNode.underlayTeTopologyId() != null) {
             teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
                     .underlayTopology(teNode2YangUnderlay(teSubsystemTeNode
-                            .underlayTeTopologyId()));
+                            .underlayTeTopologyId(), teTopologyService));
         }
 
         // TODO: should we ignore this from te to yang? as we've already set yang supportingNode
@@ -178,11 +184,11 @@
                                .get(ConnectivityMatrix.BIT_DISALLOWED))
                     .from(new DefaultFrom.FromBuilder() // TODO: for now, assuming that there is
                                                         // only one 'from', and mergingList is empty
-                          .tpRef(teCmEntry.getValue().from())
+                          .tpRef(((TeLinkId) teCmEntry.getValue().from()).value())
                                          .build())
                     .to(new DefaultTo.ToBuilder() // TODO: for now, assuming that there is only
                                                   // one item in constrainingElements list
-                          .tpRef(teCmEntry.getValue().constrainingElements().get(0))
+                          .tpRef(((TeLinkId) teCmEntry.getValue().constrainingElements().get(0)).value())
                                          .build());
             teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
                     .addToConnectivityMatrix(connectivityMatrixConfigBuilder
@@ -191,15 +197,17 @@
         return teNodeAttributesConfigBuilder;
     }
 
-    private static UnderlayTopology teNode2YangUnderlay(TeTopologyKey underlayTopology) {
+    private static UnderlayTopology teNode2YangUnderlay(TeTopologyKey underlayTopology,
+                                                        TeTopologyService teTopologyService) {
         UnderlayTopology.UnderlayTopologyBuilder underlayBuilder = DefaultUnderlayTopology
                 .builder()
                 .teTopologyIdRef(TeTopologyId
                         .fromString(String.valueOf(underlayTopology.topologyId())))
                 .clientIdRef(underlayTopology.clientId())
                 .providerIdRef(underlayTopology.providerId());
-        // TODO: find networkId from the service
-//                .networkIdRef(networkIdRef)
+
+        underlayBuilder = underlayBuilder.networkIdRef(teTopologyService.networkId(underlayTopology));
+
         return underlayBuilder.build();
     }
 
@@ -207,9 +215,10 @@
      * TE Node State object conversion from TE Topology subsystem to YANG.
      *
      * @param teSubsystemTeNode TE node object
+     * @param teTopologyService teTopology core service
      * @return TE Node State YANG object
      */
-    private static State teNode2YangState(TeNode teSubsystemTeNode) {
+    private static State teNode2YangState(TeNode teSubsystemTeNode, TeTopologyService teTopologyService) {
         checkNotNull(teSubsystemTeNode, E_NULL_TE_SUBSYSTEM_TE_NODE);
 
         TeNodeAttributes
@@ -231,7 +240,7 @@
         if (teSubsystemTeNode.underlayTeTopologyId() != null) {
             teNodeAttributesStateBuilder = teNodeAttributesStateBuilder
                     .underlayTopology(teNode2YangUnderlay(teSubsystemTeNode
-                            .underlayTeTopologyId()));
+                            .underlayTeTopologyId(), teTopologyService));
         }
 
         if (teSubsystemTeNode.connectivityMatrices() != null) {
@@ -269,17 +278,25 @@
     }
 
     private static class ByteUtils {
-        private static ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
 
         public static byte[] longToBytes(long x) {
-            buffer.putLong(0, x);
-            return buffer.array();
+            long temp = x;
+            byte[] b = new byte[8];
+            for (int i = 0; i < b.length; i++) {
+                b[i] = new Long(temp & 0xff).byteValue();
+                temp = temp >> 8;
+            }
+            return b;
         }
 
         public static long bytesToLong(byte[] bytes) {
-            buffer.put(bytes, 0, bytes.length);
-            buffer.flip(); // need flip
-            return buffer.getLong();
+            return ((long) bytes[7] & 255L) << 56
+                    | ((long) bytes[6] & 255L) << 48
+                    | ((long) bytes[5] & 255L) << 40
+                    | ((long) bytes[4] & 255L) << 32
+                    | ((long) bytes[3] & 255L) << 24
+                    | ((long) bytes[2] & 255L) << 16
+                    | ((long) bytes[1] & 255L) << 8 | (long) bytes[0] & 255L;
         }
     }
 
@@ -287,11 +304,16 @@
      * TE Node TunnelTerminationPoint object conversion from TE Topology subsystem to YANG.
      *
      * @param teTunnelTp TE TunnelTerminationPoint object
+     * @param teTpId
+     * @param teTopologyService
+     * @param teNodeKey
      * @return TunnelTerminationPoint YANG object
      */
     private static TunnelTerminationPoint teSubsystem2YangTtp(
                            org.onosproject.tetopology.management.api.node
-                           .TunnelTerminationPoint teTunnelTp, Long teTpId) {
+                           .TunnelTerminationPoint teTunnelTp, Long teTpId,
+                           TeTopologyService teTopologyService,
+                           TeNodeKey teNodeKey) {
         checkNotNull(teTunnelTp, E_NULL_TE_SUBSYSTEM_TE_TUNNEL_TP);
 
         TunnelTerminationPoint.TunnelTerminationPointBuilder tunnelTpBuilder =
@@ -317,13 +339,38 @@
         // TODO: retrieve more attributes from teTunnelTp and assign to tcapConfigBuilder.
         // For which ones we can do the conversion?
         // FIXME: once new yang model is used, we can make llc from teTunnelTp.localLinkConnectivityList()
-        ttpConfigBuilder = ttpConfigBuilder.addToTerminationCapability(tcapConfigBuilder.build());
+        if (teTunnelTp.localLinkConnectivityList() != null && !teTunnelTp.localLinkConnectivityList().isEmpty()) {
+            for (LocalLinkConnectivity llcn : teTunnelTp.localLinkConnectivityList()) {
+                TeLinkId telinkId = (TeLinkId) llcn.constrainingElements().get(0);
+                TeLinkTpGlobalKey globalKey = new TeLinkTpGlobalKey(teNodeKey, telinkId.value());
+                NetworkLinkKey netLinkKey = teTopologyService.linkKey(globalKey);
+                NetworkLink networkLink = teTopologyService
+                        .network(netLinkKey.networkId()).links().get(netLinkKey.linkId());
+                tcapConfigBuilder = tcapConfigBuilder
+                        .linkTp(TpId.fromString(networkLink.source().tpId()
+                                .toString()));
+                // convert teLinkId to networkLinkKey
+                ttpConfigBuilder = ttpConfigBuilder.addToTerminationCapability(tcapConfigBuilder.build());
+            }
 
-        TerminationCapability.TerminationCapabilityBuilder tcapStateBuilder =
-                DefaultTerminationCapability.builder();
-        // TODO: retrieve more attributes from teTunnelTp and assign to tcapStateBuilder
-        // For which ones we can do the conversion?
-        ttpStateBuilder = ttpStateBuilder.addToTerminationCapability(tcapStateBuilder.build());
+            // TODO: retrieve teTunnelTp.switchingLayer() and set it to  ttpConfigBuilder
+
+            TerminationCapability.TerminationCapabilityBuilder tcapStateBuilder =
+                    DefaultTerminationCapability.builder();
+            // TODO: retrieve more attributes from teTunnelTp and assign to tcapStateBuilder
+            // For which ones we can do the conversion?
+            for (LocalLinkConnectivity llcn : teTunnelTp.localLinkConnectivityList()) {
+                TeLinkId telinkId = (TeLinkId) llcn.constrainingElements().get(0);
+                TeLinkTpGlobalKey globalKey = new TeLinkTpGlobalKey(teNodeKey, telinkId.value());
+                NetworkLinkKey netLinkKey = teTopologyService.linkKey(globalKey);
+                NetworkLink networkLink = teTopologyService
+                        .network(netLinkKey.networkId()).links().get(netLinkKey.linkId());
+                tcapStateBuilder = tcapStateBuilder
+                        .linkTp(TpId.fromString(networkLink.source().tpId()
+                                .toString()));
+                ttpStateBuilder = ttpStateBuilder.addToTerminationCapability(tcapStateBuilder.build());
+            }
+        }
 
         tunnelTpBuilder = tunnelTpBuilder.config(ttpConfigBuilder.build())
                                          .state(ttpStateBuilder.build());
@@ -335,12 +382,17 @@
      * Node object conversion from TE Topology subsystem to YANG.
      *
      * @param teSubsystem TE subsystem node
+     * @param teTopologyService teTopology core service
+     * @param teTopologyKey teTopologyKey
      * @return YANG node
      */
-    public static Node teSubsystem2YangNode(org.onosproject.tetopology.management.api.node.NetworkNode teSubsystem) {
+    public static Node teSubsystem2YangNode(org.onosproject.tetopology.management.api.node.NetworkNode teSubsystem,
+                                            TeTopologyService teTopologyService,
+                                            TeTopologyKey teTopologyKey) {
         checkNotNull(teSubsystem, E_NULL_TE_SUBSYSTEM_NODE);
 
         NodeId nodeId = NodeId.fromString(teSubsystem.nodeId().toString());
+
         Node.NodeBuilder builder = DefaultNode.builder().nodeId(nodeId);
 
         if (teSubsystem.supportingNodeIds() != null) {
@@ -379,20 +431,22 @@
 
             TeBuilder yangTeBuilder = DefaultTe.builder();
 
-            yangTeBuilder = yangTeBuilder.teNodeId(TeNodeId
-                    .fromString(String.valueOf(teSubsystemTeNode.teNodeId())));
+            yangTeBuilder = yangTeBuilder.teNodeId(TeNodeId.of(DottedQuad
+                    .of(Ip4Address.valueOf((int) teSubsystemTeNode.teNodeId())
+                            .toString())));
 
             // Set configuration data
             // Set state data
-            yangTeBuilder = yangTeBuilder.config(teNode2YangConfig(teSubsystemTeNode))
-                                         .state(teNode2YangState(teSubsystemTeNode));
+            yangTeBuilder = yangTeBuilder.config(teNode2YangConfig(teSubsystemTeNode, teTopologyService))
+                                         .state(teNode2YangState(teSubsystemTeNode, teTopologyService));
 
             if (teSubsystemTeNode.tunnelTerminationPoints() != null) {
                 for (Map.Entry<Long, org.onosproject.tetopology.management.api.node.TunnelTerminationPoint> entry :
                         teSubsystemTeNode.tunnelTerminationPoints().entrySet()) {
                     yangTeBuilder = yangTeBuilder
                             .addToTunnelTerminationPoint(teSubsystem2YangTtp(entry
-                                    .getValue(), entry.getKey()));
+                                    .getValue(), entry.getKey(), teTopologyService,
+                                    new TeNodeKey(teTopologyKey, teSubsystemTeNode.teNodeId())));
                 }
             }
 
@@ -469,14 +523,14 @@
                 .topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.
                 ConnectivityMatrix cmYang : yangMatrix) {
 
-            ElementType from = new TeLinkId((long) cmYang.from().tpRef()); // is this correct?
+            ElementType from = new TeLinkId(Long.valueOf(((String) cmYang.from().tpRef()))); // is this correct?
 
             UnderlayAbstractPath underlayPath = null; // ignore
 
             List<ElementType> mergingList = Lists.newArrayList(); // empty merging list for now
 
             List<ElementType> constrainingElements = Lists.newArrayList();
-            ElementType to = new TeLinkId((long) cmYang.to().tpRef()); // is this correct?
+            ElementType to = new TeLinkId(Long.valueOf(((String) cmYang.to().tpRef()))); // is this correct?
             constrainingElements.add(to);
 
             BitSet flags = new BitSet(); // what are the flags in cmYang?
@@ -489,7 +543,9 @@
             }
             TePathAttributes teAttributes = new
                     TePathAttributes(cmYang.teDefaultMetric(),
-                                     cmYang.performanceMetric().measurement().unidirectionalDelay(),
+                                     cmYang.performanceMetric() == null ? null :
+                                         (cmYang.performanceMetric().measurement() == null ? null :
+                                             cmYang.performanceMetric().measurement().unidirectionalDelay()),
                                      srlgs);
             ConnectivityMatrix coreCm = new ConnectivityMatrix(cmYang.id(),
                                                                from,
@@ -508,13 +564,13 @@
     private static TeTopologyKey yang2TeSubsystemNodeUnderlayTopology(UnderlayTopology ut) {
         TeTopologyKey tetopokey = new TeTopologyKey((Long) ut.providerIdRef(),
                                                     (Long) ut.clientIdRef(),
-                                                    (Long) ut.teTopologyIdRef());
+                                                    Long.valueOf((String) ut.teTopologyIdRef()));
         return tetopokey;
     }
 
     // TODO: retrieve the details of tunnel termiantion points from yang to te
     private static Map<Long, org.onosproject.tetopology.management.api.node.
-                      TunnelTerminationPoint> yang2TeSubsystemTtp(List<TunnelTerminationPoint> ttps) {
+                      TunnelTerminationPoint> yang2TeSubsystemTtp(List<TunnelTerminationPoint> ttps, Node yangNode) {
         Map<Long, org.onosproject.tetopology.management.api.node.TunnelTerminationPoint> ttpsMap = Maps
                 .newHashMap();
         for (TunnelTerminationPoint ttpYang : ttps) {
@@ -523,14 +579,57 @@
             EncodingType encodingLayer = null; // TODO: find proper encoding type from ttpYang.config().encoding();
             BitSet flags = new BitSet(); // how to set flags?
             List<Long> interLayerLockList = Lists.newArrayList();
-            interLayerLockList.add(ttpYang.config().interLayerLockId()); // interLayerLock in yang is not a list
+
+            if (ttpYang.config() != null) {
+                interLayerLockList.add(ttpYang.config().interLayerLockId()); // interLayerLock in yang is not a list
+            }
 
             List<LocalLinkConnectivity> localLinkConnectivityList = Lists.newArrayList();
             // FIXME: once new yang model is used, we can make llc
-//            LocalLinkConnectivity llc = new LocalLinkConnectivity(constrainingElements,
-//                                                                  flags,
-//                                                                  teAttributes,
-//                                                                  underlayPath)
+            ElementType elt = null;
+            List<ElementType> eltList = Lists.newArrayList();
+
+            if (ttpYang.config() != null
+                    && ttpYang.config().terminationCapability() != null
+                    && !ttpYang.config().terminationCapability().isEmpty()) {
+                for (TerminationCapability tercap : ttpYang.config()
+                        .terminationCapability()) {
+
+                    if (yangNode.yangAugmentedInfoMap() != null
+                            && !yangNode.yangAugmentedInfoMap().isEmpty()) {
+
+                        AugmentedNdNode yangTpNodeAugment = (AugmentedNdNode) yangNode
+                                .yangAugmentedInfo(AugmentedNdNode.class);
+                        for (org.onosproject.yang.gen.v1.urn.ietf.params.xml
+                                .ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
+                                .networks.network.node.augmentedndnode
+                                .TerminationPoint tpItem : yangTpNodeAugment.terminationPoint()) {
+                            if (tpItem.tpId().uri().string().equals(tercap.linkTp().toString())) {
+                                if (tpItem.yangAugmentedInfoMap() != null
+                                        && !tpItem.yangAugmentedInfoMap().isEmpty()) {
+                                    AugmentedNtTerminationPoint yangTpAugment =
+                                            (AugmentedNtTerminationPoint) tpItem
+                                            .yangAugmentedInfo(AugmentedNtTerminationPoint.class);
+                                    if (yangTpAugment.te() != null && yangTpAugment.te().teTpId() != null) {
+                                        elt = new TeLinkId(Long.valueOf(yangTpAugment.te().teTpId().toString()));
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    eltList.add(elt);
+//                    tercap.linkTp().toString() //tpId -> tp -> te-tp-id (long)
+                }
+            }
+            TePathAttributes teAttributes = null; // how to find these
+                                                  // attributes from ttpYang?
+            UnderlayAbstractPath underlayPath = null; // how to find underlayAbstractPath from ttpYang?
+            LocalLinkConnectivity llc = new LocalLinkConnectivity(eltList,
+                                                                  flags,
+                                                                  teAttributes,
+                                                                  underlayPath);
+            localLinkConnectivityList.add(llc);
 
             float[] availAdaptBandwidth = null; // how to find availableBandwidth?
 
@@ -554,7 +653,7 @@
     private static TeNode yang2TeSubsystemNodeAugment(Te yangNodeAugTe,
                                                       Network yangNetwork,
                                                       Node yangNode,
-                                                      Map<KeyId, TerminationPoint> yangTps) {
+                                                      Map<KeyId, TerminationPoint> teTps) {
 
 
         NodeId yangNodeId = yangNode.nodeId();
@@ -580,12 +679,10 @@
         List<Long> teTpIds = Lists.newArrayList();
 
         // ********************************************** to find teLinkIds
-        if (yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class) != null) {
-            AugmentedNdNetwork augmentLink =
-                    (AugmentedNdNetwork) yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class);
-            for (Link link : augmentLink.link()) {
-                if (link.source().sourceNode().equals(yangNodeAugTe.teNodeId())) {
-                    teLinkIds.add(Long.valueOf(link.linkId().uri().string()));
+        if (MapUtils.isNotEmpty(teTps)) {
+            for (Map.Entry<KeyId, TerminationPoint> entry : teTps.entrySet()) {
+                if (entry.getValue().teTpId() != null) {
+                    teTpIds.add(entry.getValue().teTpId());
                 }
             }
         }
@@ -622,7 +719,7 @@
                     flags.set(TeNode.BIT_ABSTRACT);
                 }
                 teData = new CommonNodeData(
-                                            teNodeAttr.name().string(),
+                                            null, // teNodeAttr.name().string(),
                                             EnumConverter.yang2TeSubsystemAdminStatus(teNodeAttr.adminStatus()),
                                             EnumConverter.yang2TeSubsystemOpStatus(yangNodeAugTe.state().operStatus()),
                                             flags);
@@ -637,7 +734,7 @@
         }
 
         if (yangNodeAugTe.tunnelTerminationPoint() != null) {
-            ttps = yang2TeSubsystemTtp(yangNodeAugTe.tunnelTerminationPoint());
+            ttps = yang2TeSubsystemTtp(yangNodeAugTe.tunnelTerminationPoint(), yangNode);
         }
 
         TeNode teNode = new DefaultTeNode(teNodeId,
@@ -668,26 +765,30 @@
     }
 
     /**
-     * Converts a TE Topology node event from the data format used in
-     * the core to its corresponding YANG Object (YO) format.
+     * Converts a TE Topology node event from the data format used in the core
+     * to its corresponding YANG Object (YO) format.
      *
      * @param eventType Node event type
-     * @param nodeData  TE Topology node event data
+     * @param eventData  TE Topology node event data
      * @return YANG Object converted from nodeData
      */
     public static TeNodeEvent teNetworkNode2yangTeNodeEvent(TeTopologyEventTypeEnum eventType,
-                                                            NetworkNode nodeData) {
+                                                            NetworkNodeEventSubject eventData) {
         TeNodeEvent.TeNodeEventBuilder builder = new DefaultTeNodeEvent.TeNodeEventBuilder();
 
         TeTopologyEventType yangEventType = new TeTopologyEventType(eventType);
         builder.eventType(yangEventType);
 
-        NodeId nodeId = NodeId.fromString(nodeData.nodeId().toString());
+        NetworkId newtorkId = NetworkId.fromString(eventData.key().networkId().toString());
+        builder.networkRef(newtorkId);
+        NodeId nodeId = NodeId.fromString(eventData.key().nodeId().toString());
         builder.nodeRef(nodeId);
 
+        NetworkNode node = eventData.neworkNode();
         org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
                 rev20160708.ietftetopology.tenodeconfigattributesnotification.
-                TeNodeAttributes teNodeAttributes = teNode2YangTeNodeAttributes(nodeData.teNode());
+                TeNodeAttributes teNodeAttributes = node == null ? null
+                                                                 : teNode2YangTeNodeAttributes(node.teNode());
         builder.teNodeAttributes(teNodeAttributes);
 
         return builder.build();
@@ -744,10 +845,8 @@
     }
 
     public static NetworkNodeKey yangNodeEvent2NetworkNodeKey(TeNodeEvent yangNodeEvent) {
-        //TODO: implementation to be submitted as separate review
-
-        NetworkId networkRef = (NetworkId) (yangNodeEvent.networkRef());
-        NodeId nodeRef = (NodeId) (yangNodeEvent.nodeRef());
+        NetworkId networkRef = NetworkId.fromString(yangNodeEvent.networkRef().toString());
+        NodeId nodeRef = NodeId.fromString(yangNodeEvent.nodeRef().toString());
         KeyId networkId = KeyId.keyId(networkRef.uri().toString());
         KeyId nodeId = KeyId.keyId(nodeRef.uri().toString());
 
@@ -756,10 +855,15 @@
         return networkNodeKey;
     }
 
+    /**
+     * Converts YangNode event to NetworkNode.
+     *
+     * @param yangNodeEvent yangNodeEvent
+     * @param teTopologyService teTopologyService
+     * @return NetworkNode
+     */
     public static NetworkNode yangNodeEvent2NetworkNode(TeNodeEvent yangNodeEvent,
                                                         TeTopologyService teTopologyService) {
-        //TODO: implementation to be submitted as separate review
-
         KeyId networkNodeId = yangNodeEvent2NetworkNodeKey(yangNodeEvent).nodeId();
 
         org.onosproject.tetopology.management.api.Network network = teTopologyService.network(
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 18ac803..56bbad2 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
@@ -78,6 +78,7 @@
         checkNotNull(teSubsystem, E_NULL_TE_SUBSYSTEM_TP);
 
         TpId tpId = TpId.fromString(teSubsystem.tpId().toString());
+//        TpId tpId = TpId.fromString("0");
         TerminationPoint.TerminationPointBuilder builder =
                 new DefaultTerminationPoint.TerminationPointBuilder().tpId(tpId);
 
@@ -102,11 +103,11 @@
 
             yangTeBuilder = yangTeBuilder.teTpId(TeTpId.fromString((String.valueOf(teSubsystem.teTpId()))));
 
-            Config yConfig = teSubsystem2YangTeAugConfig(teSubsystem);
-            yangTeBuilder = yangTeBuilder.config(yConfig);
-
-            State yState = teSubsystem2YangTeAugState(teSubsystem);
-            yangTeBuilder = yangTeBuilder.state(yState);
+//            Config yConfig = teSubsystem2YangTeAugConfig(teSubsystem);
+//            yangTeBuilder = yangTeBuilder.config(yConfig);
+//
+//            State yState = teSubsystem2YangTeAugState(teSubsystem);
+//            yangTeBuilder = yangTeBuilder.state(yState);
 
             tpAugmentBuilder = tpAugmentBuilder.te(yangTeBuilder.build());
             builder.addYangAugmentedInfo(tpAugmentBuilder.build(), AugmentedNtTerminationPoint.class);
@@ -184,7 +185,8 @@
         tp = new org.onosproject.tetopology.management.api.node
                 .DefaultTerminationPoint(KeyId.keyId(yangTp.tpId().uri().string()),
                                          spTps,
-                                         Long.valueOf(teTpId.toString()));
+                                         teTpId == null ? null : Long.valueOf(teTpId.toString()));
+
         return tp;
     }
 
diff --git a/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/link/DefaultTeLink.java b/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/link/DefaultTeLink.java
index 72e713f..655ef43 100644
--- a/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/link/DefaultTeLink.java
+++ b/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/link/DefaultTeLink.java
@@ -167,7 +167,7 @@
     }
 
     @Override
-    public long cost() {
+    public Long cost() {
         if (teData == null || teData.teAttributes() == null) {
             return TeConstants.NIL_LONG_VALUE;
         }
@@ -175,7 +175,7 @@
     }
 
     @Override
-    public long delay() {
+    public Long delay() {
         if (teData == null || teData.teAttributes() == null) {
             return TeConstants.NIL_LONG_VALUE;
         }
diff --git a/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/link/TeLink.java b/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/link/TeLink.java
index 81d93c4..6827202 100644
--- a/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/link/TeLink.java
+++ b/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/link/TeLink.java
@@ -165,14 +165,14 @@
      *
      * @return the cost
      */
-    long cost();
+    Long cost();
 
     /**
      * Returns the link delay.
      *
      * @return the delay
      */
-    long delay();
+    Long delay();
 
     /**
      * Returns the link SRLG values.
diff --git a/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/link/TePathAttributes.java b/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/link/TePathAttributes.java
index e0760b3..9b3ecb8 100644
--- a/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/link/TePathAttributes.java
+++ b/apps/tetopology/api/src/main/java/org/onosproject/tetopology/management/api/link/TePathAttributes.java
@@ -60,7 +60,7 @@
      *
      * @return the cost
      */
-    public long cost() {
+    public Long cost() {
         return cost;
     }
 
@@ -69,7 +69,7 @@
      *
      * @return the delay
      */
-    public long delay() {
+    public Long delay() {
         return delay;
     }