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;
     }
 
