RESTCONF notification changes

* Added a callback function mechanism to the RESTCONF notification
  listener. Applications can register their callbacks to a listener.
  This is to allow multiple SB providers share one generic listener.
  while still being able to process app-specific events.
* Created a default RESTCONF notification listener implementation.
* Refactored TE provider code to allow TE-topology and TE-tunnel share one
  RESTCONF event listener

Change-Id: I26dc4972683fcda3eefacde131353312809aa95e
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 933b9be..c567667 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
@@ -15,13 +15,7 @@
  */
 package org.onosproject.teyang.utils.topology;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.BitSet;
-import java.util.List;
-
+import com.google.common.collect.Lists;
 import org.onlab.packet.Ip4Address;
 import org.onosproject.tetopology.management.api.KeyId;
 import org.onosproject.tetopology.management.api.TeStatus;
@@ -51,87 +45,132 @@
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.Networks;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NodeId;
 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.rev20151208.ietfnetwork.networks.network.Node;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
-               .ietfnetworktopology.LinkId;
-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.AugmentedNdNetwork;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
-               .ietfnetworktopology.networks.network.augmentedndnetwork.DefaultLink;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
-               .ietfnetworktopology.networks.network.augmentedndnetwork.DefaultLink.LinkBuilder;
-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.networks.network.augmentedndnetwork.link.DefaultDestination;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
-               .ietfnetworktopology.networks.network.augmentedndnetwork.link.DefaultSource;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
-               .ietfnetworktopology.networks.network.augmentedndnetwork.link.DefaultSupportingLink;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
-                .ietfnetworktopology.networks.network.augmentedndnetwork.link.Destination
-                .DestinationBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
-               .ietfnetworktopology.networks.network.augmentedndnetwork.link.Source.SourceBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
-               .ietfnetworktopology.networks.network.augmentedndnetwork.link.SupportingLink;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
-               .ietfnetworktopology.networks.network.augmentedndnetwork.link.SupportingLink
-               .SupportingLinkBuilder;
-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.te.topology.rev20160708.ietftetopology.DefaultTeLinkEvent;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
+        .Node;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
+        .LinkId;
+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.AugmentedNdNetwork;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
+        .networks.network.augmentedndnetwork.DefaultLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
+        .networks.network.augmentedndnetwork.DefaultLink.LinkBuilder;
+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
+        .networks.network.augmentedndnetwork.link.DefaultDestination;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
+        .networks.network.augmentedndnetwork.link.DefaultSource;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
+        .networks.network.augmentedndnetwork.link.DefaultSupportingLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
+        .networks.network.augmentedndnetwork.link.Destination.DestinationBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
+        .networks.network.augmentedndnetwork.link.Source.SourceBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
+        .networks.network.augmentedndnetwork.link.SupportingLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
+        .networks.network.augmentedndnetwork.link.SupportingLink.SupportingLinkBuilder;
+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.te.topology.rev20160708.ietftetopology
+        .DefaultTeLinkEvent;
 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.informationsourceattributes.DefaultInformationSourceState;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.InformationSourceState;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.informationsourcestate.DefaultTopology;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.informationsourcestate.Topology;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks.network.AugmentedNwNetwork;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.AugmentedNtLink;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.DefaultAugmentedNtLink;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.link.DefaultAugmentedNtLink.AugmentedNtLinkBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks.network.node.AugmentedNwNode;
-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.telinkaugment.DefaultTe;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.DefaultTe.TeBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.Config;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultConfig;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultConfig.ConfigBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultState;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultState.StateBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.State;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.DefaultTeLinkAttributes;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.DefaultTeLinkAttributes.TeLinkAttributesBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.TeLinkAttributes;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultExternalDomain;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultExternalDomain.ExternalDomainBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultUnderlay.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;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultTeSrlgs.TeSrlgsBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultUnreservedBandwidth;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultUnreservedBandwidth.UnreservedBandwidthBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.Te;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.TeSrlgs;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.UnreservedBandwidth;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkinfoattributes.LinkProtectionTypeEnum;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayBackupPath;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayBackupPath.UnderlayBackupPathBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayPrimaryPath;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayPrimaryPath.UnderlayPrimaryPathBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.UnderlayPrimaryPath;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.underlayprimarypath.DefaultPathElement;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .informationsourceattributes.DefaultInformationSourceState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .informationsourceattributes.InformationSourceState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .informationsourceattributes.informationsourcestate.DefaultTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .informationsourceattributes.informationsourcestate.Topology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
+        .network.AugmentedNwNetwork;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
+        .network.link.AugmentedNtLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
+        .network.link.DefaultAugmentedNtLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
+        .network.link.DefaultAugmentedNtLink.AugmentedNtLinkBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
+        .network.node.AugmentedNwNode;
+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
+        .telinkaugment.DefaultTe;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkaugment.DefaultTe.TeBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkaugment.te.Config;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkaugment.te.DefaultConfig;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkaugment.te.DefaultConfig.ConfigBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkaugment.te.DefaultState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkaugment.te.DefaultState.StateBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkaugment.te.State;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkconfigattributes.DefaultTeLinkAttributes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkconfigattributes.DefaultTeLinkAttributes.TeLinkAttributesBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkconfigattributes.TeLinkAttributes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkconfigattributes.telinkattributes.DefaultExternalDomain;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkconfigattributes.telinkattributes.DefaultExternalDomain.ExternalDomainBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkconfigattributes.telinkattributes.DefaultUnderlay.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;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkconnectivityattributes.DefaultTeSrlgs.TeSrlgsBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkconnectivityattributes.DefaultUnreservedBandwidth;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkconnectivityattributes.DefaultUnreservedBandwidth.UnreservedBandwidthBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkconnectivityattributes.TeSrlgs;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkconnectivityattributes.UnreservedBandwidth;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkinfoattributes.LinkProtectionTypeEnum;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkunderlayattributes.DefaultUnderlayBackupPath;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkunderlayattributes.DefaultUnderlayBackupPath.UnderlayBackupPathBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkunderlayattributes.DefaultUnderlayPrimaryPath;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkunderlayattributes.DefaultUnderlayPrimaryPath.UnderlayPrimaryPathBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkunderlayattributes.UnderlayPrimaryPath;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .telinkunderlayattributes.underlayprimarypath.DefaultPathElement;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tenodeaugment.Te;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.Srlg;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeNodeId;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeOperStatus;
-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
+        .TeTopologyEventType;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTpId;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.tetopologyeventtype.TeTopologyEventTypeEnum;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes
+        .tetopologyeventtype.TeTopologyEventTypeEnum;
 
-import com.google.common.collect.Lists;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.BitSet;
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkNotNull;
 
 
 /**
@@ -155,22 +194,23 @@
 
     private static LinkProtectionTypeEnum teSubsystem2YangLinkProtectionType(TunnelProtectionType linkProtectionType) {
         switch (linkProtectionType) {
-        case ENHANCED:
-            return LinkProtectionTypeEnum.ENHANCED;
-        case EXTRA_TRAFFIC:
-            return LinkProtectionTypeEnum.EXTRA_TRAFFIC;
-        case SHARED:
-            return LinkProtectionTypeEnum.SHARED;
-        case UNPROTECTED:
-            return LinkProtectionTypeEnum.UNPROTECTED;
-        case ONE_FOR_ONE:
-            return LinkProtectionTypeEnum.YANGAUTOPREFIX1_FOR_1;
-        case ONE_PLUS_ONE:
-            return LinkProtectionTypeEnum.YANGAUTOPREFIX1_PLUS_1;
-        default:
-            return null;
+            case ENHANCED:
+                return LinkProtectionTypeEnum.ENHANCED;
+            case EXTRA_TRAFFIC:
+                return LinkProtectionTypeEnum.EXTRA_TRAFFIC;
+            case SHARED:
+                return LinkProtectionTypeEnum.SHARED;
+            case UNPROTECTED:
+                return LinkProtectionTypeEnum.UNPROTECTED;
+            case ONE_FOR_ONE:
+                return LinkProtectionTypeEnum.YANGAUTOPREFIX1_FOR_1;
+            case ONE_PLUS_ONE:
+                return LinkProtectionTypeEnum.YANGAUTOPREFIX1_PLUS_1;
+            default:
+                return null;
         }
     }
+
     /**
      * TE Link Config object conversion from TE Topology subsystem to YANG.
      *
@@ -194,7 +234,7 @@
         if (teLink.tunnelProtectionType() != null) {
             attrBuilder = attrBuilder
                     .linkProtectionType(teSubsystem2YangLinkProtectionType(teLink
-                            .tunnelProtectionType()));
+                                                                                   .tunnelProtectionType()));
         }
 
         attrBuilder = attrBuilder.teDefaultMetric(teLink.cost());
@@ -217,15 +257,15 @@
             if (teLink.externalLink().externalLinkKey() != null) {
                 edBuilder = edBuilder
                         .remoteTeLinkTpId(TeTpId.fromString(
-                                                                String.valueOf(teLink
-                                                                        .externalLink()
-                                                                        .externalLinkKey()
-                                                                        .teLinkTpId())))
+                                String.valueOf(teLink
+                                                       .externalLink()
+                                                       .externalLinkKey()
+                                                       .teLinkTpId())))
                         .remoteTeNodeId(TeNodeId.fromString(
-                                                                String.valueOf(teLink
-                                                                        .externalLink()
-                                                                        .externalLinkKey()
-                                                                        .teNodeId())));
+                                String.valueOf(teLink
+                                                       .externalLink()
+                                                       .externalLinkKey()
+                                                       .teNodeId())));
             }
             attrBuilder = attrBuilder.externalDomain(edBuilder.build());
         }
@@ -235,8 +275,8 @@
             for (float f : teLink.availBandwidth()) {
                 UnreservedBandwidthBuilder urBuilder =
                         DefaultUnreservedBandwidth.builder()
-                                                  .bandwidth(BigDecimal.valueOf(f))
-                                                  .priority(i);
+                                .bandwidth(BigDecimal.valueOf(f))
+                                .priority(i);
                 i++;
                 attrBuilder = attrBuilder.addToUnreservedBandwidth(urBuilder.build());
             }
@@ -267,7 +307,7 @@
 //        attrBuilder = attrBuilder.underlay(builder.build());
 
         ConfigBuilder yangConfigBuilder = DefaultConfig.builder()
-                                                       .teLinkAttributes(attrBuilder.build());
+                .teLinkAttributes(attrBuilder.build());
         return yangConfigBuilder.build();
     }
 
@@ -279,11 +319,11 @@
      */
     private static State teLink2YangState(TeLink teLink) {
         TeLinkAttributes
-            .TeLinkAttributesBuilder attrBuilder =
-                        DefaultTeLinkAttributes
-            .builder()
-            .teDefaultMetric(teLink.cost())
-            .isAbstract(teLink.flags().get(TeLink.BIT_ABSTRACT));
+                .TeLinkAttributesBuilder attrBuilder =
+                DefaultTeLinkAttributes
+                        .builder()
+                        .teDefaultMetric(teLink.cost())
+                        .isAbstract(teLink.flags().get(TeLink.BIT_ABSTRACT));
         if (teLink.teLinkKey() != null) {
             // what is link index? for now I used teLinkTpId
             attrBuilder = attrBuilder.linkIndex(BigInteger.valueOf(teLink.teLinkKey().teLinkTpId()));
@@ -295,7 +335,7 @@
         if (teLink.tunnelProtectionType() != null) {
             attrBuilder = attrBuilder
                     .linkProtectionType(teSubsystem2YangLinkProtectionType(teLink
-                            .tunnelProtectionType()));
+                                                                                   .tunnelProtectionType()));
         }
         if (teLink.maxBandwidth() != null) {
             // maxBandwidth is an array of float[], but in yang is just a big decimal
@@ -321,13 +361,13 @@
             if (teLink.externalLink().externalLinkKey() != null) {
                 edBuilder = edBuilder
                         .remoteTeLinkTpId(TeTpId.fromString(String.valueOf(teLink
-                                                                           .externalLink()
-                                                                           .externalLinkKey()
-                                                                           .teLinkTpId())))
+                                                                                   .externalLink()
+                                                                                   .externalLinkKey()
+                                                                                   .teLinkTpId())))
                         .remoteTeNodeId(TeNodeId.fromString(String.valueOf(teLink
-                                                                           .externalLink()
-                                                                           .externalLinkKey()
-                                                                           .teNodeId())));
+                                                                                   .externalLink()
+                                                                                   .externalLinkKey()
+                                                                                   .teNodeId())));
             }
             attrBuilder = attrBuilder.externalDomain(edBuilder.build());
 
