diff --git a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/EnumConverter.java b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/EnumConverter.java
index 1c07f9b..1e15726 100644
--- a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/EnumConverter.java
+++ b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/EnumConverter.java
@@ -38,6 +38,10 @@
      *         found
      */
     public static TeStatus yang2TeSubsystemOpStatus(TeOperStatus opStatus) {
+        if (opStatus == null) {
+            return null;
+        }
+
         switch (opStatus.enumeration()) {
         case DOWN:
             return TeStatus.DOWN;
@@ -64,6 +68,10 @@
      *         found
      */
     public static TeStatus yang2TeSubsystemAdminStatus(TeAdminStatus adminStatus) {
+        if (adminStatus == null) {
+            return TeStatus.UNKNOWN;
+        }
+
         switch (adminStatus.enumeration()) {
         case DOWN:
             return TeStatus.DOWN;
@@ -87,6 +95,10 @@
      * @return the equivalent Enum from YANG TeAdminStatus or null if not found
      */
     public static TeAdminStatus teSubsystem2YangAdminStatus(TeStatus adminStatus) {
+        if (adminStatus == null) {
+            return null;
+        }
+
         switch (adminStatus) {
         case DOWN:
             return TeAdminStatus.of(TeAdminStatusEnum.DOWN);
@@ -112,6 +124,10 @@
      * @return the equivalent Enum from YANG TeOperStatus or null if not found
      */
     public static TeOperStatus teSubsystem2YangOperStatus(TeStatus opStatus) {
+        if (opStatus == null) {
+            return null;
+        }
+
         switch (opStatus) {
         case DOWN:
             return TeOperStatus.of(TeOperStatusEnum.DOWN);
@@ -130,4 +146,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
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 3bc16a6..933b9be 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
@@ -936,21 +936,30 @@
      */
     public static TeLinkEvent teNetworkLink2yangTeLinkEvent(TeTopologyEventTypeEnum eventType,
                                                             NetworkLinkEventSubject linkData) {
-        TeLinkEvent.TeLinkEventBuilder builder = new DefaultTeLinkEvent.TeLinkEventBuilder();
+        TeLinkEvent.TeLinkEventBuilder teLinkEventBuilder = new DefaultTeLinkEvent.TeLinkEventBuilder();
 
         TeTopologyEventType yangEventType = new TeTopologyEventType(eventType);
-        builder.eventType(yangEventType);
-        NetworkId newtorkId = NetworkId.fromString(linkData.key().networkId().toString());
-        builder.networkRef(newtorkId);
+        teLinkEventBuilder.eventType(yangEventType);
+        NetworkId networkId = NetworkId.fromString(linkData.key().networkId().toString());
+        teLinkEventBuilder.networkRef(networkId);
         LinkId linkId = LinkId.fromString(linkData.key().linkId().toString());
-        builder.linkRef(linkId);
+        teLinkEventBuilder.linkRef(linkId);
 
-        NetworkLink link = linkData.networkLink();
-        TeLinkAttributes teLinkAttributes = link == null ? null
-                                                         : teLink2YangConfig(link.teLink()).teLinkAttributes();
-        builder.teLinkAttributes(teLinkAttributes);
+        if (linkData != null && linkData.networkLink() != null) {
+            NetworkLink link = linkData.networkLink();
+            State yangTeLinkState = teLink2YangState(link.teLink());
 
-        return builder.build();
+            teLinkEventBuilder.operStatus(yangTeLinkState.operStatus());
+            teLinkEventBuilder.informationSource(yangTeLinkState.informationSource());
+            teLinkEventBuilder.informationSourceEntry(yangTeLinkState.informationSourceEntry());
+            teLinkEventBuilder.informationSourceState(yangTeLinkState.informationSourceState());
+            teLinkEventBuilder.isTransitional(yangTeLinkState.isTransitional());
+            teLinkEventBuilder.recovery(yangTeLinkState.recovery());
+            teLinkEventBuilder.teLinkAttributes(yangTeLinkState.teLinkAttributes());
+            teLinkEventBuilder.underlay(yangTeLinkState.underlay());
+        }
+
+        return teLinkEventBuilder.build();
     }
 
     public static NetworkLinkKey yangLinkEvent2NetworkLinkKey(TeLinkEvent yangLinkEvent) {
@@ -983,6 +992,9 @@
         }
 
         NodeTpKey sourceTp = networkLink.source();
+        if (sourceTp == null) {
+            return null;
+        }
         NodeTpKey destTp = networkLink.destination();
 
         List<NetworkLinkKey> supportingLinkIds = networkLink.supportingLinkIds();
@@ -1011,13 +1023,13 @@
 
         TeLinkTpKey teLinkKey = oldTeLink.teLinkKey();
 
+        long teNodeIdDest = 0;
+        long teNodeIdSrc = 0;
 
-        long teNodeIdDest = oldTeLink.peerTeLinkKey().teNodeId();
-        long teNodeId = oldTeLink.teLinkKey().teNodeId();
         TeLinkTpGlobalKey supportTeLinkId = oldTeLink.supportingTeLinkId();
         TeLinkTpKey peerTeLinkKey = oldTeLink.peerTeLinkKey();
 
-        TeLink updatedTeLink = yangLinkAttr2TeLinkAttributes(yangTeLinkAttrs, opStatus, teNodeId, teNodeIdDest,
+        TeLink updatedTeLink = yangLinkAttr2TeLinkAttributes(yangTeLinkAttrs, opStatus, teNodeIdSrc, teNodeIdDest,
                                                              teLinkKey, peerTeLinkKey, supportTeLinkId);
 
         return updatedTeLink;
diff --git a/providers/ietfte/topology/src/main/java/org/onosproject/provider/te/topology/TeTopologyRestconfProvider.java b/providers/ietfte/topology/src/main/java/org/onosproject/provider/te/topology/TeTopologyRestconfProvider.java
index 8fdf49c..c75f01d 100644
--- a/providers/ietfte/topology/src/main/java/org/onosproject/provider/te/topology/TeTopologyRestconfProvider.java
+++ b/providers/ietfte/topology/src/main/java/org/onosproject/provider/te/topology/TeTopologyRestconfProvider.java
@@ -53,6 +53,8 @@
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.Network;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.IetfNetworkTopology;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.IetfTeTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .IetfTeTopologyEvent;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.TeLinkEvent;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.TeNodeEvent;
 import org.onosproject.yms.ych.YangCodecHandler;
@@ -84,7 +86,7 @@
 @Component(immediate = true)
 public class TeTopologyRestconfProvider extends AbstractProvider
         implements TeTopologyProvider {
-    private static final String APP_NAME = "org.onosproject.teprovider.topology";
+    private static final String APP_NAME = "org.onosproject.teprovider";
     private static final String RESTCONF = "restconf";
     private static final String PROVIDER =
             "org.onosproject.teprovider.restconf.domain";
@@ -341,50 +343,97 @@
         }
 
         private void handleRestconfLinkNotification(String linkString) {
-            YangCompositeEncodingImpl yce =
-                    new YangCompositeEncodingImpl(YangResourceIdentifierType.URI,
-                                                  "ietf-te-topology:te-link-event",
-                                                  linkString);
-            Object yo = codecHandler.decode(yce,
-                                            YangProtocolEncodingFormat.JSON,
-                                            YmsOperationType.NOTIFICATION);
 
-            if (yo == null) {
-                log.error("YMS decoder error");
+            IetfTeTopologyEvent event = convertJson2IetfTeTopologyEvent(
+                    "ietf-te-topology:te-link-event",
+                    linkString);
+            if (event == null) {
+                log.error("ERROR: json to YO conversion failure");
                 return;
             }
 
+            if (event.type() != IetfTeTopologyEvent.Type.TE_LINK_EVENT) {
+                log.error("ERROR: wrong YO event type: {}", event.type());
+                return;
+            }
+
+            TeLinkEvent teLinkEvent = event.subject().teLinkEvent();
+
+            log.debug("TeLinkEvent: {}", teLinkEvent);
+
             NetworkLinkKey linkKey = LinkConverter.yangLinkEvent2NetworkLinkKey(
-                    (TeLinkEvent) yo);
+                    teLinkEvent);
 
             NetworkLink networkLink = LinkConverter.yangLinkEvent2NetworkLink(
-                    (TeLinkEvent) yo,
+                    teLinkEvent,
                     teTopologyService);
 
+            if (networkLink == null) {
+                log.error("ERROR: yangLinkEvent2NetworkLink returns null");
+                return;
+            }
+
+            log.debug("networkLink: {}", networkLink);
+
             topologyProviderService.linkUpdated(linkKey, networkLink);
         }
 
-        private void handleRestconfNodeNotification(String nodeString) {
+        private IetfTeTopologyEvent convertJson2IetfTeTopologyEvent(String uriString,
+                                                                    String jsonBody) {
+
             YangCompositeEncodingImpl yce =
                     new YangCompositeEncodingImpl(YangResourceIdentifierType.URI,
-                                                  "ietf-te-topology:te-node-event",
-                                                  nodeString);
+                                                  uriString,
+                                                  jsonBody);
             Object yo = codecHandler.decode(yce,
                                             YangProtocolEncodingFormat.JSON,
                                             YmsOperationType.NOTIFICATION);
 
             if (yo == null) {
                 log.error("YMS decoder error");
+                return null;
+            }
+
+            if (!(yo instanceof IetfTeTopologyEvent)) {
+                log.error("ERROR: YO is not IetfTeTopologyEvent");
+                return null;
+            }
+
+            return (IetfTeTopologyEvent) yo;
+        }
+
+        private void handleRestconfNodeNotification(String nodeString) {
+
+            IetfTeTopologyEvent event = convertJson2IetfTeTopologyEvent(
+                    "ietf-te-topology:te-node-event",
+                    nodeString);
+
+            if (event == null) {
+                log.error("ERROR: json to YO conversion failure");
                 return;
             }
 
+            if (event.type() != IetfTeTopologyEvent.Type.TE_NODE_EVENT) {
+                log.error("ERROR: wrong YO event type: {}", event.type());
+                return;
+            }
+
+            TeNodeEvent teNodeEvent = event.subject().teNodeEvent();
+
+            log.debug("TeNodeEvent: {}", teNodeEvent);
+
             NetworkNodeKey nodeKey = NodeConverter.yangNodeEvent2NetworkNodeKey(
-                    (TeNodeEvent) yo);
+                    teNodeEvent);
 
             NetworkNode networkNode = NodeConverter.yangNodeEvent2NetworkNode(
-                    (TeNodeEvent) yo,
+                    teNodeEvent,
                     teTopologyService);
 
+            if (networkNode == null) {
+                log.error("ERROR: yangNodeEvent2NetworkNode returns null");
+                return;
+            }
+
             topologyProviderService.nodeUpdated(nodeKey, networkNode);
         }
     }