@@ -338,18 +378,18 @@
             for (float f : teLink.availBandwidth()) {
                 UnreservedBandwidth.UnreservedBandwidthBuilder urBuilder = DefaultUnreservedBandwidth
                         .builder()
-                                               .bandwidth(BigDecimal.valueOf(f))
-                                               .priority(i);
+                        .bandwidth(BigDecimal.valueOf(f))
+                        .priority(i);
                 i++;
                 attrBuilder = attrBuilder.addToUnreservedBandwidth(urBuilder.build());
             }
         }
 
         StateBuilder yangStateBuilder = DefaultState.builder()
-                                                    .teLinkAttributes(attrBuilder.build());
+                .teLinkAttributes(attrBuilder.build());
         if (teLink.opStatus() != null) {
             yangStateBuilder = yangStateBuilder.operStatus(EnumConverter
-                                                           .teSubsystem2YangOperStatus(teLink.opStatus()));
+                                                                   .teSubsystem2YangOperStatus(teLink.opStatus()));
         }
 
         if (teLink.sourceTeLinkId() != null) {
@@ -357,8 +397,8 @@
 
             Topology.TopologyBuilder topologyBuilder = DefaultTopology.builder();
             topologyBuilder = topologyBuilder.clientIdRef(teLink.sourceTeLinkId().clientId())
-                                             .providerIdRef(teLink.sourceTeLinkId().providerId())
-                                             .teTopologyIdRef(teLink.sourceTeLinkId().topologyId());
+                    .providerIdRef(teLink.sourceTeLinkId().providerId())
+                    .teTopologyIdRef(teLink.sourceTeLinkId().topologyId());
             issBuilder = issBuilder.topology(topologyBuilder.build());
             yangStateBuilder.informationSourceState(issBuilder.build());
         }
@@ -389,43 +429,43 @@
             SupportingLinkBuilder spLinkBuilder = DefaultSupportingLink.builder();
             for (NetworkLinkKey linkKey : teSubsNetworkLink.supportingLinkIds()) {
                 slinks.add(spLinkBuilder.networkRef(NetworkId.fromString(
-                                                    linkKey.networkId().toString()))
-                                        .linkRef(LinkId.fromString(
-                                                    linkKey.linkId().toString()))
-                                        .build());
+                        linkKey.networkId().toString()))
+                                   .linkRef(LinkId.fromString(
+                                           linkKey.linkId().toString()))
+                                   .build());
             }
             builder = builder.supportingLink(slinks);
         }
         if (teSubsNetworkLink.source() != null) {
             SourceBuilder sourceBuilder = DefaultSource
-                                              .builder()
-                                              .sourceNode(NodeId.fromString(
-                                                   teSubsNetworkLink.source().nodeId().toString()))
-                                              .sourceTp(TpId.fromString(
-                                                   teSubsNetworkLink.source().tpId().toString()));
+                    .builder()
+                    .sourceNode(NodeId.fromString(
+                            teSubsNetworkLink.source().nodeId().toString()))
+                    .sourceTp(TpId.fromString(
+                            teSubsNetworkLink.source().tpId().toString()));
             builder = builder.source(sourceBuilder.build());
         }
         if (teSubsNetworkLink.destination() != null) {
             DestinationBuilder destBuilder = DefaultDestination
-                                                 .builder()
-                                                 .destNode(NodeId.fromString(
-                                                      teSubsNetworkLink.destination().nodeId().toString()))
-                                                 .destTp(TpId.fromString(
-                                                      teSubsNetworkLink.destination().tpId().toString()));
+                    .builder()
+                    .destNode(NodeId.fromString(
+                            teSubsNetworkLink.destination().nodeId().toString()))
+                    .destTp(TpId.fromString(
+                            teSubsNetworkLink.destination().tpId().toString()));
             builder = builder.destination(destBuilder.build());
         }
 
         if (teSubsNetworkLink.teLink() != null) {
             TeLink teData = teSubsNetworkLink.teLink();
             TeBuilder yangTeBuilder = DefaultTe.builder()
-                                               .config(teLink2YangConfig(teData))
-                                               .state(teLink2YangState(teData));
+                    .config(teLink2YangConfig(teData))
+                    .state(teLink2YangState(teData));
             // ignoring supportingTeLinkId when converting from core to yang?
             // if (teData.supportingTeLinkId() != null) {
             // }
             AugmentedNtLinkBuilder linkAugmentBuilder =
                     DefaultAugmentedNtLink.builder()
-                                          .te(yangTeBuilder.build());
+                            .te(yangTeBuilder.build());
             builder.addYangAugmentedInfo(linkAugmentBuilder.build(), AugmentedNtLink.class);
         }
 
@@ -439,12 +479,12 @@
         org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath tePath = teLink.primaryPath();
 
         UnderlayPrimaryPathBuilder pathBuilder =
-                                       DefaultUnderlayPrimaryPath.builder();
+                DefaultUnderlayPrimaryPath.builder();
         if (tePath.pathElements() != null) {
             for (PathElement pathElementTe : tePath.pathElements()) {
                 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                .ietftetopology.telinkunderlayattributes.underlayprimarypath.PathElement
-                   .PathElementBuilder pathElementYangBuilder = DefaultPathElement.builder();
+                        .ietftetopology.telinkunderlayattributes.underlayprimarypath.PathElement
+                        .PathElementBuilder pathElementYangBuilder = DefaultPathElement.builder();
 
                 pathElementYangBuilder = pathElementYangBuilder.pathElementId(pathElementTe.pathElementId());
                 //TODO: add some Type cross converter
@@ -455,8 +495,8 @@
         }
 
         pathBuilder = pathBuilder.clientIdRef(teLink.underlayTeTopologyId().clientId())
-                                 .providerIdRef(teLink.underlayTeTopologyId().providerId())
-                                 .teTopologyIdRef(teLink.underlayTeTopologyId().topologyId());
+                .providerIdRef(teLink.underlayTeTopologyId().providerId())
+                .teTopologyIdRef(teLink.underlayTeTopologyId().topologyId());
 
         pathBuilder = pathBuilder.networkIdRef(teTopologyService.networkId(teLink.underlayTeTopologyId()));
 
@@ -473,18 +513,18 @@
                     .builder();
             pathBuilder = pathBuilder.index(tePath.index());
             pathBuilder = pathBuilder.clientIdRef(teLink.underlayTeTopologyId().clientId())
-                                     .providerIdRef(teLink.underlayTeTopologyId().providerId())
-                                     .teTopologyIdRef(teLink.underlayTeTopologyId().topologyId());
+                    .providerIdRef(teLink.underlayTeTopologyId().providerId())
+                    .teTopologyIdRef(teLink.underlayTeTopologyId().topologyId());
 
             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
-                .ietftetopology.telinkunderlayattributes.underlaybackuppath.PathElement
-                .PathElementBuilder elementBuilder =
-                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                .ietftetopology.telinkunderlayattributes.underlaybackuppath.DefaultPathElement
-                        .builder();
+                        .ietftetopology.telinkunderlayattributes.underlaybackuppath.PathElement
+                        .PathElementBuilder elementBuilder =
+                        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+                                .ietftetopology.telinkunderlayattributes.underlaybackuppath.DefaultPathElement
+                                .builder();
 
                 elementBuilder = elementBuilder.pathElementId(backupPathElementTe.pathElementId());
                 // TODO: add some Type cross conversion
@@ -530,9 +570,9 @@
         TeLinkTpKey peerTeLinkKey = null;
         if (yangLink.destination() != null) {
             peerTeLinkKey = new TeLinkTpKey(teNodeIdDestLong,
-                                                        findTeTpId(yangNetwork,
-                                                                   yangLink.destination().destNode(),
-                                                                   yangLink.destination().destTp()));
+                                            findTeTpId(yangNetwork,
+                                                       yangLink.destination().destNode(),
+                                                       yangLink.destination().destTp()));
         }
 
         TeLinkTpGlobalKey supportTeLinkId = findSupportTeLinkId(yangNetworks, yangLink);
@@ -625,8 +665,9 @@
         TePathAttributes teAttributes =
                 new TePathAttributes(yangLinkAtrr.teDefaultMetric(),
                                      yangLinkAtrr.performanceMetric() == null ? null :
-                                           (yangLinkAtrr.performanceMetric().measurement() == null ? null :
-                                               yangLinkAtrr.performanceMetric().measurement().unidirectionalDelay()),
+                                             (yangLinkAtrr.performanceMetric().measurement() == null ? null :
+                                                     yangLinkAtrr.performanceMetric().measurement()
+                                                             .unidirectionalDelay()),
                                      srlgs);
         teData = new CommonLinkData(adminStatus,
                                     opStatus,
@@ -647,7 +688,7 @@
     }
 
     private static TeLinkTpGlobalKey findSupportTeLinkId(Networks yangNetworks,
-                                            Link yangLink) {
+                                                         Link yangLink) {
         Network teNetworkFound = null;
         LinkId teLinkIdFound = null;
         TeLinkTpGlobalKey supportTeLinkId = null;
@@ -700,7 +741,7 @@
             supportTeLinkId = new TeLinkTpGlobalKey(teTopologyId.providerId(),
                                                     teTopologyId.clientId(),
                                                     Long.valueOf(teTopologyId
-                                                            .topologyId()),
+                                                                         .topologyId()),
                                                     tenIdLong, teSupportLinkTpId);
         }
 
@@ -742,7 +783,7 @@
                             if (yangTpnode.tpId().equals(yangTpId)) {
                                 if (yangTpnode.yangAugmentedInfoMap() != null
                                         && !yangTpnode.yangAugmentedInfoMap()
-                                                .isEmpty()) {
+                                        .isEmpty()) {
                                     AugmentedNtTerminationPoint yangTpAugment =
                                             (AugmentedNtTerminationPoint) yangTpnode
                                                     .yangAugmentedInfo(AugmentedNtTerminationPoint.class);
@@ -758,17 +799,18 @@
         }
         return teTpId;
     }
+
     /**
      * Link object conversion from YANG to TE Topology subsystem.
      *
-     * @param yangLink  YANG link
-     * @param yangNetwork YANG network
+     * @param yangLink     YANG link
+     * @param yangNetwork  YANG network
      * @param yangNetworks YANG networks
      * @return TE subsystem link
      */
     public static org.onosproject.tetopology.management.api.link.NetworkLink
-            yang2TeSubsystemLink(Link yangLink, Network yangNetwork,
-                                 Networks yangNetworks) {
+    yang2TeSubsystemLink(Link yangLink, Network yangNetwork,
+                         Networks yangNetworks) {
         NetworkId networkId = yangNetwork.networkId();
         checkNotNull(yangLink, E_NULL_YANG_TELINK);
 
@@ -789,17 +831,17 @@
 
         if (yangLink.source() != null) {
             TerminationPointKey source = new TerminationPointKey(
-                                                 KeyId.keyId(networkId.uri().toString()),
-                                                 KeyId.keyId(yangLink.source().sourceNode().uri().toString()),
-                                                 KeyId.keyId(yangLink.source().sourceTp().uri().toString()));
+                    KeyId.keyId(networkId.uri().toString()),
+                    KeyId.keyId(yangLink.source().sourceNode().uri().toString()),
+                    KeyId.keyId(yangLink.source().sourceTp().uri().toString()));
             sourceNodeTpKey = new NodeTpKey(source.nodeId(), source.tpId());
         }
 
         if (yangLink.destination() != null) {
             TerminationPointKey destination = new TerminationPointKey(
-                                                      KeyId.keyId(networkId.uri().toString()),
-                                                      KeyId.keyId(yangLink.destination().destNode().uri().toString()),
-                                                      KeyId.keyId(yangLink.destination().destTp().uri().toString()));
+                    KeyId.keyId(networkId.uri().toString()),
+                    KeyId.keyId(yangLink.destination().destNode().uri().toString()),
+                    KeyId.keyId(yangLink.destination().destTp().uri().toString()));
             destinationNodeTpKey = new NodeTpKey(destination.nodeId(), destination.tpId());
         }
 
@@ -831,8 +873,8 @@
     }
 
     private static org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath
-                    yang2TeSubsystemUnderlayPrimaryPath(UnderlayPrimaryPath yangpath,
-                                                        long teNodeId) {
+    yang2TeSubsystemUnderlayPrimaryPath(UnderlayPrimaryPath yangpath,
+                                        long teNodeId) {
         org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath teUnderlayPrimaryPath = null;
 
         List<PathElement> pathElementList = Lists.newArrayList();
@@ -855,11 +897,11 @@
     }
 
     private static List<UnderlayBackupPath>
-       yang2TeSubsystemUnderlayBackupPaths(
-                List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
+    yang2TeSubsystemUnderlayBackupPaths(
+            List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
                     rev20160708.ietftetopology.telinkunderlayattributes.
                     UnderlayBackupPath> yangpaths,
-                long teNodeId) {
+            long teNodeId) {
 
         List<UnderlayBackupPath> underlayBackupPathsList = Lists.newArrayList();
         for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
@@ -874,7 +916,7 @@
                 PathElement tePathElementBackup = new PathElement(pathElementBackupYang.pathElementId(),
                                                                   teNodeId,
                                                                   null, // FIXME: find the proper ElementType
-                                                                        // from pathElementBackupYang.type()
+                                                                  // from pathElementBackupYang.type()
                                                                   false); // FIXME: find the proper value for loose
                 backupPathElementList.add(tePathElementBackup);
             }
@@ -888,13 +930,13 @@
     }
 
     /**
-    * TE Link underlay path Config object conversion from YANG to TE Topology subsystem.
-    *
-    * @param yangLinkAtrr YANG link Config YANG object
-    * @return teSubsystem TE underlay path object
-    */
+     * TE Link underlay path Config object conversion from YANG to TE Topology subsystem.
+     *
+     * @param yangLinkAtrr YANG link Config YANG object
+     * @return teSubsystem TE underlay path object
+     */
     private static org.onosproject.tetopology.management.api.link.UnderlayPath
-               yang2TeSubsystemUnderlayPath(TeLinkAttributes yangLinkAtrr, long srcTeNodeId, long dstTeNodeId) {
+    yang2TeSubsystemUnderlayPath(TeLinkAttributes yangLinkAtrr, long srcTeNodeId, long dstTeNodeId) {
 
         checkNotNull(yangLinkAtrr, E_NULL_YANG_TELINK_CONFIG);
 
@@ -915,12 +957,12 @@
         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);
+                    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;
@@ -962,6 +1004,13 @@
         return teLinkEventBuilder.build();
     }
 
+    /**
+     * Retrieves the TE network link key from a given YANG network link
+     * notification event.
+     *
+     * @param yangLinkEvent YANG network link notification
+     * @return TE network link key
+     */
     public static NetworkLinkKey yangLinkEvent2NetworkLinkKey(TeLinkEvent yangLinkEvent) {
         NetworkId networkRef = NetworkId.fromString(yangLinkEvent.networkRef().toString());
         LinkId linkRef = LinkId.fromString(yangLinkEvent.linkRef().toString());
@@ -971,9 +1020,16 @@
         NetworkLinkKey networkLinkKey = new NetworkLinkKey(networkId, linkId);
 
         return networkLinkKey;
-
     }
 
+    /**
+     * Converts a YANG network link notification event into  a TE network
+     * link.
+     *
+     * @param yangLinkEvent     YANG network link notification
+     * @param teTopologyService TE Topology service used to help the conversion
+     * @return TE network link
+     */
     public static NetworkLink yangLinkEvent2NetworkLink(TeLinkEvent yangLinkEvent,
                                                         TeTopologyService teTopologyService) {
 
@@ -1005,19 +1061,23 @@
 
         TeOperStatus opState = yangLinkEvent.operStatus();
         org.onosproject.tetopology.management.api.
-        TeStatus opStatus = EnumConverter.yang2TeSubsystemOpStatus(opState);
+                TeStatus opStatus = EnumConverter.yang2TeSubsystemOpStatus(opState);
 
         TeLink updatedTeLink = yangLinkEvent2TeLinkAttributes(yangLinkEvent, teLink, opStatus);
 
 
-        NetworkLink updatedNetworkLink = new DefaultNetworkLink(linkId, sourceTp, destTp, supportingLinkIds,
+        NetworkLink updatedNetworkLink = new DefaultNetworkLink(linkId,
+                                                                sourceTp,
+                                                                destTp,
+                                                                supportingLinkIds,
                                                                 updatedTeLink);
 
         return updatedNetworkLink;
     }
 
-    private static TeLink yangLinkEvent2TeLinkAttributes(TeLinkEvent yangLinkEvent, TeLink oldTeLink, TeStatus
-            opStatus) {
+    private static TeLink yangLinkEvent2TeLinkAttributes(TeLinkEvent yangLinkEvent,
+                                                         TeLink oldTeLink,
+                                                         TeStatus opStatus) {
 
         TeLinkAttributes yangTeLinkAttrs = yangLinkEvent.teLinkAttributes();
 
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 26255f8..cf8d6c1 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
@@ -15,12 +15,8 @@
  */
 package org.onosproject.teyang.utils.topology;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.BitSet;
-import java.util.List;
-import java.util.Map;
-
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import org.apache.commons.collections.MapUtils;
 import org.onlab.packet.Ip4Address;
 import org.onosproject.tetopology.management.api.EncodingType;
@@ -51,60 +47,92 @@
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NetworkId;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NodeId;
 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.rev20151208
-               .ietfnetwork.networks.network.DefaultNode;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
-               .ietfnetwork.networks.network.Node;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
-               .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.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
-               .ietfnetworktopology.networks.network.node.DefaultAugmentedNdNode;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.DefaultTeNodeEvent;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
+        .DefaultNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
+        .Node;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.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
+        .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.ietfnetworktopology
+        .networks.network.node.DefaultAugmentedNdNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .DefaultTeNodeEvent;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.TeNodeEvent;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.DefaultInformationSourceState;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.InformationSourceState;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.informationsourcestate.DefaultTopology;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.informationsourcestate.Topology;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .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;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.Config;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.DefaultConfig;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.DefaultState;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.DefaultTunnelTerminationPoint;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.State;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.TunnelTerminationPoint;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconfigattributes.DefaultTeNodeAttributes;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconfigattributes.TeNodeAttributes;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconfigattributes.TeNodeAttributes.TeNodeAttributesBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.DefaultConnectivityMatrix;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.DefaultConnectivityMatrix.ConnectivityMatrixBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.connectivitymatrix.DefaultFrom;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.connectivitymatrix.DefaultTo;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeinfoattributes.DefaultUnderlayTopology;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeinfoattributes.UnderlayTopology;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodetunnelterminationcapability.DefaultTerminationCapability;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodetunnelterminationcapability.TerminationCapability;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .informationsourceattributes.DefaultInformationSourceState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .informationsourceattributes.InformationSourceState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .informationsourceattributes.informationsourcestate.DefaultTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .informationsourceattributes.informationsourcestate.Topology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.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;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tenodeaugment.te.Config;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tenodeaugment.te.DefaultConfig;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tenodeaugment.te.DefaultState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tenodeaugment.te.DefaultTunnelTerminationPoint;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tenodeaugment.te.State;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tenodeaugment.te.TunnelTerminationPoint;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tenodeconfigattributes.DefaultTeNodeAttributes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tenodeconfigattributes.TeNodeAttributes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tenodeconfigattributes.TeNodeAttributes.TeNodeAttributesBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tenodeconnectivitymatrix.DefaultConnectivityMatrix;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tenodeconnectivitymatrix.DefaultConnectivityMatrix.ConnectivityMatrixBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tenodeconnectivitymatrix.connectivitymatrix.DefaultFrom;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tenodeconnectivitymatrix.connectivitymatrix.DefaultTo;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tenodeinfoattributes.DefaultUnderlayTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tenodeinfoattributes.UnderlayTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tenodetunnelterminationcapability.DefaultTerminationCapability;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tenodetunnelterminationcapability.TerminationCapability;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.Srlg;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeAdminStatus;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeNodeId;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyEventType;
+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.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;
+import java.util.BitSet;
+import java.util.List;
+import java.util.Map;
+
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * Node conversion functions.
@@ -138,7 +166,7 @@
                 .builder();
         teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
                 .isAbstract(teSubsystemTeNode.flags()
-                        .get(TeNode.BIT_ABSTRACT));
+                                    .get(TeNode.BIT_ABSTRACT));
 
         if (teSubsystemTeNode.adminStatus() != null) {
             teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
@@ -153,7 +181,7 @@
         if (teSubsystemTeNode.underlayTeTopologyId() != null) {
             teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
                     .underlayTopology(teNode2YangUnderlay(teSubsystemTeNode
-                            .underlayTeTopologyId(), teTopologyService));
+                                                                  .underlayTeTopologyId(), teTopologyService));
         }
 
         // TODO: should we ignore this from te to yang? as we've already set yang supportingNode
@@ -173,26 +201,26 @@
     }
 
     private static TeNodeAttributesBuilder
-                    te2YangConnectivityMatrix(TeNodeAttributesBuilder teNodeAttributesConfigBuilder,
-                                              Map<Long, ConnectivityMatrix> connectivityMatrices) {
+    te2YangConnectivityMatrix(TeNodeAttributesBuilder teNodeAttributesConfigBuilder,
+                              Map<Long, ConnectivityMatrix> connectivityMatrices) {
         ConnectivityMatrixBuilder connectivityMatrixConfigBuilder = DefaultConnectivityMatrix.builder();
         for (Map.Entry<Long, ConnectivityMatrix> teCmEntry :
-            connectivityMatrices.entrySet()) {
+                connectivityMatrices.entrySet()) {
             connectivityMatrixConfigBuilder = connectivityMatrixConfigBuilder
                     .id(teCmEntry.getKey())
                     .isAllowed(!teCmEntry.getValue().flags()
-                               .get(ConnectivityMatrix.BIT_DISALLOWED))
+                            .get(ConnectivityMatrix.BIT_DISALLOWED))
                     .from(new DefaultFrom.FromBuilder() // TODO: for now, assuming that there is
-                                                        // only one 'from', and mergingList is empty
-                          .tpRef(((TeLinkId) teCmEntry.getValue().from()).value())
-                                         .build())
+                                  // only one 'from', and mergingList is empty
+                                  .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(((TeLinkId) teCmEntry.getValue().constrainingElements().get(0)).value())
-                                         .build());
+                                // one item in constrainingElements list
+                                .tpRef(((TeLinkId) teCmEntry.getValue().constrainingElements().get(0)).value())
+                                .build());
             teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
                     .addToConnectivityMatrix(connectivityMatrixConfigBuilder
-                            .build());
+                                                     .build());
         }
         return teNodeAttributesConfigBuilder;
     }
@@ -202,7 +230,7 @@
         UnderlayTopology.UnderlayTopologyBuilder underlayBuilder = DefaultUnderlayTopology
                 .builder()
                 .teTopologyIdRef(TeTopologyId
-                        .fromString(String.valueOf(underlayTopology.topologyId())))
+                                         .fromString(String.valueOf(underlayTopology.topologyId())))
                 .clientIdRef(underlayTopology.clientId())
                 .providerIdRef(underlayTopology.providerId());
 
@@ -222,10 +250,10 @@
         checkNotNull(teSubsystemTeNode, E_NULL_TE_SUBSYSTEM_TE_NODE);
 
         TeNodeAttributes
-                        .TeNodeAttributesBuilder teNodeAttributesStateBuilder =
-        DefaultTeNodeAttributes.builder()
-                                        .isAbstract(teSubsystemTeNode.flags()
-                                                .get(TeNode.BIT_ABSTRACT));
+                .TeNodeAttributesBuilder teNodeAttributesStateBuilder =
+                DefaultTeNodeAttributes.builder()
+                        .isAbstract(teSubsystemTeNode.flags()
+                                            .get(TeNode.BIT_ABSTRACT));
 
         if (teSubsystemTeNode.adminStatus() != null) {
             teNodeAttributesStateBuilder = teNodeAttributesStateBuilder
@@ -240,12 +268,12 @@
         if (teSubsystemTeNode.underlayTeTopologyId() != null) {
             teNodeAttributesStateBuilder = teNodeAttributesStateBuilder
                     .underlayTopology(teNode2YangUnderlay(teSubsystemTeNode
-                            .underlayTeTopologyId(), teTopologyService));
+                                                                  .underlayTeTopologyId(), teTopologyService));
         }
 
         if (teSubsystemTeNode.connectivityMatrices() != null) {
             teNodeAttributesStateBuilder = te2YangConnectivityMatrix(teNodeAttributesStateBuilder,
-                                                                      teSubsystemTeNode.connectivityMatrices());
+                                                                     teSubsystemTeNode.connectivityMatrices());
         }
 
         // TODO: should we ignore this from te to yang? as we've already set yang supportingNode
@@ -257,7 +285,8 @@
 
         if (teSubsystemTeNode.opStatus() != null) {
             yangStateBuilder = yangStateBuilder.operStatus(EnumConverter
-                                                           .teSubsystem2YangOperStatus(teSubsystemTeNode.opStatus()));
+                                                                   .teSubsystem2YangOperStatus(teSubsystemTeNode
+                                                                                                       .opStatus()));
         }
 
         if (teSubsystemTeNode.sourceTeNodeId() != null) {
@@ -266,10 +295,10 @@
             Topology.TopologyBuilder topologyBuilder = DefaultTopology.builder();
             topologyBuilder =
                     topologyBuilder.clientIdRef(teSubsystemTeNode.sourceTeNodeId().clientId())
-                                   .providerIdRef(teSubsystemTeNode.sourceTeNodeId().providerId())
-                                   // is this correct? Why not sourceTeNodeId().teTopologyKey()?
-                                   .teTopologyIdRef(teSubsystemTeNode
-                                                    .sourceTeNodeId().topologyId());
+                            .providerIdRef(teSubsystemTeNode.sourceTeNodeId().providerId())
+                            // is this correct? Why not sourceTeNodeId().teTopologyKey()?
+                            .teTopologyIdRef(teSubsystemTeNode
+                                                     .sourceTeNodeId().topologyId());
             issBuilder = issBuilder.topology(topologyBuilder.build());
             yangStateBuilder.informationSourceState(issBuilder.build());
         }
@@ -303,39 +332,39 @@
     /**
      * TE Node TunnelTerminationPoint object conversion from TE Topology subsystem to YANG.
      *
-     * @param teTunnelTp TE TunnelTerminationPoint object
+     * @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,
-                           TeTopologyService teTopologyService,
-                           TeNodeKey teNodeKey) {
+            org.onosproject.tetopology.management.api.node
+                    .TunnelTerminationPoint teTunnelTp, Long teTpId,
+            TeTopologyService teTopologyService,
+            TeNodeKey teNodeKey) {
         checkNotNull(teTunnelTp, E_NULL_TE_SUBSYSTEM_TE_TUNNEL_TP);
 
         TunnelTerminationPoint.TunnelTerminationPointBuilder tunnelTpBuilder =
                 DefaultTunnelTerminationPoint.builder().tunnelTpId(ByteUtils.longToBytes(teTpId.longValue()));
 
         org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-            .ietftetopology.tenodeaugment.te.tunnelterminationpoint.Config.ConfigBuilder ttpConfigBuilder =
+                .ietftetopology.tenodeaugment.te.tunnelterminationpoint.Config.ConfigBuilder ttpConfigBuilder =
+                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+                        .ietftetopology.tenodeaugment.te.tunnelterminationpoint.DefaultConfig.builder();
         org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-            .ietftetopology.tenodeaugment.te.tunnelterminationpoint.DefaultConfig.builder();
-        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-            .ietftetopology.tenodeaugment.te.tunnelterminationpoint.State.StateBuilder ttpStateBuilder =
-        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-            .ietftetopology.tenodeaugment.te.tunnelterminationpoint.DefaultState.builder();
+                .ietftetopology.tenodeaugment.te.tunnelterminationpoint.State.StateBuilder ttpStateBuilder =
+                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+                        .ietftetopology.tenodeaugment.te.tunnelterminationpoint.DefaultState.builder();
 
         // Assuming teTunnelTp only has one interLayerLock
         if (teTunnelTp.interLayerLockList() != null && !teTunnelTp.interLayerLockList().isEmpty()) {
             ttpConfigBuilder = ttpConfigBuilder.interLayerLockId(teTunnelTp.interLayerLockList().get(0));
-            ttpStateBuilder  = ttpStateBuilder.interLayerLockId(teTunnelTp.interLayerLockList().get(0));
+            ttpStateBuilder = ttpStateBuilder.interLayerLockId(teTunnelTp.interLayerLockList().get(0));
         }
 
         TerminationCapability.TerminationCapabilityBuilder
-                            tcapConfigBuilder = DefaultTerminationCapability.builder();
+                tcapConfigBuilder = DefaultTerminationCapability.builder();
         // 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()
@@ -348,7 +377,7 @@
                         .network(netLinkKey.networkId()).links().get(netLinkKey.linkId());
                 tcapConfigBuilder = tcapConfigBuilder
                         .linkTp(TpId.fromString(networkLink.source().tpId()
-                                .toString()));
+                                                        .toString()));
                 // convert teLinkId to networkLinkKey
                 ttpConfigBuilder = ttpConfigBuilder.addToTerminationCapability(tcapConfigBuilder.build());
             }
@@ -367,13 +396,13 @@
                         .network(netLinkKey.networkId()).links().get(netLinkKey.linkId());
                 tcapStateBuilder = tcapStateBuilder
                         .linkTp(TpId.fromString(networkLink.source().tpId()
-                                .toString()));
+                                                        .toString()));
                 ttpStateBuilder = ttpStateBuilder.addToTerminationCapability(tcapStateBuilder.build());
             }
         }
 
         tunnelTpBuilder = tunnelTpBuilder.config(ttpConfigBuilder.build())
-                                         .state(ttpStateBuilder.build());
+                .state(ttpStateBuilder.build());
 
         return tunnelTpBuilder.build();
     }
@@ -381,9 +410,9 @@
     /**
      * Node object conversion from TE Topology subsystem to YANG.
      *
-     * @param teSubsystem TE subsystem node
+     * @param teSubsystem       TE subsystem node
      * @param teTopologyService teTopology core service
-     * @param teTopologyKey teTopologyKey
+     * @param teTopologyKey     teTopologyKey
      * @return YANG node
      */
     public static Node teSubsystem2YangNode(org.onosproject.tetopology.management.api.node.NetworkNode teSubsystem,
@@ -401,10 +430,10 @@
                     .builder();
             for (NetworkNodeKey nodeKey : teSubsystem.supportingNodeIds()) {
                 sNodes.add(spNodeBuilder
-                        .networkRef(NetworkId
-                                .fromString(nodeKey.networkId().toString()))
-                        .nodeRef(NodeId.fromString(nodeKey.nodeId().toString()))
-                        .build());
+                                   .networkRef(NetworkId
+                                                       .fromString(nodeKey.networkId().toString()))
+                                   .nodeRef(NodeId.fromString(nodeKey.nodeId().toString()))
+                                   .build());
             }
             builder = builder.supportingNode(sNodes);
         }
@@ -417,7 +446,7 @@
 
             for (TerminationPoint teTp : teSubsystemTeTp.values()) {
                 tpAugmentBuilder.addToTerminationPoint(TerminationPointConverter
-                        .teSubsystem2YangTerminationPoint(teTp));
+                                                               .teSubsystem2YangTerminationPoint(teTp));
             }
             builder.addYangAugmentedInfo(tpAugmentBuilder.build(),
                                          AugmentedNdNode.class);
@@ -432,21 +461,24 @@
             TeBuilder yangTeBuilder = DefaultTe.builder();
 
             yangTeBuilder = yangTeBuilder.teNodeId(TeNodeId.of(DottedQuad
-                    .of(Ip4Address.valueOf((int) teSubsystemTeNode.teNodeId())
-                            .toString())));
+                                                                       .of(Ip4Address.valueOf((int) teSubsystemTeNode
+                                                                               .teNodeId())
+                                                                                   .toString())));
 
             // Set configuration data
             // Set state data
             yangTeBuilder = yangTeBuilder.config(teNode2YangConfig(teSubsystemTeNode, teTopologyService))
-                                         .state(teNode2YangState(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(), teTopologyService,
-                                    new TeNodeKey(teTopologyKey, teSubsystemTeNode.teNodeId())));
+                            .addToTunnelTerminationPoint(teSubsystem2YangTtp(
+                                    entry.getValue(), entry.getKey(),
+                                    teTopologyService,
+                                    new TeNodeKey(teTopologyKey,
+                                                  teSubsystemTeNode.teNodeId())));
                 }
             }
 
@@ -460,12 +492,12 @@
     /**
      * Node object conversion from YANG to TE Topology subsystem.
      *
-     * @param yangNode Node in YANG model
+     * @param yangNode    Node in YANG model
      * @param yangNetwork YANG network
      * @return TE subsystem node
      */
     public static org.onosproject.tetopology.management.api.node.NetworkNode
-                    yang2TeSubsystemNode(Node yangNode, Network yangNetwork) {
+    yang2TeSubsystemNode(Node yangNode, Network yangNetwork) {
         checkNotNull(yangNode, E_NULL_YANG_NODE);
 
         org.onosproject.tetopology.management.api.node.DefaultNetworkNode node;
@@ -509,12 +541,12 @@
 
     // TODO: convert connectivity matrix from yang to te
     private static Map<Long, ConnectivityMatrix>
-                    yang2TeSubsystemNodeConnectivityMatrix(String networkId,
-                                                           String nodeId,
-                                                           List<org.onosproject.yang.gen.v1.urn.ietf
-                                                           .params.xml.ns.yang.ietf.te.topology.rev20160708
-                                                           .ietftetopology.tenodeconnectivitymatrix.
-                                                           ConnectivityMatrix> yangMatrix) {
+    yang2TeSubsystemNodeConnectivityMatrix(String networkId,
+                                           String nodeId,
+                                           List<org.onosproject.yang.gen.v1.urn.ietf
+                                                   .params.xml.ns.yang.ietf.te.topology.rev20160708
+                                                   .ietftetopology.tenodeconnectivitymatrix.
+                                                   ConnectivityMatrix> yangMatrix) {
 
         Map<Long, ConnectivityMatrix> teCmList = Maps.newHashMap();
 
@@ -544,8 +576,8 @@
             TePathAttributes teAttributes = new
                     TePathAttributes(cmYang.teDefaultMetric(),
                                      cmYang.performanceMetric() == null ? null :
-                                         (cmYang.performanceMetric().measurement() == null ? null :
-                                             cmYang.performanceMetric().measurement().unidirectionalDelay()),
+                                             (cmYang.performanceMetric().measurement() == null ? null :
+                                                     cmYang.performanceMetric().measurement().unidirectionalDelay()),
                                      srlgs);
             ConnectivityMatrix coreCm = new ConnectivityMatrix(cmYang.id(),
                                                                from,
@@ -570,7 +602,7 @@
 
     // 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, Node yangNode) {
+            TunnelTerminationPoint> yang2TeSubsystemTtp(List<TunnelTerminationPoint> ttps, Node yangNode) {
         Map<Long, org.onosproject.tetopology.management.api.node.TunnelTerminationPoint> ttpsMap = Maps
                 .newHashMap();
         for (TunnelTerminationPoint ttpYang : ttps) {
@@ -609,7 +641,7 @@
                                         && !tpItem.yangAugmentedInfoMap().isEmpty()) {
                                     AugmentedNtTerminationPoint yangTpAugment =
                                             (AugmentedNtTerminationPoint) tpItem
-                                            .yangAugmentedInfo(AugmentedNtTerminationPoint.class);
+                                                    .yangAugmentedInfo(AugmentedNtTerminationPoint.class);
                                     if (yangTpAugment.te() != null && yangTpAugment.te().teTpId() != null) {
                                         elt = new TeLinkId(Long.valueOf(yangTpAugment.te().teTpId().toString()));
                                         break;
@@ -623,7 +655,7 @@
                 }
             }
             TePathAttributes teAttributes = null; // how to find these
-                                                  // attributes from ttpYang?
+            // attributes from ttpYang?
             UnderlayAbstractPath underlayPath = null; // how to find underlayAbstractPath from ttpYang?
             LocalLinkConnectivity llc = new LocalLinkConnectivity(eltList,
                                                                   flags,
@@ -634,15 +666,15 @@
             float[] availAdaptBandwidth = null; // how to find availableBandwidth?
 
             org.onosproject.tetopology.management.api.node.
-                TunnelTerminationPoint ttpTe = new
-                org.onosproject.tetopology.management.api.node.
-                DefaultTunnelTerminationPoint(ByteUtils.bytesToLong(ttpYang.tunnelTpId()),
-                                              switchingLayer,
-                                              encodingLayer,
-                                              flags,
-                                              interLayerLockList,
-                                              localLinkConnectivityList,
-                                              availAdaptBandwidth);
+                    TunnelTerminationPoint ttpTe = new
+                    org.onosproject.tetopology.management.api.node.
+                            DefaultTunnelTerminationPoint(ByteUtils.bytesToLong(ttpYang.tunnelTpId()),
+                                                          switchingLayer,
+                                                          encodingLayer,
+                                                          flags,
+                                                          interLayerLockList,
+                                                          localLinkConnectivityList,
+                                                          availAdaptBandwidth);
 
             ttpsMap.put(ByteUtils.bytesToLong(ttpYang.tunnelTpId()), ttpTe);
         }
@@ -712,22 +744,22 @@
                 if (teNodeAttr.underlayTopology() != null) {
 
                     underlayTopologyIdId = yang2TeSubsystemNodeUnderlayTopology(teNodeAttr
-                            .underlayTopology());
+                                                                                        .underlayTopology());
                 }
                 BitSet flags = new BitSet();
                 if (teNodeAttr.isAbstract()) {
                     flags.set(TeNode.BIT_ABSTRACT);
                 }
                 teData = new CommonNodeData(
-                                            null, // teNodeAttr.name().string(),
-                                            EnumConverter.yang2TeSubsystemAdminStatus(teNodeAttr.adminStatus()),
-                                            EnumConverter.yang2TeSubsystemOpStatus(yangNodeAugTe.state().operStatus()),
-                                            flags);
+                        null, // teNodeAttr.name().string(),
+                        EnumConverter.yang2TeSubsystemAdminStatus(teNodeAttr.adminStatus()),
+                        EnumConverter.yang2TeSubsystemOpStatus(yangNodeAugTe.state().operStatus()),
+                        flags);
 
                 if (teNodeAttr.connectivityMatrix() != null) {
                     connMatrices = yang2TeSubsystemNodeConnectivityMatrix(yangNetworkId.uri().toString(),
-                                                                    yangNodeId.uri().toString(),
-                                                                    teNodeAttr.connectivityMatrix());
+                                                                          yangNodeId.uri().toString(),
+                                                                          teNodeAttr.connectivityMatrix());
                 }
 
             }
@@ -769,7 +801,7 @@
      * to its corresponding YANG Object (YO) format.
      *
      * @param eventType Node event type
-     * @param eventData  TE Topology node event data
+     * @param eventData TE Topology node event data
      * @return YANG Object converted from nodeData
      */
     public static TeNodeEvent teNetworkNode2yangTeNodeEvent(TeTopologyEventTypeEnum eventType,
@@ -788,7 +820,7 @@
         org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
                 rev20160708.ietftetopology.tenodeconfigattributesnotification.
                 TeNodeAttributes teNodeAttributes = node == null ? null
-                                                                 : teNode2YangTeNodeAttributes(node.teNode());
+                : teNode2YangTeNodeAttributes(node.teNode());
         builder.teNodeAttributes(teNodeAttributes);
 
         return builder.build();
@@ -809,31 +841,31 @@
         if (teNode.connectivityMatrices() != null) {
 
             org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-            .tenodeconnectivitymatrixabs.DefaultConnectivityMatrix
-            .ConnectivityMatrixBuilder connectivityMatrixConfigBuilder = org.onosproject.yang.gen.v1.urn.ietf.
-            params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrixabs.
-            DefaultConnectivityMatrix.builder();
+                    .tenodeconnectivitymatrixabs.DefaultConnectivityMatrix
+                    .ConnectivityMatrixBuilder connectivityMatrixConfigBuilder = org.onosproject.yang.gen.v1.urn.ietf.
+                    params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrixabs.
+                    DefaultConnectivityMatrix.builder();
             for (Map.Entry<Long, ConnectivityMatrix> teCmEntry :
-                teNode.connectivityMatrices().entrySet()) {
+                    teNode.connectivityMatrices().entrySet()) {
                 connectivityMatrixConfigBuilder = connectivityMatrixConfigBuilder
                         .id(teCmEntry.getKey())
                         .isAllowed(!teCmEntry.getValue().flags()
-                                   .get(ConnectivityMatrix.BIT_DISALLOWED))
+                                .get(ConnectivityMatrix.BIT_DISALLOWED))
                         .from(new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                              .ietftetopology.tenodeconnectivitymatrixabs.connectivitymatrix.DefaultFrom
-                              .FromBuilder() // TODO: for now, assuming that there is
-                                                            // only one 'from', and mergingList is empty
-                              .tpRef(teCmEntry.getValue().from())
-                                             .build())
+                                .ietftetopology.tenodeconnectivitymatrixabs.connectivitymatrix.DefaultFrom
+                                .FromBuilder() // TODO: for now, assuming that there is
+                                      // only one 'from', and mergingList is empty
+                                      .tpRef(teCmEntry.getValue().from())
+                                      .build())
                         .to(new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                            .ietftetopology.tenodeconnectivitymatrixabs.connectivitymatrix
-                            .DefaultTo.ToBuilder() // TODO: for now, assuming that there is only
-                                                      // one item in constrainingElements list
-                              .tpRef(teCmEntry.getValue().constrainingElements().get(0))
-                                             .build());
+                                .ietftetopology.tenodeconnectivitymatrixabs.connectivitymatrix
+                                .DefaultTo.ToBuilder() // TODO: for now, assuming that there is only
+                                    // one item in constrainingElements list
+                                    .tpRef(teCmEntry.getValue().constrainingElements().get(0))
+                                    .build());
                 attrBuilder = attrBuilder
                         .addToConnectivityMatrix(connectivityMatrixConfigBuilder
-                                .build());
+                                                         .build());
             }
         }
 
@@ -844,6 +876,12 @@
         return teNodeAttributes;
     }
 
+    /**
+     * Retrieves the TE network node key from a YANG network node notification event.
+     *
+     * @param yangNodeEvent YANG network node notification event
+     * @return TE network node key
+     */
     public static NetworkNodeKey yangNodeEvent2NetworkNodeKey(TeNodeEvent yangNodeEvent) {
         NetworkId networkRef = NetworkId.fromString(yangNodeEvent.networkRef().toString());
         NodeId nodeRef = NodeId.fromString(yangNodeEvent.nodeRef().toString());
@@ -858,7 +896,7 @@
     /**
      * Converts YangNode event to NetworkNode.
      *
-     * @param yangNodeEvent yangNodeEvent
+     * @param yangNodeEvent     yangNodeEvent
      * @param teTopologyService teTopologyService
      * @return NetworkNode
      */
@@ -954,12 +992,12 @@
     }
 
     private static ConnectivityMatrix yangNodeEvent2TeConnectivityMatrix(org.onosproject.yang.gen.v1.
-                                                                         urn.ietf.params.xml.ns.yang.
-                                                                         ietf.te.topology
-                                                                         .rev20160708.ietftetopology
-                                                                         .tenodeconnectivitymatrixabs
-                                                                         .ConnectivityMatrix yangConnMatrix,
-                                                                 ConnectivityMatrix oldTeConnMatrix) {
+                                                                                 urn.ietf.params.xml.ns.yang.
+                                                                                 ietf.te.topology
+                                                                                 .rev20160708.ietftetopology
+                                                                                 .tenodeconnectivitymatrixabs
+                                                                                 .ConnectivityMatrix yangConnMatrix,
+                                                                         ConnectivityMatrix oldTeConnMatrix) {
 
         long id = yangConnMatrix.id();
         ElementType from = new TeLinkId((long) (yangConnMatrix.from().tpRef()));
diff --git a/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfSBController.java b/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfSBController.java
index 772aaea..bb565f2 100644
--- a/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfSBController.java
+++ b/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfSBController.java
@@ -31,29 +31,41 @@
      * callBackListener upon receiving notifications to notify the requester
      * about notifications.
      *
-     *
-     * @param device device to make the request to
-     * @param request url of the request
-     * @param mediaType format to retrieve the content in
+     * @param device           device to make the request to
+     * @param request          url of the request
+     * @param mediaType        format to retrieve the content in
      * @param callBackListener method to call when notifications arrives
      */
     void enableNotifications(DeviceId device, String request, String mediaType,
-                          RestConfNotificationEventListener callBackListener);
+                             RestconfNotificationEventListener callBackListener);
 
     /**
-     * Register a listener for notification events that occur to restconf
+     * Registers a listener for notification events that occur to restconf
      * devices.
      *
-     * @param deviceId the deviceId
+     * @param deviceId identifier of the device to which the listener is attached
      * @param listener the listener to notify
      */
     void addNotificationListener(DeviceId deviceId,
-                                 RestConfNotificationEventListener listener);
+                                 RestconfNotificationEventListener listener);
 
     /**
-     * Unregister the listener for the device.
+     * Unregisters the listener for the device.
      *
-     * @param deviceId the deviceId
+     * @param deviceId identifier of the device for which the listener
+     *                 is to be removed
+     * @param listener listener to be removed
      */
-    void removeNotificationListener(DeviceId deviceId);
+    void removeNotificationListener(DeviceId deviceId,
+                                    RestconfNotificationEventListener listener);
+
+    /**
+     * Returns true if a listener has been installed to listen to RESTCONF
+     * notifications sent from a particular device.
+     *
+     * @param deviceId identifier of the device from which the notifications
+     *                 are generated
+     * @return true if listener is installed; false otherwise
+     */
+    boolean isNotificationEnabled(DeviceId deviceId);
 }
diff --git a/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfNotificationEventListener.java b/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestconfNotificationEventListener.java
similarity index 76%
rename from protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfNotificationEventListener.java
rename to protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestconfNotificationEventListener.java
index 7866587..230724b 100644
--- a/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestConfNotificationEventListener.java
+++ b/protocols/restconf/client/api/src/main/java/org/onosproject/protocol/restconf/RestconfNotificationEventListener.java
@@ -20,13 +20,13 @@
 /**
  * Notifies providers about incoming RESTCONF notification events.
  */
-public interface RestConfNotificationEventListener<T> {
+public interface RestconfNotificationEventListener<T> {
 
     /**
      * Handles the notification event.
      *
-     * @param deviceId        restconf device identifier
-     * @param eventJsonString the json string representation of the event
+     * @param deviceId restconf device identifier
+     * @param event    event payload
      */
-    void handleNotificationEvent(DeviceId deviceId, T eventJsonString);
+    void handleNotificationEvent(DeviceId deviceId, T event);
 }
diff --git a/protocols/restconf/client/ctl/src/main/java/org/onosproject/protocol/restconf/ctl/RestConfSBControllerImpl.java b/protocols/restconf/client/ctl/src/main/java/org/onosproject/protocol/restconf/ctl/RestConfSBControllerImpl.java
index ce6335b..897f6c7 100644
--- a/protocols/restconf/client/ctl/src/main/java/org/onosproject/protocol/restconf/ctl/RestConfSBControllerImpl.java
+++ b/protocols/restconf/client/ctl/src/main/java/org/onosproject/protocol/restconf/ctl/RestConfSBControllerImpl.java
@@ -15,16 +15,6 @@
  */
 package org.onosproject.protocol.restconf.ctl;
 
-import java.io.InputStream;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.GenericType;
-import javax.ws.rs.core.Response;
-
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -36,13 +26,24 @@
 import org.onosproject.net.DeviceId;
 import org.onosproject.protocol.http.ctl.HttpSBControllerImpl;
 import org.onosproject.protocol.rest.RestSBDevice;
-import org.onosproject.protocol.restconf.RestConfNotificationEventListener;
 import org.onosproject.protocol.restconf.RestConfSBController;
+import org.onosproject.protocol.restconf.RestconfNotificationEventListener;
 import org.onosproject.yms.ych.YangProtocolEncodingFormat;
 import org.onosproject.yms.ymsm.YmsService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.core.GenericType;
+import javax.ws.rs.core.Response;
+import java.io.InputStream;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
 /**
  * The implementation of RestConfSBController.
  */
@@ -62,8 +63,8 @@
     private static final String RESOURCE_PATH_PREFIX = "/data/";
     private static final String NOTIFICATION_PATH_PREFIX = "/streams/";
 
-    private Map<DeviceId, RestConfNotificationEventListener>
-                                            restconfNotificationListenerMap = new ConcurrentHashMap<>();
+    private Map<DeviceId, Set<RestconfNotificationEventListener>>
+            restconfNotificationListenerMap = new ConcurrentHashMap<>();
     private Map<DeviceId, GetChunksRunnable> runnableTable = new ConcurrentHashMap<>();
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
@@ -168,8 +169,13 @@
 
     @Override
     public void enableNotifications(DeviceId device, String request,
-                                 String mediaType,
-                                 RestConfNotificationEventListener listener) {
+                                    String mediaType,
+                                    RestconfNotificationEventListener listener) {
+
+        if (isNotificationEnabled(device)) {
+            log.warn("enableNotifications: already enabled on device: {}", device);
+            return;
+        }
 
         request = discoverRootResource(device) + NOTIFICATION_PATH_PREFIX
                 + request;
@@ -183,10 +189,9 @@
     }
 
     public void stopNotifications(DeviceId device) {
-
         runnableTable.get(device).terminate();
         runnableTable.remove(device);
-        removeNotificationListener(device);
+        restconfNotificationListenerMap.remove(device);
         log.debug("Stop sending notifications for device URI: " + device.uri().toString());
 
     }
@@ -203,9 +208,9 @@
         }
 
         /**
-         * @param request request
+         * @param request   request
          * @param mediaType media type
-         * @param device device identifier
+         * @param device    device identifier
          */
         public GetChunksRunnable(String request, String mediaType,
                                  DeviceId device) {
@@ -218,8 +223,8 @@
         public void run() {
             WebTarget wt = getWebTarget(device, request);
             Response clientResp = wt.request(mediaType).get();
-            RestConfNotificationEventListener listener = restconfNotificationListenerMap
-                    .get(device);
+            Set<RestconfNotificationEventListener> listeners =
+                    restconfNotificationListenerMap.get(device);
             final ChunkedInput<String> chunkedInput = (ChunkedInput<String>) clientResp
                     .readEntity(new GenericType<ChunkedInput<String>>() {
                     });
@@ -233,10 +238,12 @@
                 chunk = chunkedInput.read();
                 if (chunk != null) {
                     if (running) {
-                        listener.handleNotificationEvent(device, chunk);
+                        for (RestconfNotificationEventListener listener : listeners) {
+                            listener.handleNotificationEvent(device, chunk);
+                        }
                     } else {
                         log.trace("the requesting client is no more interested "
-                                + "to receive such notifications.");
+                                          + "to receive such notifications.");
                     }
                 } else {
                     log.trace("The received notification chunk is null. do not continue any more.");
@@ -256,15 +263,29 @@
 
     @Override
     public void addNotificationListener(DeviceId deviceId,
-                                        RestConfNotificationEventListener listener) {
-        if (!restconfNotificationListenerMap.containsKey(deviceId)) {
-            this.restconfNotificationListenerMap.put(deviceId, listener);
+                                        RestconfNotificationEventListener listener) {
+        Set<RestconfNotificationEventListener> listeners =
+                restconfNotificationListenerMap.get(deviceId);
+        if (listeners == null) {
+            listeners = new HashSet<>();
         }
+
+        listeners.add(listener);
+
+        this.restconfNotificationListenerMap.put(deviceId, listeners);
     }
 
     @Override
-    public void removeNotificationListener(DeviceId deviceId) {
-        this.restconfNotificationListenerMap.remove(deviceId);
+    public void removeNotificationListener(DeviceId deviceId,
+                                           RestconfNotificationEventListener listener) {
+        Set<RestconfNotificationEventListener> listeners =
+                restconfNotificationListenerMap.get(deviceId);
+        if (listeners != null) {
+            listeners.remove(listener);
+        }
     }
 
+    public boolean isNotificationEnabled(DeviceId deviceId) {
+        return runnableTable.containsKey(deviceId);
+    }
 }
diff --git a/providers/ietfte/pom.xml b/providers/ietfte/pom.xml
index 1931d2f..8661bdf 100644
--- a/providers/ietfte/pom.xml
+++ b/providers/ietfte/pom.xml
@@ -28,18 +28,6 @@
 
     <artifactId>onos-ietfte-providers</artifactId>
     <packaging>pom</packaging>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>1.6</source>
-                    <target>1.6</target>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
     <modules>
         <module>topology</module>
         <module>tunnel</module>
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 c75f01d..a377e51 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
@@ -34,9 +34,10 @@
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.protocol.rest.RestSBDevice;
-import org.onosproject.protocol.restconf.RestConfNotificationEventListener;
 import org.onosproject.protocol.restconf.RestConfSBController;
 import org.onosproject.provider.te.utils.DefaultJsonCodec;
+import org.onosproject.provider.te.utils.RestconfNotificationEventProcessor;
+import org.onosproject.provider.te.utils.TeTopologyRestconfEventListener;
 import org.onosproject.provider.te.utils.YangCompositeEncodingImpl;
 import org.onosproject.tetopology.management.api.TeTopologyProvider;
 import org.onosproject.tetopology.management.api.TeTopologyProviderRegistry;
@@ -78,6 +79,8 @@
 import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_ADDED;
 import static org.onosproject.net.config.NetworkConfigEvent.Type.CONFIG_UPDATED;
 import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
+import static org.onosproject.provider.te.utils.TeTopologyRestconfEventType.TE_TOPOLOGY_LINK_NOTIFICATION;
+import static org.onosproject.provider.te.utils.TeTopologyRestconfEventType.TE_TOPOLOGY_NODE_NOTIFICATION;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -93,8 +96,6 @@
     private static final String IETF_NETWORK_URI = "ietf-network:networks";
     private static final String IETF_NETWORKS_PREFIX =
             "{\"ietf-network:networks\":";
-    private static final String TE_NOTIFICATION_PREFIX =
-            "{\"ietf-te-topology:ietf-te-topology\":";
     private static final String TE_LINK_EVENT_PREFIX =
             "{\"ietf-te-topology:te-link-event\":";
     private static final String TE_NODE_EVENT_PREFIX =
@@ -290,11 +291,27 @@
 //            topologyProviderService.networkUpdated(network);
 //        }
 
-        RestConfNotificationEventListener<String> callBackListener =
-                new InternalRestconfNotificationEventListener();
-        restconfClient.enableNotifications(deviceId, IETF_NOTIFICATION_URI,
-                                           "application/json",
-                                           callBackListener);
+        subscribeRestconfNotification(deviceId);
+    }
+
+    private void subscribeRestconfNotification(DeviceId deviceId) {
+
+        TeTopologyRestconfEventListener listener =
+                new TeTopologyRestconfEventListener();
+
+        listener.addCallbackFunction(TE_TOPOLOGY_LINK_NOTIFICATION,
+                                     new InternalLinkEventProcessor());
+        listener.addCallbackFunction(TE_TOPOLOGY_NODE_NOTIFICATION,
+                                     new InternalNodeEventProcessor());
+
+        if (!restconfClient.isNotificationEnabled(deviceId)) {
+            restconfClient.enableNotifications(deviceId,
+                                               IETF_NOTIFICATION_URI,
+                                               "application/json",
+                                               listener);
+        } else {
+            restconfClient.addNotificationListener(deviceId, listener);
+        }
     }
 
     private String removePrefixTagFromJson(String jsonString, String prefixTag) {
@@ -304,42 +321,15 @@
         return jsonString;
     }
 
-    private class InternalNetworkConfigListener implements NetworkConfigListener {
+    private class InternalLinkEventProcessor implements
+            RestconfNotificationEventProcessor<String> {
 
         @Override
-        public void event(NetworkConfigEvent event) {
-            executor.execute(TeTopologyRestconfProvider.this::connectDevices);
-        }
-
-        @Override
-        public boolean isRelevant(NetworkConfigEvent event) {
-            return event.configClass().equals(RestconfServerConfig.class) &&
-                    (event.type() == CONFIG_ADDED ||
-                            event.type() == CONFIG_UPDATED);
-        }
-    }
-
-    private class InternalRestconfNotificationEventListener implements
-            RestConfNotificationEventListener<String> {
-        @Override
-        public void handleNotificationEvent(DeviceId deviceId,
-                                            String eventJsonString) {
-            log.debug("New notification: {} for device: {}",
-                      eventJsonString, deviceId.toString());
-
-            String teEventString = removePrefixTagFromJson(eventJsonString,
-                                                           TE_NOTIFICATION_PREFIX);
-            if (teEventString.startsWith(TE_LINK_EVENT_PREFIX)) {
-                String linkString = removePrefixTagFromJson(teEventString,
-                                                            TE_LINK_EVENT_PREFIX);
-                log.debug("link event={}", linkString);
-                handleRestconfLinkNotification(linkString);
-            } else if (teEventString.startsWith(TE_NODE_EVENT_PREFIX)) {
-                String nodeString = removePrefixTagFromJson(teEventString,
-                                                            TE_NODE_EVENT_PREFIX);
-                log.debug("node event={}", nodeString);
-                handleRestconfNodeNotification(nodeString);
-            }
+        public void processEventPayload(String payload) {
+            String linkString = removePrefixTagFromJson(payload,
+                                                        TE_LINK_EVENT_PREFIX);
+            log.debug("link event={}", linkString);
+            handleRestconfLinkNotification(linkString);
         }
 
         private void handleRestconfLinkNotification(String linkString) {
@@ -377,29 +367,16 @@
 
             topologyProviderService.linkUpdated(linkKey, networkLink);
         }
+    }
 
-        private IetfTeTopologyEvent convertJson2IetfTeTopologyEvent(String uriString,
-                                                                    String jsonBody) {
+    private class InternalNodeEventProcessor implements
+            RestconfNotificationEventProcessor<String> {
 
-            YangCompositeEncodingImpl yce =
-                    new YangCompositeEncodingImpl(YangResourceIdentifierType.URI,
-                                                  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;
+        @Override
+        public void processEventPayload(String payload) {
+            String nodeString = removePrefixTagFromJson(payload, TE_NODE_EVENT_PREFIX);
+            log.debug("node event={}", nodeString);
+            handleRestconfNodeNotification(nodeString);
         }
 
         private void handleRestconfNodeNotification(String nodeString) {
@@ -437,4 +414,43 @@
             topologyProviderService.nodeUpdated(nodeKey, networkNode);
         }
     }
+
+    private class InternalNetworkConfigListener implements NetworkConfigListener {
+
+        @Override
+        public void event(NetworkConfigEvent event) {
+            executor.execute(TeTopologyRestconfProvider.this::connectDevices);
+        }
+
+        @Override
+        public boolean isRelevant(NetworkConfigEvent event) {
+            return event.configClass().equals(RestconfServerConfig.class) &&
+                    (event.type() == CONFIG_ADDED ||
+                            event.type() == CONFIG_UPDATED);
+        }
+    }
+
+    private IetfTeTopologyEvent convertJson2IetfTeTopologyEvent(String uriString,
+                                                                String jsonBody) {
+
+        YangCompositeEncodingImpl yce =
+                new YangCompositeEncodingImpl(YangResourceIdentifierType.URI,
+                                              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;
+    }
 }
diff --git a/providers/ietfte/tunnel/src/main/java/org/onosproject/provider/te/tunnel/TeTunnelRestconfProvider.java b/providers/ietfte/tunnel/src/main/java/org/onosproject/provider/te/tunnel/TeTunnelRestconfProvider.java
index 3a081ce..1d9468d 100644
--- a/providers/ietfte/tunnel/src/main/java/org/onosproject/provider/te/tunnel/TeTunnelRestconfProvider.java
+++ b/providers/ietfte/tunnel/src/main/java/org/onosproject/provider/te/tunnel/TeTunnelRestconfProvider.java
@@ -33,8 +33,8 @@
 import org.onosproject.net.Path;
 import org.onosproject.net.provider.AbstractProvider;
 import org.onosproject.net.provider.ProviderId;
-import org.onosproject.protocol.restconf.RestConfNotificationEventListener;
 import org.onosproject.protocol.restconf.RestConfSBController;
+import org.onosproject.protocol.restconf.RestconfNotificationEventListener;
 import org.onosproject.provider.te.utils.DefaultJsonCodec;
 import org.onosproject.provider.te.utils.YangCompositeEncodingImpl;
 import org.onosproject.tetopology.management.api.TeTopology;
@@ -89,6 +89,7 @@
     private static final int DEFAULT_INDEX = 1;
     private static final String TUNNELS = "tunnels";
     private static final String TUNNELS_URL = IETF + ":" + TE + "/" + TUNNELS;
+    private static final String IETF_NOTIFICATION_URI = "netconf";
     private static final String MEDIA_TYPE_JSON = "json";
 
     private static final String SHOULD_IN_ONE = "Tunnel should be setup in one topo";
@@ -96,8 +97,8 @@
     private static final String RESTCONF_ROOT = "/onos/restconf";
     private static final String TE_TUNNEL_KEY = "TeTunnelKey";
 
-    private final RestConfNotificationEventListener listener =
-            new InternalTunnelNotificationListener();
+    //private final RestconfNotificationEventListener listener =
+    //        new InternalTunnelNotificationListener();
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected RestConfSBController controller;
@@ -165,9 +166,14 @@
     private void subscribe() {
         for (DeviceId deviceId : controller.getDevices().keySet()) {
             try {
-                controller.enableNotifications(deviceId, TUNNELS_URL,
-                                               MEDIA_TYPE_JSON,
-                                               listener);
+                if (!controller.isNotificationEnabled(deviceId)) {
+                    controller.enableNotifications(deviceId, IETF_NOTIFICATION_URI,
+                                                   "application/json",
+                                                   new InternalTunnelNotificationListener());
+                } else {
+                    controller.addNotificationListener(deviceId,
+                                                       new InternalTunnelNotificationListener());
+                }
             } catch (Exception e) {
                 log.error("Failed to subscribe for {} : {}", deviceId,
                           e.getMessage());
@@ -179,7 +185,8 @@
         controller.getDevices()
                 .keySet()
                 .forEach(deviceId -> controller
-                        .removeNotificationListener(deviceId));
+                        .removeNotificationListener(deviceId,
+                                                    new InternalTunnelNotificationListener()));
     }
 
     @Override
@@ -343,8 +350,9 @@
         return deviceId;
     }
 
+
     private class InternalTunnelNotificationListener implements
-            RestConfNotificationEventListener {
+            RestconfNotificationEventListener {
 
         @Override
         public void handleNotificationEvent(DeviceId deviceId, Object eventJsonString) {
diff --git a/providers/ietfte/utils/BUCK b/providers/ietfte/utils/BUCK
index 7817d31..0964039 100644
--- a/providers/ietfte/utils/BUCK
+++ b/providers/ietfte/utils/BUCK
@@ -2,6 +2,7 @@
     '//lib:CORE_DEPS',
     '//apps/yms/api:onos-apps-yms-api',
     '//protocols/restconf/server/utils:onos-protocols-restconf-server-utils',
+    '//protocols/restconf/client/api:onos-protocols-restconf-client-api',
 ]
 
 TEST_DEPS = [
diff --git a/providers/ietfte/utils/pom.xml b/providers/ietfte/utils/pom.xml
index 35c727e..3174a8b 100644
--- a/providers/ietfte/utils/pom.xml
+++ b/providers/ietfte/utils/pom.xml
@@ -37,10 +37,13 @@
         </dependency>
         <dependency>
             <groupId>org.onosproject</groupId>
+            <artifactId>onos-restconf-client-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
             <artifactId>onos-restconf-server-utils</artifactId>
             <version>${project.version}</version>
         </dependency>
     </dependencies>
-
-
-</project>
\ No newline at end of file
+</project>
diff --git a/providers/ietfte/utils/src/main/java/org/onosproject/provider/te/utils/RestconfNotificationEventProcessor.java b/providers/ietfte/utils/src/main/java/org/onosproject/provider/te/utils/RestconfNotificationEventProcessor.java
new file mode 100644
index 0000000..7f6ea2e
--- /dev/null
+++ b/providers/ietfte/utils/src/main/java/org/onosproject/provider/te/utils/RestconfNotificationEventProcessor.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.provider.te.utils;
+
+/**
+ * Abstraction of the RESTCONF notification callback function. The callback
+ * is invoked by the notification listener when it receives an event.
+ */
+public interface RestconfNotificationEventProcessor<T> {
+    void processEventPayload(T event);
+}
diff --git a/providers/ietfte/utils/src/main/java/org/onosproject/provider/te/utils/TeTopologyRestconfEventListener.java b/providers/ietfte/utils/src/main/java/org/onosproject/provider/te/utils/TeTopologyRestconfEventListener.java
new file mode 100644
index 0000000..668fec6
--- /dev/null
+++ b/providers/ietfte/utils/src/main/java/org/onosproject/provider/te/utils/TeTopologyRestconfEventListener.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.provider.te.utils;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.protocol.restconf.RestconfNotificationEventListener;
+import org.slf4j.Logger;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Implementation of the RESTCONF notification event
+ * listener for TE Topology.
+ */
+public class TeTopologyRestconfEventListener implements
+        RestconfNotificationEventListener<String> {
+    private static final String TE_TOPOLOGY_NOTIFICATION_PREFIX =
+            "{\"ietf-te-topology:ietf-te-topology\":";
+    private static final String TE_LINK_EVENT_PREFIX =
+            "{\"ietf-te-topology:te-link-event\":";
+    private static final String TE_NODE_EVENT_PREFIX =
+            "{\"ietf-te-topology:te-node-event\":";
+
+    private final Logger log = getLogger(getClass());
+
+    private Map<TeTopologyRestconfEventType, RestconfNotificationEventProcessor>
+            eventCallbackFunctionMap = new ConcurrentHashMap<>();
+
+    @Override
+    public void handleNotificationEvent(DeviceId deviceId,
+                                        String eventJsonString) {
+        log.debug("New notification: {} for device: {}",
+                  eventJsonString, deviceId.toString());
+
+        if (!eventJsonString.startsWith(TE_TOPOLOGY_NOTIFICATION_PREFIX)) {
+            // This is not a TE topology event.
+            return;
+        }
+
+        String teEventString = removePrefixTagFromJson(eventJsonString,
+                                                       TE_TOPOLOGY_NOTIFICATION_PREFIX);
+
+        TeTopologyRestconfEventType eventType = getEventType(teEventString);
+
+        if (eventType == TeTopologyRestconfEventType.TE_UNKNOWN_EVENT) {
+            log.error("handleNotificationEvent: unknown event: {}", eventJsonString);
+            return;
+        }
+
+        RestconfNotificationEventProcessor eventProcessor =
+                eventCallbackFunctionMap.get(eventType);
+
+        if (eventProcessor != null) {
+            eventProcessor.processEventPayload(teEventString);
+        } else {
+            log.info("Event callback not installed for event type: {}", eventType);
+        }
+    }
+
+    /**
+     * Registers an notification event callback function which is called by
+     * the listener when it receives an event.
+     *
+     * @param eventType      notification event type corresponding to the
+     *                       callback function
+     * @param eventProcessor callback function
+     */
+    public void addCallbackFunction(TeTopologyRestconfEventType eventType,
+                                    RestconfNotificationEventProcessor eventProcessor) {
+        if (eventCallbackFunctionMap.containsKey(eventType)) {
+            removeCallbackFunction(eventType);
+        }
+
+        eventCallbackFunctionMap.put(eventType, eventProcessor);
+    }
+
+    /**
+     * Removes the callback function associated with the given event type.
+     *
+     * @param eventType notification event type
+     */
+    public void removeCallbackFunction(TeTopologyRestconfEventType eventType) {
+        eventCallbackFunctionMap.remove(eventType);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        TeTopologyRestconfEventListener that = (TeTopologyRestconfEventListener) o;
+
+        return eventCallbackFunctionMap != null ?
+                eventCallbackFunctionMap.equals(that.eventCallbackFunctionMap) :
+                that.eventCallbackFunctionMap == null;
+    }
+
+    @Override
+    public int hashCode() {
+        return eventCallbackFunctionMap != null ? eventCallbackFunctionMap.hashCode() : 0;
+    }
+
+    private String removePrefixTagFromJson(String jsonString, String prefixTag) {
+        if (jsonString.startsWith(prefixTag)) {
+            return jsonString.substring(prefixTag.length(), jsonString.length() - 1);
+        }
+        return jsonString;
+    }
+
+    private TeTopologyRestconfEventType getEventType(String teEventString) {
+        if (teEventString.startsWith(TE_LINK_EVENT_PREFIX)) {
+            return TeTopologyRestconfEventType.TE_TOPOLOGY_LINK_NOTIFICATION;
+        }
+
+        if (teEventString.startsWith(TE_NODE_EVENT_PREFIX)) {
+            return TeTopologyRestconfEventType.TE_TOPOLOGY_NODE_NOTIFICATION;
+        }
+
+        return TeTopologyRestconfEventType.TE_UNKNOWN_EVENT;
+    }
+}
+
diff --git a/providers/ietfte/utils/src/main/java/org/onosproject/provider/te/utils/TeTopologyRestconfEventType.java b/providers/ietfte/utils/src/main/java/org/onosproject/provider/te/utils/TeTopologyRestconfEventType.java
new file mode 100644
index 0000000..6806023
--- /dev/null
+++ b/providers/ietfte/utils/src/main/java/org/onosproject/provider/te/utils/TeTopologyRestconfEventType.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onosproject.provider.te.utils;
+
+/**
+ * Types of TE Topology RESTCONF notification events.
+ */
+public enum TeTopologyRestconfEventType {
+    /**
+     * TE topology link event type.
+     */
+    TE_TOPOLOGY_LINK_NOTIFICATION,
+
+    /**
+     * TE topology node event type.
+     */
+    TE_TOPOLOGY_NODE_NOTIFICATION,
+
+    /**
+     * Unknown or unsupported event type.
+     */
+    TE_UNKNOWN_EVENT,
+}