diff --git a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/EnumConverter.java b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/EnumConverter.java
index 49b69a6..f784fa7 100644
--- a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/EnumConverter.java
+++ b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/EnumConverter.java
@@ -15,12 +15,6 @@
  */
 package org.onosproject.teyang.utils.topology;
 
-import org.onosproject.tetopology.management.api.node.TeStatus;
-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.TeOperStatus;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.teadminstatus.TeAdminStatusEnum;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.teoperstatus.TeOperStatusEnum;
-
 /**
  * The Enum conversion functions.
  */
@@ -30,104 +24,5 @@
     private EnumConverter() {
     }
 
-    /**
-     * Converts YANG Operation Status Enum to TE Topology TeStatus Enum.
-     *
-     * @param opStatus YANG Operation Status
-     * @return the equivalent Enum from TE Topology TeStatus or null if not
-     *         found
-     */
-    public static TeStatus yang2TeSubsystemOpStatus(TeOperStatus opStatus) {
-        switch (opStatus.enumeration()) {
-        case DOWN:
-            return TeStatus.DOWN;
-        case UP:
-            return TeStatus.UP;
-        case MAINTENANCE:
-            return TeStatus.MAINTENANCE;
-        case PREPARING_MAINTENANCE:
-            return TeStatus.PREPARING_MAINTENANCE;
-        case TESTING:
-            return TeStatus.TESTING;
-        case UNKNOWN:
-            return TeStatus.UNKNOWN;
-        default:
-            return null;
-        }
-    }
-
-    /**
-     * Converts YANG TeAdminStatus Enum to TE Topology TeStatus Enum.
-     *
-     * @param adminStatus YANG Admin Status
-     * @return the equivalent Enum from TE Topology TeStatus or null if not
-     *         found
-     */
-    public static TeStatus yang2TeSubsystemAdminStatus(TeAdminStatus adminStatus) {
-        switch (adminStatus.enumeration()) {
-        case DOWN:
-            return TeStatus.DOWN;
-        case UP:
-            return TeStatus.UP;
-        case TESTING:
-            return TeStatus.TESTING;
-        case MAINTENANCE:
-            return TeStatus.MAINTENANCE;
-        case PREPARING_MAINTENANCE:
-            return TeStatus.PREPARING_MAINTENANCE;
-        default:
-            return TeStatus.UNKNOWN;
-        }
-    }
-
-    /**
-     * Converts TE Topology TeStatus Enum to YANG TeAdminStatus Enum.
-     *
-     * @param adminStatus TE Topology admin status
-     * @return the equivalent Enum from YANG TeAdminStatus or null if not found
-     */
-    public static TeAdminStatus teSubsystem2YangAdminStatus(TeStatus adminStatus) {
-        switch (adminStatus) {
-        case DOWN:
-            return TeAdminStatus.of(TeAdminStatusEnum.DOWN);
-        case UP:
-            return TeAdminStatus.of(TeAdminStatusEnum.UP);
-        case TESTING:
-            return TeAdminStatus.of(TeAdminStatusEnum.TESTING);
-        case MAINTENANCE:
-            return TeAdminStatus.of(TeAdminStatusEnum.MAINTENANCE);
-        case PREPARING_MAINTENANCE:
-            return TeAdminStatus.of(TeAdminStatusEnum.PREPARING_MAINTENANCE);
-        case UNKNOWN:
-            return null;
-        default:
-            return null;
-        }
-    }
-
-    /**
-     * Converts TE Topology TeStatus Enum to YANG TeOperStatus Enum.
-     *
-     * @param opStatus TE Topology operation status
-     * @return the equivalent Enum from YANG TeOperStatus or null if not found
-     */
-    public static TeOperStatus teSubsystem2YangOperStatus(TeStatus opStatus) {
-        switch (opStatus) {
-        case DOWN:
-            return TeOperStatus.of(TeOperStatusEnum.DOWN);
-        case UP:
-            return TeOperStatus.of(TeOperStatusEnum.UP);
-        case TESTING:
-            return TeOperStatus.of(TeOperStatusEnum.TESTING);
-        case MAINTENANCE:
-            return TeOperStatus.of(TeOperStatusEnum.MAINTENANCE);
-        case PREPARING_MAINTENANCE:
-            return TeOperStatus.of(TeOperStatusEnum.PREPARING_MAINTENANCE);
-        case UNKNOWN:
-            return TeOperStatus.of(TeOperStatusEnum.UNKNOWN);
-        default:
-            return null;
-        }
-    }
-
+// TODO: implementation of this class will be submitted as a separate review.
 }
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 f8aeca2..6b10176 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,733 +15,68 @@
  */
 package org.onosproject.teyang.utils.topology;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.List;
-
-import org.onlab.packet.Ip4Address;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.IpAddress.Version;
-import org.onosproject.tetopology.management.api.KeyId;
-import org.onosproject.tetopology.management.api.link.ElementType;
-import org.onosproject.tetopology.management.api.link.ExternalDomain;
-import org.onosproject.tetopology.management.api.link.LinkProtectionType;
+import org.onosproject.tetopology.management.api.TeTopologyService;
+import org.onosproject.tetopology.management.api.link.NetworkLink;
 import org.onosproject.tetopology.management.api.link.NetworkLinkKey;
-import org.onosproject.tetopology.management.api.link.PathElement;
-import org.onosproject.tetopology.management.api.link.TeIpv4;
-import org.onosproject.tetopology.management.api.link.TeLink;
-import org.onosproject.tetopology.management.api.link.UnderlayBackupPath;
-import org.onosproject.tetopology.management.api.link.UnderlayPath;
-import org.onosproject.tetopology.management.api.node.TeNetworkTopologyId;
-import org.onosproject.tetopology.management.api.node.TerminationPointKey;
 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.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.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.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.telinkaugment.DefaultTe;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.DefaultTe.TeBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.Config;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultConfig;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultConfig.ConfigBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultState;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultState.StateBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.State;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.DefaultTeLinkAttributes;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.DefaultTeLinkAttributes.TeLinkAttributesBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.TeLinkAttributes;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultExternalDomain;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultExternalDomain.ExternalDomainBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultUnderlay;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultUnderlay.UnderlayBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.Underlay;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultTeSrlgs;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultTeSrlgs.TeSrlgsBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultUnreservedBandwidth;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultUnreservedBandwidth.UnreservedBandwidthBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.UnreservedBandwidth;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkinfoattributes.LinkProtectionTypeEnum;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayBackupPath;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayBackupPath.UnderlayBackupPathBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayPrimaryPath;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayPrimaryPath.UnderlayPrimaryPathBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayTrailDes.UnderlayTrailDesBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayTrailSrc.UnderlayTrailSrcBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.UnderlayPrimaryPath;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.underlayprimarypath.DefaultPathElement;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.underlayprimarypath.DefaultPathElement.PathElementBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.Srlg;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeLinkAccessType;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeNodeId;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyId;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTpId;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.Type;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.AsNumber;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.DefaultAsNumber;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.DefaultIpv4Address;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.DefaultUnnumberedLink;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.Ipv4Address;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.UnnumberedLink;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705
-               .ietftetypes.telinkaccesstype.TeLinkAccessTypeEnum;
-
-import com.google.common.collect.Lists;
+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.te.topology.rev20160708.ietftetopology.TeLinkEvent;
 
 /**
  * The conversion functions.
  */
 public final class LinkConverter {
-    private static final String
-        E_NULL_TELINK_UNDERLAY_PATH = "TeSubsystem link underlayPath object cannot be null";
-    private static final String
-        E_NULL_TELINK_DATA = "TeSubsystem teLinkAttrBuilder data cannot be null";
-    private static final String
-        E_NULL_TELINK = "TeSubsystem teLink object cannot be null";
-    private static final String
-        E_NULL_YANG_TELINK_CONFIG = "YANG telink config object cannot be null";
-    private static final String
-        E_NULL_YANG_TELINK = "YANG Link object cannot be null";
+    private static final String E_NULL_TELINK_UNDERLAY_PATH =
+            "TeSubsystem link underlayPath object cannot be null";
+    private static final String E_NULL_TELINK_DATA =
+            "TeSubsystem teLinkAttrBuilder data cannot be null";
+    private static final String E_NULL_TELINK =
+            "TeSubsystem teLink object cannot be null";
+    private static final String E_NULL_YANG_TELINK_CONFIG =
+            "YANG telink config object cannot be null";
+    private static final String E_NULL_YANG_TELINK =
+            "YANG Link object cannot be null";
 
     // no instantiation
     private LinkConverter() {
     }
 
-    private static UnderlayBuilder te2YangConfigUnderlayPrimaryPath(
-            UnderlayBuilder yangBuilder,
-            org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath tePath) {
-        UnderlayPrimaryPathBuilder pathBuilder =
-                                       DefaultUnderlayPrimaryPath.builder();
-        if (tePath.pathElements() != null) {
-            for (PathElement pathElementTe : tePath.pathElements()) {
-                PathElementBuilder pathElementYangBuilder = DefaultPathElement
-                        .builder();
-                pathElementYangBuilder = pathElementYangBuilder
-                        .pathElementId(pathElementTe.pathElementId())
-                        .type(findYangTypeConfigPrimaryPath(pathElementTe.type()));
-                pathBuilder = pathBuilder
-                        .addToPathElement(pathElementYangBuilder.build());
-            }
-        }
-        pathBuilder = pathBuilder.networkIdRef(NetworkId.fromString(
-                                               tePath.ref().getNetworkId().toString()))
-                                 .teTopologyIdRef(TeTopologyId.fromString(
-                                               tePath.ref().getTopologyId().topologyId()));
-        return yangBuilder.underlayPrimaryPath(pathBuilder.build());
-    }
-
-    private static UnderlayBuilder te2YangConfigUnderlayBackupPaths(
-            UnderlayBuilder yangBuilder,
-            List<org.onosproject.tetopology.management.api.link.UnderlayBackupPath> tePaths) {
-
-        for (UnderlayBackupPath tePath : tePaths) {
-            UnderlayBackupPathBuilder pathBuilder = DefaultUnderlayBackupPath.builder();
-            pathBuilder = pathBuilder.index(tePath.index());
-            pathBuilder = pathBuilder.networkIdRef(NetworkId.fromString(
-                                                        tePath.ref().getNetworkId().toString()))
-                                     .teTopologyIdRef(TeTopologyId.fromString(
-                                                        tePath.ref().getTopologyId().topologyId()));
-            for (PathElement backupPathElementTe : tePath.pathElements()) {
-                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                .ietftetopology.telinkunderlayattributes.underlaybackuppath.DefaultPathElement.
-                PathElementBuilder backupPathElementYangBuilder =
-                    org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                        .ietftetopology.telinkunderlayattributes.underlaybackuppath.DefaultPathElement.builder();
-                backupPathElementYangBuilder = backupPathElementYangBuilder
-                        .pathElementId(backupPathElementTe.pathElementId());
-                backupPathElementYangBuilder = backupPathElementYangBuilder
-                        .type(findYangTypeConfigPrimaryPath(backupPathElementTe
-                                .type()));
-                pathBuilder = pathBuilder.addToPathElement(backupPathElementYangBuilder.build());
-            }
-            yangBuilder = yangBuilder.addToUnderlayBackupPath(pathBuilder.build());
-        }
-
-        return yangBuilder;
-    }
-
-    private static Type findYangTypeConfigPrimaryPath(ElementType type) {
-        if (type instanceof org.onosproject.tetopology.management.api.link.AsNumber) {
-            AsNumber.AsNumberBuilder yangAsNumberBuilder = DefaultAsNumber
-                    .builder();
-            yangAsNumberBuilder.asNumber(((AsNumber) type).asNumber());
-            return yangAsNumberBuilder.build();
-        } else if (type instanceof TeIpv4) {
-            Ipv4Address.Ipv4AddressBuilder yangIpv4AddrBuilder = DefaultIpv4Address
-                    .builder();
-            yangIpv4AddrBuilder = yangIpv4AddrBuilder
-                    .v4Address(new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types
-                               .rev20130715.ietfinettypes.Ipv4Address(((TeIpv4) type)
-                            .v4Address().toString()));
-            yangIpv4AddrBuilder = yangIpv4AddrBuilder
-                    .v4Loose(((TeIpv4) type).v4Loose());
-            yangIpv4AddrBuilder = yangIpv4AddrBuilder
-                    .v4PrefixLength((((TeIpv4) type).v4PrefixLength()));
-            return yangIpv4AddrBuilder.build();
-        } else if (type instanceof org.onosproject.tetopology.management.api.link.UnnumberedLink) {
-            UnnumberedLink.UnnumberedLinkBuilder unnumberedLinkBuilder = DefaultUnnumberedLink.builder();
-            unnumberedLinkBuilder.routerId(org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf
-                                           .inet.types.rev20130715.ietfinettypes.IpAddress
-                                    .fromString(((org.onosproject.tetopology.management.api.link.UnnumberedLink) type)
-                                            .routerId().toString()))
-                                 .interfaceId(((org.onosproject.tetopology.management.api.link.UnnumberedLink) type)
-                                              .interfaceId());
-            return unnumberedLinkBuilder.build();
-        }
-        return null;
-    }
-
-    /**
-     * TE Link underlay path Config object conversion from TE Topology subsystem to YANG.
-     *
-     * @param  tePath TE underlay path object
-     * @return Link underlay path Config YANG object
-     */
-    private static Underlay teSubsystem2YangConfigUnderlayPath(UnderlayPath tePath) {
-        checkNotNull(tePath, E_NULL_TELINK_UNDERLAY_PATH);
-        UnderlayBuilder builder =
-                DefaultUnderlay.builder().underlayProtectionType(tePath.protectionType());
-
-        if (tePath.primaryPath() != null) {
-            builder = te2YangConfigUnderlayPrimaryPath(builder, tePath.primaryPath());
-        }
-        if (tePath.trailSrc() != null) {
-            builder = builder.underlayTrailSrc(
-                                  new UnderlayTrailSrcBuilder()
-                                          .networkRef(NetworkId.fromString(
-                                                  tePath.trailSrc().networkId().toString()))
-                                          .nodeRef(NodeId.fromString(
-                                                  tePath.trailSrc().nodeId().toString()))
-                                          .tpRef(TpId.fromString(
-                                                  tePath.trailSrc().tpId().toString()))
-                                          .build());
-        }
-        if (tePath.trailDes() != null) {
-            builder = builder.underlayTrailDes(
-                                  new UnderlayTrailDesBuilder()
-                                          .networkRef(NetworkId.fromString(
-                                                  tePath.trailDes().networkId().toString()))
-                                          .nodeRef(NodeId.fromString(
-                                                  tePath.trailDes().nodeId().toString()))
-                                          .tpRef(TpId.fromString(
-                                                  tePath.trailDes().tpId().toString()))
-                                          .build());
-        }
-        if (tePath.backupPaths() != null) {
-            builder = te2YangConfigUnderlayBackupPaths(builder, tePath.backupPaths());
-        }
-
-        return builder.build();
-    }
-
-    private static Config teLink2YangConfig(TeLinkAttributesBuilder teLinkAttrBuilder) {
-        checkNotNull(teLinkAttrBuilder, E_NULL_TELINK_DATA);
-
-        ConfigBuilder yangConfigBuilder = DefaultConfig.builder()
-                                                       .teLinkAttributes(teLinkAttrBuilder.build());
-        return yangConfigBuilder.build();
-    }
-
-    private static TeLinkAttributesBuilder teLink2YangAttrBuilder(TeLink teLink) {
-        checkNotNull(teLink, E_NULL_TELINK_DATA);
-
-        TeLinkAttributesBuilder attrBuilder = DefaultTeLinkAttributes.builder();
-        if (teLink.linkIndex() != null) {
-            attrBuilder = attrBuilder.linkIndex(teLink.linkIndex());
-        }
-        if (teLink.name() != null) {
-            attrBuilder = attrBuilder.name(teLink.name());
-        }
-        if (teLink.adminStatus() != null) {
-            attrBuilder = attrBuilder
-                    .adminStatus(EnumConverter
-                            .teSubsystem2YangAdminStatus(teLink
-                            .adminStatus()));
-        }
-        if (teLink.accessType() != null) {
-            attrBuilder = attrBuilder
-                    .accessType(teSubsystem2YangTeLinkAccess(teLink
-                            .accessType()));
-        }
-        if (teLink.linkProtectionType() != null) {
-            attrBuilder = attrBuilder
-                    .linkProtectionType(teSubsystem2YangLinkProtectionType(teLink
-                            .linkProtectionType()));
-        }
-        if (teLink.maxLinkBandwidth() != null) {
-            attrBuilder = attrBuilder.maxLinkBandwidth(teLink.maxLinkBandwidth());
-        }
-        if (teLink.maxResvLinkBandwidth() != null) {
-            attrBuilder = attrBuilder.maxResvLinkBandwidth(teLink.maxResvLinkBandwidth());
-        }
-        attrBuilder = attrBuilder.teDefaultMetric(teLink.teDefaultMetric());
-        if (teLink.teSrlgs() != null) {
-            TeSrlgsBuilder teSrlgsBuilder = DefaultTeSrlgs.builder();
-            for (Long srlgLongVal : teLink.teSrlgs()) {
-                teSrlgsBuilder = teSrlgsBuilder.addToValue(new Srlg(srlgLongVal));
-            }
-            attrBuilder = attrBuilder.teSrlgs(teSrlgsBuilder.build());
-        }
-        attrBuilder = attrBuilder.isAbstract(teLink.isAbstract());
-        if (teLink.underlayPath() != null) {
-            attrBuilder = attrBuilder.underlay(
-                              teSubsystem2YangConfigUnderlayPath(teLink.underlayPath()));
-        }
-        if (teLink.externalDomain() != null) {
-            ExternalDomainBuilder edBuilder =
-                    DefaultExternalDomain.builder()
-                                         .plugId(teLink.externalDomain().plugId())
-                                         .remoteTeLinkTpId(TeTpId.fromString(
-                                                  teLink.externalDomain().remoteTeLinkTpId().toString()))
-                                         .remoteTeNodeId(TeNodeId.fromString(
-                                                  teLink.externalDomain().remoteTeNodeId().toString()));
-            attrBuilder = attrBuilder.externalDomain(edBuilder.build());
-        }
-
-        if (teLink.unreservedBandwidths() != null) {
-            for (org.onosproject.tetopology.management.api.link.UnreservedBandwidth unResBwTe :
-                        teLink.unreservedBandwidths()) {
-                UnreservedBandwidthBuilder urBuilder =
-                        DefaultUnreservedBandwidth.builder()
-                                                  .bandwidth(unResBwTe.bandwidth())
-                                                  .priority(unResBwTe.priority());
-                attrBuilder = attrBuilder.addToUnreservedBandwidth(urBuilder.build());
-            }
-        }
-
-        return attrBuilder;
-    }
-
-    private static LinkProtectionTypeEnum
-                        teSubsystem2YangLinkProtectionType(LinkProtectionType 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 YANGAUTOPREFIX1_FOR_1:
-            return LinkProtectionTypeEnum.YANGAUTOPREFIX1_FOR_1;
-        case YANGAUTOPREFIX1_PLUS_1:
-            return LinkProtectionTypeEnum.YANGAUTOPREFIX1_PLUS_1;
-        default:
-            return null;
-        }
-    }
-
-    private static TeLinkAccessType teSubsystem2YangTeLinkAccess(
-                       org.onosproject.tetopology.management.api.link.TeLinkAccessType accessType) {
-        switch (accessType) {
-        case MULTI_ACCESS:
-            return TeLinkAccessType.of(TeLinkAccessTypeEnum.MULTI_ACCESS);
-        case POINT_TO_POINT:
-            return TeLinkAccessType.of(TeLinkAccessTypeEnum.POINT_TO_POINT);
-        default:
-            return null;
-        }
-    }
-
-    private static State teLink2YangState(TeLinkAttributesBuilder teLinkAttrBuilder, TeLink teLink) {
-        StateBuilder yangStateBuilder = DefaultState.builder()
-                                                    .teLinkAttributes(teLinkAttrBuilder.build());
-
-        if (teLink.opStatus() != null) {
-            yangStateBuilder = yangStateBuilder
-                    .operStatus(EnumConverter
-                            .teSubsystem2YangOperStatus(teLink
-                            .opStatus()));
-        }
-
-        // TODO: once stateDerived Underlay is available in core TE Topology
-        // object model, set the value properly
-        // stateDerivedUnderlay = org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
-        // .rev20160708.ietftetopology.telinkstatederived.Underlay
-        // yangStateBuilder = yangStateBuilder.underlay(stateDerivedUnderlay);
-
-        return yangStateBuilder.build();
-    }
-
-    /**
-     * Link object conversion from TE Topology subsystem to YANG.
-     *
-     * @param teLink TE subsystem link object
-     * @return YANG link object
-     */
-    public static Link teSubsystem2YangLink(
-            org.onosproject.tetopology.management.api.link.NetworkLink teLink) {
-        checkNotNull(teLink, E_NULL_TELINK);
-
-        LinkId linkId = LinkId.fromString(teLink.linkId().toString());
-        LinkBuilder builder = DefaultLink.builder().linkId(linkId);
-        if (teLink.getSupportingLinkIds() != null) {
-            List<SupportingLink> slinks = Lists.newArrayList();
-            SupportingLinkBuilder spLinkBuilder = DefaultSupportingLink.builder();
-            for (NetworkLinkKey linkKey : teLink.getSupportingLinkIds()) {
-                slinks.add(spLinkBuilder.networkRef(NetworkId.fromString(
-                                                    linkKey.networkId().toString()))
-                                        .linkRef(LinkId.fromString(
-                                                    linkKey.linkId().toString()))
-                                        .build());
-            }
-            builder = builder.supportingLink(slinks);
-        }
-        if (teLink.getSource() != null) {
-            SourceBuilder sourceBuilder = DefaultSource
-                                              .builder()
-                                              .sourceNode(NodeId.fromString(
-                                                   teLink.getSource().nodeId().toString()))
-                                              .sourceTp(TpId.fromString(
-                                                   teLink.getSource().tpId().toString()));
-            builder = builder.source(sourceBuilder.build());
-        }
-        if (teLink.getDestination() != null) {
-            DestinationBuilder destBuilder = DefaultDestination
-                                                 .builder()
-                                                 .destNode(NodeId.fromString(
-                                                      teLink.getDestination().nodeId().toString()))
-                                                 .destTp(TpId.fromString(
-                                                      teLink.getDestination().tpId().toString()));
-            builder = builder.destination(destBuilder.build());
-        }
-
-        if (teLink.getTe() != null) {
-            TeLink teData = teLink.getTe();
-            TeLinkAttributesBuilder attrBuilder = teLink2YangAttrBuilder(teData);
-
-            TeBuilder yangTeBuilder = DefaultTe.builder()
-                                               .config(teLink2YangConfig(attrBuilder))
-                                               .state(teLink2YangState(attrBuilder, teData));
-            AugmentedNtLinkBuilder linkAugmentBuilder =
-                    DefaultAugmentedNtLink.builder()
-                                          .te(yangTeBuilder.build());
-            builder.addYangAugmentedInfo(linkAugmentBuilder.build(), AugmentedNtLink.class);
-        }
-
-        return builder.build();
-    }
-
-    private static org.onosproject.tetopology.management.api.link.UnderlayPath
-           yang2TeSubsystemUnderlayPrimaryPath(
-                            org.onosproject.tetopology.management.api.link.UnderlayPath teUnderlay,
-                            UnderlayPrimaryPath yangpath) {
-        org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath teUnderlayPrimaryPath =
-                new org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath();
-        teUnderlayPrimaryPath.setRef(new TeNetworkTopologyId(KeyId.keyId(
-                                             yangpath.networkIdRef().toString()),
-                                     new org.onosproject.tetopology.management.api.TeTopologyId(
-                                             ((long) yangpath.providerIdRef()),
-                                             ((long) yangpath.clientIdRef()),
-                                             yangpath.teTopologyIdRef().toString())));
-
-        List<PathElement> pathElementList = Lists.newArrayList();
-        for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-                .telinkunderlayattributes.underlayprimarypath.PathElement pathElementConfigYang :
-                    yangpath.pathElement()) {
-            PathElement tePathElement = new PathElement(pathElementConfigYang.pathElementId(),
-                                                        findElementType(pathElementConfigYang.type()));
-            pathElementList.add(tePathElement);
-        }
-        teUnderlayPrimaryPath.setPathElement(pathElementList);
-        teUnderlay.setPrimaryPath(teUnderlayPrimaryPath);
-
-        return teUnderlay;
-    }
-
-    private static org.onosproject.tetopology.management.api.link.UnderlayPath
-            yang2TeSubsystemUnderlayBackupPaths(
-                     org.onosproject.tetopology.management.api.link.UnderlayPath teUnderlay,
-                     List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology
-                         .rev20160708.ietftetopology.telinkunderlayattributes.UnderlayBackupPath> yangpaths) {
-        List<UnderlayBackupPath> underlayBackupPathsList = Lists.newArrayList();
-        for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                .ietftetopology.telinkunderlayattributes.UnderlayBackupPath yangConfig : yangpaths) {
-            UnderlayBackupPath ubp = new UnderlayBackupPath();
-            ubp.setIndex(yangConfig.index());
-            ubp.setRef(new TeNetworkTopologyId(KeyId.keyId(yangConfig.networkIdRef().toString()),
-                                               new org.onosproject.tetopology.management.api.TeTopologyId(
-                                                       ((long) yangConfig.providerIdRef()),
-                                                       ((long) yangConfig.clientIdRef()),
-                                                       yangConfig.teTopologyIdRef().toString()
-                                              )));
-            List<PathElement> backupPathElementList = Lists.newArrayList();
-            for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                    .ietftetopology.telinkunderlayattributes.underlaybackuppath.PathElement
-                        pathElementBackupYang : yangConfig.pathElement()) {
-                PathElement tePathElementBackup =
-                        new PathElement(pathElementBackupYang.pathElementId(),
-                                        findElementType(pathElementBackupYang.type()));
-                backupPathElementList.add(tePathElementBackup);
-            }
-            ubp.setPathElement(backupPathElementList);
-            underlayBackupPathsList.add(ubp);
-        }
-        teUnderlay.setBackupPath(underlayBackupPathsList);
-
-        return teUnderlay;
-    }
-
-    private static ElementType findElementType(Type type) {
-        ElementType el = null;
-        if (type instanceof AsNumber) {
-            org.onosproject.tetopology.management.api.link.AsNumber elementTypeAsNumber = new org.onosproject
-                    .tetopology.management.api.link.AsNumber(((AsNumber) type).asNumber());
-            return elementTypeAsNumber;
-        } else if (type instanceof Ipv4Address) {
-            TeIpv4 elementTypeIpv4 = new TeIpv4();
-            String ipVal = ((Ipv4Address) type).v4Address().toString();
-            elementTypeIpv4.setV4Address(Ip4Address.valueOf(Version.INET, ipVal.getBytes()).getIp4Address());
-            boolean v4Loose = ((Ipv4Address) type).v4Loose();
-            elementTypeIpv4.setV4Loose(v4Loose);
-            short v4PrefixLength = ((Ipv4Address) type).v4PrefixLength();
-            elementTypeIpv4.setV4PrefixLength(v4PrefixLength);
-            return elementTypeIpv4;
-        } else if (type instanceof UnnumberedLink) {
-            org.onosproject.tetopology.management.api.link.UnnumberedLink elementTypeUnnumberedLink = new org
-                    .onosproject.tetopology.management.api.link.UnnumberedLink();
-            long interfaceId = ((UnnumberedLink) type).interfaceId();
-            elementTypeUnnumberedLink.setInterfaceId(interfaceId);
-            IpAddress routerId = IpAddress.valueOf(((UnnumberedLink) type).routerId().toString());
-            elementTypeUnnumberedLink.setRouterId(routerId);
-            return elementTypeUnnumberedLink;
-        }
-        // TODO: as an improvement in future, construct the tePathElement object
-        // properly using pathElementConfigYang
-        // More types need to be added to the above if/else statements.
-        // Now, I only have AsNumber, Ipv4Address, and UnnumberedLink
-        return el;
-    }
-
-    /**
-     * TE Link underlay path Config object conversion from YANG to TE Topology subsystem.
-     *
-     * @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) {
-        checkNotNull(yangLinkAtrr, E_NULL_YANG_TELINK_CONFIG);
-
-        org.onosproject.tetopology.management.api.link.UnderlayPath teUnderlay =
-                new org.onosproject.tetopology.management.api.link.UnderlayPath();
-
-        teUnderlay.setProtectionType(yangLinkAtrr.underlay().underlayProtectionType());
-
-        if (yangLinkAtrr.underlay().underlayPrimaryPath() != null) {
-            teUnderlay = yang2TeSubsystemUnderlayPrimaryPath(teUnderlay,
-                                    yangLinkAtrr.underlay().underlayPrimaryPath());
-        }
-
-        if (yangLinkAtrr.underlay().underlayBackupPath() != null) {
-            teUnderlay = yang2TeSubsystemUnderlayBackupPaths(teUnderlay,
-                    yangLinkAtrr.underlay().underlayBackupPath());
-        }
-
-        if (yangLinkAtrr.underlay().underlayTrailSrc() != null) {
-            teUnderlay.setTrailSrc(new TerminationPointKey(
-                                            KeyId.keyId(yangLinkAtrr.underlay().underlayTrailSrc()
-                                                            .networkRef().toString()),
-                                            KeyId.keyId(yangLinkAtrr.underlay().underlayTrailSrc()
-                                                            .nodeRef().toString()),
-                                            KeyId.keyId(yangLinkAtrr.underlay().underlayTrailSrc()
-                                                            .tpRef().toString())));
-        }
-
-        if (yangLinkAtrr.underlay().underlayTrailDes() != null) {
-            teUnderlay.setTrailDes(new TerminationPointKey(
-                                            KeyId.keyId(yangLinkAtrr.underlay().underlayTrailDes()
-                                                            .networkRef().toString()),
-                                            KeyId.keyId(yangLinkAtrr.underlay().underlayTrailDes()
-                                                            .nodeRef().toString()),
-                                            KeyId.keyId(yangLinkAtrr.underlay().underlayTrailDes()
-                                                            .tpRef().toString())));
-        }
-
-        return teUnderlay;
-    }
-
-    private static TeLink yang2TeLinkAttributes(TeLinkAttributes yangLinkAtrr,
-                                                State opState) {
-        TeLink te = new TeLink(yangLinkAtrr.linkIndex());
-        if (yangLinkAtrr.name() != null) {
-            te.setName(yangLinkAtrr.name());
-        }
-        if (yangLinkAtrr.adminStatus() != null) {
-            te.setAdminStatus(EnumConverter.yang2TeSubsystemAdminStatus(
-                                                yangLinkAtrr.adminStatus()));
-        }
-        if (opState != null && opState.operStatus() != null) {
-            te.setOpStatus(EnumConverter.yang2TeSubsystemOpStatus(
-                                             opState.operStatus()));
-        }
-        if (yangLinkAtrr.accessType() != null) {
-            te.setAccessType(yang2TeSubsystemAccessType(
-                                 yangLinkAtrr.accessType()));
-        }
-        if (yangLinkAtrr.linkProtectionType() != null) {
-            te.setLinkProtectionType(yang2TeSubsystemLinkProtectionType(
-                                         yangLinkAtrr.linkProtectionType()));
-        }
-        if (yangLinkAtrr.maxLinkBandwidth() != null) {
-            te.setMaxLinkBandwidth(yangLinkAtrr.maxLinkBandwidth());
-        }
-        if (yangLinkAtrr.maxResvLinkBandwidth() != null) {
-            te.setMaxResvLinkBandwidth(yangLinkAtrr.maxResvLinkBandwidth());
-        }
-        te.setTeDefaultMetric(yangLinkAtrr.teDefaultMetric());
-        te.setIsAbstract(yangLinkAtrr.isAbstract());
-        if (yangLinkAtrr.teSrlgs() != null) {
-            List<Long> srlgs = Lists.newArrayList();
-            for (Srlg srlgConfigYang : yangLinkAtrr.teSrlgs().value()) {
-                srlgs.add(srlgConfigYang.uint32());
-            }
-            te.setTeSrlgs(srlgs);
-        }
-        if (yangLinkAtrr.externalDomain() != null) {
-            te.setExternalDomain(new ExternalDomain(
-                    KeyId.keyId(yangLinkAtrr.externalDomain()
-                                    .remoteTeNodeId().toString()),
-                    KeyId.keyId(yangLinkAtrr.externalDomain()
-                                    .remoteTeLinkTpId().toString()),
-                    yangLinkAtrr.externalDomain().plugId()));
-        }
-        if (yangLinkAtrr.underlay() != null) {
-            te.setUnderlayPath(yang2TeSubsystemUnderlayPath(yangLinkAtrr));
-        }
-        if (yangLinkAtrr.unreservedBandwidth() != null) {
-            List<org.onosproject.tetopology.management.api.link.UnreservedBandwidth>
-                    unreservedBandwidths = Lists.newArrayList();
-            for (UnreservedBandwidth urBwYang : yangLinkAtrr.unreservedBandwidth()) {
-                org.onosproject.tetopology.management.api.link.UnreservedBandwidth unResBw =
-                        new org.onosproject.tetopology.management.api.link.UnreservedBandwidth(
-                                urBwYang.priority(),
-                                urBwYang.bandwidth());
-                unreservedBandwidths.add(unResBw);
-            }
-            te.setUnreservedBandwidths(unreservedBandwidths);
-        }
-        return te;
-    }
-
-    private static LinkProtectionType
-        yang2TeSubsystemLinkProtectionType(LinkProtectionTypeEnum linkProtectionType) {
-        switch (linkProtectionType) {
-        case ENHANCED:
-            return LinkProtectionType.ENHANCED;
-        case EXTRA_TRAFFIC:
-            return LinkProtectionType.EXTRA_TRAFFIC;
-        case SHARED:
-            return LinkProtectionType.SHARED;
-        case UNPROTECTED:
-            return LinkProtectionType.UNPROTECTED;
-        case YANGAUTOPREFIX1_FOR_1:
-            return LinkProtectionType.YANGAUTOPREFIX1_FOR_1;
-        case YANGAUTOPREFIX1_PLUS_1:
-            return LinkProtectionType.YANGAUTOPREFIX1_PLUS_1;
-        default:
-            return null;
-        }
-    }
-
-    private static org.onosproject.tetopology.management.api.link.TeLinkAccessType
-        yang2TeSubsystemAccessType(TeLinkAccessType accessType) {
-        switch (accessType.enumeration()) {
-        case MULTI_ACCESS:
-            return org.onosproject.tetopology.management.api.link.TeLinkAccessType.MULTI_ACCESS;
-        case POINT_TO_POINT:
-            return org.onosproject.tetopology.management.api.link.TeLinkAccessType.POINT_TO_POINT;
-        default:
-            return null;
-        }
-    }
 
     /**
      * Link object conversion from YANG to TE Topology subsystem.
      *
-     * @param yangLink YANG link object
-     * @param networkId YANG networkId object
-     * @return TE subsystem link object
+     * @param yangLink  YANG link
+     * @param networkId YANG networkId
+     * @return TE subsystem link
      */
     public static org.onosproject.tetopology.management.api.link.NetworkLink
-            yang2TeSubsystemLink(Link yangLink, NetworkId networkId) {
-        checkNotNull(yangLink, E_NULL_YANG_TELINK);
+    yang2TeSubsystemLink(Link yangLink, NetworkId networkId) {
 
-        org.onosproject.tetopology.management.api.link.DefaultNetworkLink link =
-                new org.onosproject.tetopology.management.api.link.DefaultNetworkLink(
-                        KeyId.keyId(yangLink.linkId().uri().toString()));
+        //TODO: Implementation will be submitted as a separate review
 
-        if (yangLink.supportingLink() != null) {
-            List<NetworkLinkKey> spLinkIds = Lists.newArrayList();
-            for (SupportingLink yangSpLink : yangLink.supportingLink()) {
-                NetworkLinkKey linkKey = new NetworkLinkKey(KeyId.keyId(yangSpLink.networkRef().uri().toString()),
-                                                            KeyId.keyId(yangSpLink.linkRef().uri().toString()));
-                spLinkIds.add(linkKey);
-            }
-            link.setSupportingLinkIds(spLinkIds);
-        }
-
-        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()));
-            link.setSource(source);
-        }
-
-        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()));
-            link.setDestination(destination);
-        }
-
-        if (yangLink.yangAugmentedInfoMap() != null && !yangLink.yangAugmentedInfoMap().isEmpty()) {
-
-            AugmentedNtLink yangLinkAugment =
-                    (AugmentedNtLink) yangLink.yangAugmentedInfo(AugmentedNtLink.class);
-            if (yangLinkAugment != null &&
-                    yangLinkAugment.te() != null &&
-                    yangLinkAugment.te().config() != null) {
-                TeLinkAttributes yangLinkAtrr =
-                        yangLinkAugment.te().config().teLinkAttributes();
-                if (yangLinkAtrr != null && yangLinkAtrr.linkIndex() != null) {
-                    TeLink te = yang2TeLinkAttributes(yangLinkAtrr, yangLinkAugment.te().state());
-                    link.setTe(te);
-                }
-            }
-        }
-        return link;
+        return null;
     }
 
+    public static Link teSubsystem2YangLink(NetworkLink link) {
+
+        //TODO: Implementation will be submitted as a separate review
+
+        return null;
+    }
+
+    public static NetworkLinkKey yangLinkEvent2NetworkLinkKey(TeLinkEvent yangLinkEvent) {
+
+        //TODO: Implementation will be submitted as a separate review
+
+        return null;
+    }
+
+    public static NetworkLink yangLinkEvent2NetworkLink(TeLinkEvent yangLinkEvent,
+                                                        TeTopologyService teTopologyService) {
+
+        //TODO: Implementation will be submitted as a separate review
+
+        return null;
+    }
 }
diff --git a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NetworkConverter.java b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NetworkConverter.java
index cb24d60..2205778 100644
--- a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NetworkConverter.java
+++ b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NetworkConverter.java
@@ -15,72 +15,74 @@
  */
 package org.onosproject.teyang.utils.topology;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-
-import java.util.List;
-
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.onosproject.net.DeviceId;
 import org.onosproject.tetopology.management.api.KeyId;
 import org.onosproject.tetopology.management.api.TeTopologyEvent;
 import org.onosproject.tetopology.management.api.link.NetworkLink;
 import org.onosproject.tetopology.management.api.node.NetworkNode;
 import org.onosproject.teyang.api.OperationType;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.IetfNetwork.OnosYangOpType;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
-        .ietfnetwork.DefaultNetworks;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
-        .ietfnetwork.DefaultNetworksState;
-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.Networks;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
-        .ietfnetwork.NetworksState;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
-        .ietfnetwork.networks.DefaultNetwork;
-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.NetworkBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
-        .ietfnetwork.networks.network.DefaultNetworkTypes;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
-        .ietfnetwork.networks.network.DefaultSupportingNetwork;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network.DefaultSupportingNetwork.SupportingNetworkBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
-        .ietfnetwork.networks.network.NetworkTypes;
-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.SupportingNetwork;
-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.DefaultAugmentedNdNetwork;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology.networks.network.DefaultAugmentedNdNetwork.AugmentedNdNetworkBuilder;
-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.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.DefaultAugmentedNwNetwork;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-        .ietftetopology.networks.network.networktypes.AugmentedNwNetworkTypes;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-        .ietftetopology.networks.network.networktypes.DefaultAugmentedNwNetworkTypes;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tetopologyaugment.DefaultTe;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tetopologyaugment.Te;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tetopologytype.DefaultTeTopology;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tetopologytype.TeTopology;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.IetfTeTopologyEvent;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705
-        .ietftetypes.TeGlobalId;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705
-        .ietftetypes.TeTopologyId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.DefaultNetworks;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork
+        .DefaultNetworksState;
+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.Networks;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NetworksState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks
+        .DefaultNetwork;
+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
+        .NetworkBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
+        .DefaultNetworkTypes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
+        .DefaultSupportingNetwork;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
+        .DefaultSupportingNetwork.SupportingNetworkBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
+        .NetworkTypes;
+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
+        .SupportingNetwork;
+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.DefaultAugmentedNdNetwork;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
+        .networks.network.DefaultAugmentedNdNetwork.AugmentedNdNetworkBuilder;
+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.te.topology.rev20160708.ietftetopology
+        .IetfTeTopologyEvent;
+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.DefaultAugmentedNwNetwork;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
+        .network.networktypes.AugmentedNwNetworkTypes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
+        .network.networktypes.DefaultAugmentedNwNetworkTypes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tetopologyaugment.DefaultTe;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tetopologyaugment.Te;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tetopologytype.DefaultTeTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+        .tetopologytype.TeTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeGlobalId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.collect.Lists;
+import java.util.List;
+import java.util.Map;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
 
 
 /**
@@ -88,29 +90,29 @@
  */
 public final class NetworkConverter {
     private static final String
-        E_NULL_TE_NETWORKS = "TeSubsystem networks cannot be null";
+            E_NULL_TE_NETWORKS = "TeSubsystem networks cannot be null";
     private static final String
-        E_NULL_TE_NETWORK_LIST = "TeSubsystem network list cannot be null";
+            E_NULL_TE_NETWORK_LIST = "TeSubsystem network list cannot be null";
     private static final String
-        E_NULL_TE_NETWORK = "TeSubsystem network cannot be null";
+            E_NULL_TE_NETWORK = "TeSubsystem network cannot be null";
     private static final String
-        E_NULL_TE_NETWORKID = "TeSubsystem networkId cannot be null";
+            E_NULL_TE_NETWORKID = "TeSubsystem networkId cannot be null";
     private static final String
-        E_NULL_YANG_NETWORKS = "YANG networks cannot be null";
+            E_NULL_YANG_NETWORKS = "YANG networks cannot be null";
     private static final String
-        E_NULL_YANG_NETWORK_LIST = "YANG network list cannot be null";
+            E_NULL_YANG_NETWORK_LIST = "YANG network list cannot be null";
     private static final String
-        E_NULL_YANG_NETWORK = "YANG network cannot be null";
+            E_NULL_YANG_NETWORK = "YANG network cannot be null";
     private static final String
-        E_NULL_YANG_NETWORKID = "YANG networkId cannot be null";
+            E_NULL_YANG_NETWORKID = "YANG networkId cannot be null";
     private static final String
-        E_NULL_YANG_NETWORKSSTATE = "YANG networksState cannot be null";
+            E_NULL_YANG_NETWORKSSTATE = "YANG networksState cannot be null";
     private static final String
-        E_DIFF_YANG_NETWORKID = "YANG networkId must be same in Network and NetworkState";
+            E_DIFF_YANG_NETWORKID = "YANG networkId must be same in Network and NetworkState";
     private static final String
-        E_NULL_YANG_NETWORKSSTATE_NETWORK = "YANG networksState network cannot be null";
+            E_NULL_YANG_NETWORKSSTATE_NETWORK = "YANG networksState network cannot be null";
     private static final String
-        E_NULL_YANG_NETWORKSSTATE_NETWORKREF = "YANG networksState networkRef cannot be null";
+            E_NULL_YANG_NETWORKSSTATE_NETWORKREF = "YANG networksState networkRef cannot be null";
 
     private static final Logger log = LoggerFactory.getLogger(NetworkConverter.class);
 
@@ -120,23 +122,23 @@
 
     private static OnosYangOpType toNetworksOperationType(OperationType operation) {
         switch (operation) {
-        case CREATE:
-            return OnosYangOpType.CREATE;
+            case CREATE:
+                return OnosYangOpType.CREATE;
 
-        case DELETE:
-            return OnosYangOpType.DELETE;
+            case DELETE:
+                return OnosYangOpType.DELETE;
 
-        case REMOVE:
-            return OnosYangOpType.REMOVE;
+            case REMOVE:
+                return OnosYangOpType.REMOVE;
 
-        case MERGE:
-            return OnosYangOpType.MERGE;
+            case MERGE:
+                return OnosYangOpType.MERGE;
 
-        case REPLACE:
-            return OnosYangOpType.REPLACE;
+            case REPLACE:
+                return OnosYangOpType.REPLACE;
 
-        default:
-            return OnosYangOpType.NONE;
+            default:
+                return OnosYangOpType.NONE;
         }
     }
 
@@ -144,7 +146,7 @@
      * Networks object conversion from TE Topology subsystem to YANG.
      *
      * @param teSubsystem TE Topology subsystem networks object
-     * @param operation operation type
+     * @param operation   operation type
      * @return Networks YANG object
      */
     public static Networks teSubsystem2YangNetworks(
@@ -167,7 +169,7 @@
      * Network States object conversion from TE Topology subsystem to YANG.
      *
      * @param teSubsystem TE Topology subsystem networks object
-     * @param operation operation type
+     * @param operation   operation type
      * @return NetworkStates YANG object
      */
     public static NetworksState teSubsystem2YangNetworkStates(
@@ -208,7 +210,7 @@
     /**
      * Networks object conversion from YANG to TE Topology subsystem.
      *
-     * @param yangNetworks Networks YANG object
+     * @param yangNetworks      Networks YANG object
      * @param yangNetworkStates NetworkStates YANG object
      * @return teSubsystem TE Topology subsystem networks object
      */
@@ -218,17 +220,15 @@
         checkNotNull(yangNetworks.network(), E_NULL_YANG_NETWORK_LIST);
         checkNotNull(yangNetworkStates, E_NULL_YANG_NETWORKSSTATE);
 
-        org.onosproject.tetopology.management.api.DefaultNetworks defaultNetworks =
-                new org.onosproject.tetopology.management.api.DefaultNetworks();
         List<org.onosproject.tetopology.management.api.Network> networks = Lists.newArrayList();
         for (Network network : yangNetworks.network()) {
             org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
                     .ietfnetwork.networksstate.Network stateNetwork =
-                            networkStateNetwork(network, yangNetworkStates);
+                    networkStateNetwork(network, yangNetworkStates);
             org.onosproject.tetopology.management.api.Network teNetwork;
             if (stateNetwork == null) {
                 log.info("networkId {} can't be found in yangNetworkStates",
-                          network.networkId());
+                         network.networkId());
                 teNetwork = yang2TeSubsystemNetwork(network);
             } else {
                 teNetwork = yang2TeSubsystemNetwork(network, stateNetwork);
@@ -236,7 +236,8 @@
             networks.add(teNetwork);
         }
 
-        defaultNetworks.setNetworks(networks);
+        org.onosproject.tetopology.management.api.DefaultNetworks defaultNetworks =
+                new org.onosproject.tetopology.management.api.DefaultNetworks(networks);
         return defaultNetworks;
     }
 
@@ -246,29 +247,27 @@
         SupportingNetworkBuilder spNetworkBuilder = DefaultSupportingNetwork.builder();
         for (KeyId teSpNwKey : teSpptNetworkIds) {
             snws.add(spNetworkBuilder
-                    .networkRef(NetworkId.fromString(teSpNwKey.toString()))
-                    .build());
+                             .networkRef(NetworkId.fromString(teSpNwKey.toString()))
+                             .build());
         }
         return builder.supportingNetwork(snws);
     }
 
     private static NetworkBuilder te2YangNodes(NetworkBuilder builder,
-                                               List<NetworkNode> teNodes) {
+                                               Map<KeyId, NetworkNode> teNodes) {
         List<Node> nodeList = Lists.newArrayList();
-        // Add each node
-        for (org.onosproject.tetopology.management.api.node.NetworkNode node : teNodes) {
-            // Convert the te node to a YO.
+
+        for (org.onosproject.tetopology.management.api.node.NetworkNode node : teNodes.values()) {
             nodeList.add(NodeConverter.teSubsystem2YangNode(node));
         }
         return builder.node(nodeList);
     }
 
     private static NetworkBuilder te2YangLinks(NetworkBuilder builder,
-                                               List<NetworkLink> teLinks) {
+                                               Map<KeyId, NetworkLink> teLinks) {
         List<Link> linkList = Lists.newArrayList();
-        // Add each link
-        for (org.onosproject.tetopology.management.api.link.NetworkLink link : teLinks) {
-            // Convert the te link to a YO
+
+        for (org.onosproject.tetopology.management.api.link.NetworkLink link : teLinks.values()) {
             linkList.add(LinkConverter.teSubsystem2YangLink(link));
         }
         AugmentedNdNetworkBuilder ndAugment = DefaultAugmentedNdNetwork.builder();
@@ -278,7 +277,8 @@
     }
 
     private static NetworkBuilder te2YangNetworkType(NetworkBuilder builder,
-                org.onosproject.tetopology.management.api.TeTopologyId teTopologyId) {
+                                                     org.onosproject.tetopology.management.api.TeTopologyId
+                                                             teTopologyId) {
         NetworkTypes.NetworkTypesBuilder nwType = DefaultNetworkTypes.builder();
         if (teTopologyId != null) {
             // Set "te-topology" network type.
@@ -292,11 +292,12 @@
     }
 
     private static NetworkBuilder te2YangTopologyIds(NetworkBuilder builder,
-            org.onosproject.tetopology.management.api.TeTopologyId teTopologyId) {
+                                                     org.onosproject.tetopology.management.api.TeTopologyId
+                                                             teTopologyId) {
         Te.TeBuilder teBuilder = DefaultTe.builder();
         teBuilder.clientId(new TeGlobalId(teTopologyId.clientId()));
         teBuilder.providerId(new TeGlobalId(teTopologyId.providerId()));
-        if (teTopologyId.topologyId() !=  null) {
+        if (teTopologyId.topologyId() != null) {
             teBuilder.teTopologyId(new TeTopologyId(teTopologyId.topologyId()));
         }
 
@@ -304,7 +305,7 @@
                 .builder();
         nwAugment.te(teBuilder.build());
         builder.addYangAugmentedInfo(nwAugment.build(),
-                                            AugmentedNwNetwork.class);
+                                     AugmentedNwNetwork.class);
         return builder;
     }
 
@@ -312,7 +313,7 @@
      * Network object conversion from TE Topology subsystem to YANG.
      *
      * @param teSubsystem TE Topology subsystem network object
-     * @param operation operation type
+     * @param operation   operation type
      * @return Network YANG object
      */
     public static Network teSubsystem2YangNetwork(
@@ -324,31 +325,31 @@
         // Generate a network builder with the specific networkId.
         NetworkId networkId = NetworkId.fromString(teSubsystem.networkId().toString());
         NetworkBuilder builder = DefaultNetwork.builder()
-                                               .yangNetworkOpType(
-                                                       toNetworksOperationType(operation))
-                                               .networkId(networkId);
+                .yangNetworkOpType(
+                        toNetworksOperationType(operation))
+                .networkId(networkId);
 
         // Supporting networks
-        if (teSubsystem.getSupportingNetworkIds() != null) {
-            builder = te2YangSupportingNetwork(builder, teSubsystem.getSupportingNetworkIds());
+        if (teSubsystem.supportingNetworkIds() != null) {
+            builder = te2YangSupportingNetwork(builder, teSubsystem.supportingNetworkIds());
         }
 
         // Nodes
-        if (teSubsystem.getNodes() != null) {
-            builder = te2YangNodes(builder, teSubsystem.getNodes());
+        if (teSubsystem.nodes() != null) {
+            builder = te2YangNodes(builder, teSubsystem.nodes());
         }
 
         // Network types
-        builder = te2YangNetworkType(builder, teSubsystem.getTeTopologyId());
+        builder = te2YangNetworkType(builder, teSubsystem.teTopologyId());
 
         // Add links - link is the augmentation
-        if (teSubsystem.getLinks() != null) {
-            builder = te2YangLinks(builder, teSubsystem.getLinks());
+        if (teSubsystem.links() != null) {
+            builder = te2YangLinks(builder, teSubsystem.links());
         }
 
         // TE Topology IDs
-        if (teSubsystem.getTeTopologyId() != null) {
-            builder = te2YangTopologyIds(builder, teSubsystem.getTeTopologyId());
+        if (teSubsystem.teTopologyId() != null) {
+            builder = te2YangTopologyIds(builder, teSubsystem.teTopologyId());
         }
 
         return builder.build();
@@ -358,21 +359,21 @@
      * Network State object conversion from TE Topology subsystem to YANG.
      *
      * @param teSubsystem TE Topology subsystem network object
-     * @param operation operation type
+     * @param operation   operation type
      * @return Network YANG object
      */
     public static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network
-                        .rev20151208.ietfnetwork.networksstate.Network
-            teSubsystem2YangNetworkState(
-                    org.onosproject.tetopology.management.api.Network teSubsystem,
-                    OperationType operation) {
+            .rev20151208.ietfnetwork.networksstate.Network
+    teSubsystem2YangNetworkState(
+            org.onosproject.tetopology.management.api.Network teSubsystem,
+            OperationType operation) {
         checkNotNull(teSubsystem, E_NULL_TE_NETWORK);
         checkNotNull(teSubsystem.networkId(), E_NULL_TE_NETWORKID);
 
         org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
                 .ietfnetwork.networksstate.Network.NetworkBuilder stateBuilder =
-        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
-                .ietfnetwork.networksstate.DefaultNetwork.builder();
+                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
+                        .ietfnetwork.networksstate.DefaultNetwork.builder();
 
         if (teSubsystem.networkId() != null) {
             stateBuilder.networkRef(NetworkId.fromString(teSubsystem.networkId().toString()));
@@ -387,65 +388,78 @@
     /**
      * Network conversion from YANG to TE Topology subsystem.
      *
-     * @param yangNetwork Network YANG object
+     * @param yangNetwork      Network YANG object
+     * @param yangNetworkState NetworkState YANG object
      * @return TE Topology subsystem defaultNetwork object
      */
     private static org.onosproject.tetopology.management.api.DefaultNetwork yang2TeDefaultNetwork(
-            Network yangNetwork) {
+            Network yangNetwork,
+            org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.
+                    yang.ietf.network.rev20151208.ietfnetwork.networksstate.
+                    Network yangNetworkState) {
         checkNotNull(yangNetwork, E_NULL_YANG_NETWORK);
         checkNotNull(yangNetwork.networkId(), E_NULL_YANG_NETWORKID);
         String networkId = yangNetwork.networkId().uri().string();
-        org.onosproject.tetopology.management.api.DefaultNetwork teNetwork =
-                new org.onosproject.tetopology.management.api.DefaultNetwork(KeyId.keyId(networkId));
+
+        KeyId networkKeyId = KeyId.keyId(networkId);
+        List<KeyId> supportingNetworkIds = null;
+        Map<KeyId, NetworkNode> teNodes = null;
+        Map<KeyId, NetworkLink> teLinks = null;
+        org.onosproject.tetopology.management.api.TeTopologyId teTopologyId = null;
+        boolean serverProvided = false;
+        DeviceId ownerId = null;
 
         // Supporting networks
         if (yangNetwork.supportingNetwork() != null) {
-            List<KeyId> supportingNetworkIds = Lists.newArrayList();
+            supportingNetworkIds = Lists.newArrayList();
             for (SupportingNetwork supportNw : yangNetwork.supportingNetwork()) {
                 supportingNetworkIds.add(
                         KeyId.keyId(supportNw.networkRef().uri().string()));
             }
-            teNetwork.setSupportingNetworkIds(supportingNetworkIds);
         }
 
         // Nodes
         if (yangNetwork.node() != null) {
-            List<org.onosproject.tetopology.management.api.node.NetworkNode>
-                teNodes = Lists.newArrayList();
+            teNodes = Maps.newHashMap();
             for (Node node : yangNetwork.node()) {
                 // Convert the Yang Node to a TE node.
-                teNodes.add(NodeConverter.yang2TeSubsystemNode(node, yangNetwork.networkId()));
+                teNodes.put(KeyId.keyId(node.nodeId().uri().string()),
+                            NodeConverter.yang2TeSubsystemNode(node, yangNetwork.networkId()));
             }
-            teNetwork.setNodes(teNodes);
         }
 
         // Links
         if (yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class) != null) {
             AugmentedNdNetwork augmentLink =
                     (AugmentedNdNetwork) yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class);
-            List<org.onosproject.tetopology.management.api.link.NetworkLink>
-                teLinks = Lists.newArrayList();
+            teLinks = Maps.newHashMap();
             for (Link link : augmentLink.link()) {
                 // Convert the Yang Link to a TE link.
-                teLinks.add(LinkConverter.yang2TeSubsystemLink(link, yangNetwork.networkId()));
+                teLinks.put(KeyId.keyId(link.linkId().uri().string()),
+                            LinkConverter.yang2TeSubsystemLink(link, yangNetwork.networkId()));
             }
-            teNetwork.setLinks(teLinks);
         }
 
         // TE Topology Ids
         if (yangNetwork.yangAugmentedInfo(AugmentedNwNetwork.class) != null) {
             AugmentedNwNetwork augmentTeIds =
                     (AugmentedNwNetwork) yangNetwork.yangAugmentedInfo(AugmentedNwNetwork.class);
-            org.onosproject.tetopology.management.api.TeTopologyId teTopologyId =
+            teTopologyId =
                     new org.onosproject.tetopology.management.api.TeTopologyId(
                             augmentTeIds.te().clientId().uint32(),
                             augmentTeIds.te().providerId().uint32(),
                             augmentTeIds.te().teTopologyId().string());
-
-            teNetwork.setTeTopologyId(teTopologyId);
         }
 
-        return teNetwork;
+        if (yangNetworkState != null) {
+            serverProvided = yangNetworkState.serverProvided();
+        }
+
+        org.onosproject.tetopology.management.api.DefaultNetwork network =
+                new org.onosproject.tetopology.management.api.DefaultNetwork(networkKeyId, supportingNetworkIds,
+                                                                             teNodes, teLinks, teTopologyId,
+                                                                             serverProvided, ownerId);
+        return network;
     }
 
     /**
@@ -455,30 +469,37 @@
      * @return network TE Topology subsystem networks object
      */
     public static org.onosproject.tetopology.management.api.Network yang2TeSubsystemNetwork(Network yangNetwork) {
-       return yang2TeDefaultNetwork(yangNetwork);
+        return yang2TeDefaultNetwork(yangNetwork, null);
     }
 
     /**
      * Network and State object conversion from YANG to TE Topology subsystem.
      *
-     * @param yangNetwork Network YANG object
+     * @param yangNetwork      Network YANG object
      * @param yangNetworkState NetworkState YANG object
      * @return teSubsystem TE Topology subsystem networks object
      */
-    public static org.onosproject.tetopology.management.api.Network yang2TeSubsystemNetwork(Network yangNetwork,
-            org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork
-                    .networksstate.Network yangNetworkState) {
-        org.onosproject.tetopology.management.api.DefaultNetwork teNetwork =
-                yang2TeDefaultNetwork(yangNetwork);
-
+    public static org.onosproject.tetopology.management.api.Network
+    yang2TeSubsystemNetwork(Network yangNetwork,
+                            org.onosproject.yang.gen
+                                    .v1.urn.ietf
+                                    .params.xml.ns
+                                    .yang.ietf
+                                    .network
+                                    .rev20151208.ietfnetwork
+                                    .networksstate
+                                    .Network
+                                    yangNetworkState) {
         checkNotNull(yangNetworkState, E_NULL_YANG_NETWORKSSTATE_NETWORK);
         checkNotNull(yangNetworkState.networkRef(), E_NULL_YANG_NETWORKSSTATE_NETWORKREF);
+
+        org.onosproject.tetopology.management.api.DefaultNetwork teNetwork =
+                yang2TeDefaultNetwork(yangNetwork, yangNetworkState);
+
         String networkref = yangNetworkState.networkRef().toString();
         checkState(teNetwork.networkId().toString().equals(networkref),
                    E_DIFF_YANG_NETWORKID);
 
-        teNetwork.setServerProvided(yangNetworkState.serverProvided());
-
         return teNetwork;
     }
 
@@ -490,8 +511,8 @@
      * @return YANG Object converted from event
      */
     public static IetfTeTopologyEvent teTopoEvent2YangIetfTeTopoEvent(TeTopologyEvent event) {
-      // TODO: implementation will be submitted as a seperate review.
-      return null;
+        // TODO: implementation will be submitted as a seperate review.
+        return null;
     }
 }
 
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 9f85e79..b0daeee 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,502 +15,71 @@
  */
 package org.onosproject.teyang.utils.topology;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.List;
-
-import org.onosproject.tetopology.management.api.KeyId;
-import org.onosproject.tetopology.management.api.node.InterfaceSwitchingCapability;
+import org.onosproject.tetopology.management.api.TeTopologyService;
+import org.onosproject.tetopology.management.api.node.NetworkNode;
 import org.onosproject.tetopology.management.api.node.NetworkNodeKey;
-import org.onosproject.tetopology.management.api.node.TeNetworkTopologyId;
-import org.onosproject.tetopology.management.api.node.TeNode;
-import org.onosproject.tetopology.management.api.node.TerminationCapability;
-import org.onosproject.tetopology.management.api.node.TerminationPoint;
-import org.onosproject.tetopology.management.api.node.TerminationPointKey;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev20130715.ietfinettypes.DomainName;
 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.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.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.tenodeaugment.DefaultTe;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.DefaultTe.TeBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.Te;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.Config;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.DefaultConfig;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.DefaultState;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.DefaultTunnelTerminationPoint;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.State;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.TunnelTerminationPoint;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconfigattributes.DefaultTeNodeAttributes;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconfigattributes.TeNodeAttributes;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.ConnectivityMatrix;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.DefaultConnectivityMatrix;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.connectivitymatrix.DefaultFrom;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.connectivitymatrix.DefaultTo;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeinfoattributes.DefaultUnderlayTopology;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeinfoattributes.UnderlayTopology;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodetunnelterminationcapability.DefaultTerminationCapability;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodetunnelterminationcapability.DefaultTerminationCapability.TerminationCapabilityBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeNodeId;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyId;
-
-import com.google.common.collect.Lists;
+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.te.topology.rev20160708.ietftetopology.TeNodeEvent;
 
 /**
  * Node conversion functions.
  */
 public final class NodeConverter {
 
-    private static final String E_NULL_TE_SUBSYSTEM_TE_NODE = "TeSubsystem teNode object cannot be null";
-    private static final String E_NULL_TE_SUBSYSTEM_TE_TUNNEL_TP = "TeSubsystem teTunnelTp object cannot be null";
-    private static final String E_NULL_TE_SUBSYSTEM_NODE = "TeSubsystem ndoe object cannot be null";
-    private static final String E_NULL_YANG_NODE = "Yang node object cannot be null";
+    private static final String E_NULL_TE_SUBSYSTEM_TE_NODE =
+            "TeSubsystem teNode object cannot be null";
+    private static final String E_NULL_TE_SUBSYSTEM_TE_TUNNEL_TP =
+            "TeSubsystem teTunnelTp object cannot be null";
+    private static final String E_NULL_TE_SUBSYSTEM_NODE =
+            "TeSubsystem ndoe object cannot be null";
+    private static final String E_NULL_YANG_NODE =
+            "Yang node object cannot be null";
 
     // no instantiation
     private NodeConverter() {
     }
 
-    /**
-     * TE Node Config object conversion from TE Topology subsystem to YANG.
-     *
-     * @param teSubsystemTeNode TE node object
-     * @return TE Node Config YANG object
-     */
-    private static Config teNode2YangConfig(TeNode teSubsystemTeNode) {
-        checkNotNull(teSubsystemTeNode, E_NULL_TE_SUBSYSTEM_TE_NODE);
-        TeNodeAttributes.TeNodeAttributesBuilder teNodeAttributesConfigBuilder =
-                DefaultTeNodeAttributes.builder()
-                                       .isAbstract(teSubsystemTeNode.isAbstract());
-        if (teSubsystemTeNode.adminStatus() != null) {
-            teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
-                    .adminStatus(EnumConverter
-                            .teSubsystem2YangAdminStatus(teSubsystemTeNode
-                            .adminStatus()));
-        }
-
-        if (teSubsystemTeNode.name() != null) {
-            teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
-                    .name(DomainName.fromString(teSubsystemTeNode.name()));
-        }
-
-        if (teSubsystemTeNode.underlayTopology() != null) {
-            teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
-                    .underlayTopology(teNode2YangUnderlayConfig(teSubsystemTeNode.underlayTopology()));
-        }
-
-        if (teSubsystemTeNode.connectivityMatrices() != null) {
-            ConnectivityMatrix.ConnectivityMatrixBuilder connectivityMatrixConfigBuilder =
-                    DefaultConnectivityMatrix.builder();
-            for (org.onosproject.tetopology.management.api.node.ConnectivityMatrix teCm : teSubsystemTeNode.
-                    connectivityMatrices()) {
-                connectivityMatrixConfigBuilder = connectivityMatrixConfigBuilder
-                        .id(teCm.id())
-                        .isAllowed(teCm.isAllowed())
-                        .from(new DefaultFrom.FromBuilder()
-                                .tpRef(TpId.fromString(teCm.from().tpId()
-                                        .toString()))
-                                .build())
-                        .to(new DefaultTo.ToBuilder()
-                                .tpRef(TpId.fromString(teCm.to().tpId()
-                                        .toString()))
-                                .build());
-                teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
-                        .addToConnectivityMatrix(connectivityMatrixConfigBuilder
-                                .build());
-            }
-        }
-
-
-        Config.ConfigBuilder yangConfigBuilder = DefaultConfig.builder();
-        yangConfigBuilder = yangConfigBuilder.teNodeAttributes(teNodeAttributesConfigBuilder.build());
-
-        return yangConfigBuilder.build();
-    }
-
-    private static UnderlayTopology teNode2YangUnderlayConfig(TeNetworkTopologyId underlayTopology) {
-        UnderlayTopology.UnderlayTopologyBuilder underlayConfigBuilder = DefaultUnderlayTopology
-                .builder()
-                .networkIdRef(NetworkId.fromString(underlayTopology.getNetworkId().toString()))
-                .teTopologyIdRef(TeTopologyId
-                        .fromString(underlayTopology
-                                .getTopologyId().topologyId()));
-        return underlayConfigBuilder.build();
-    }
-
-    /**
-     * TE Node State object conversion from TE Topology subsystem to YANG.
-     *
-     * @param teSubsystemTeNode TE node object
-     * @return TE Node State YANG object
-     */
-    private static State teNode2YangState(TeNode teSubsystemTeNode) {
-        checkNotNull(teSubsystemTeNode, E_NULL_TE_SUBSYSTEM_TE_NODE);
-
-        TeNodeAttributes.TeNodeAttributesBuilder teNodeAttributesStateBuilder = DefaultTeNodeAttributes
-                .builder()
-                .isAbstract(teSubsystemTeNode.isAbstract());
-
-        if (teSubsystemTeNode.adminStatus() != null) {
-            teNodeAttributesStateBuilder = teNodeAttributesStateBuilder
-                    .adminStatus(EnumConverter
-                            .teSubsystem2YangAdminStatus(teSubsystemTeNode
-                            .adminStatus()));
-        }
-
-        if (teSubsystemTeNode.name() != null) {
-            teNodeAttributesStateBuilder = teNodeAttributesStateBuilder
-                    .name(DomainName.fromString(teSubsystemTeNode.name()));
-        }
-
-        if (teSubsystemTeNode.underlayTopology() != null) {
-            UnderlayTopology.UnderlayTopologyBuilder underlayStateBuilder = DefaultUnderlayTopology
-                    .builder();
-            underlayStateBuilder = underlayStateBuilder
-                    .networkIdRef(NetworkId.fromString(teSubsystemTeNode
-                                                       .underlayTopology().getNetworkId().toString()))
-                    .teTopologyIdRef(TeTopologyId.fromString(teSubsystemTeNode
-                                                             .underlayTopology().getTopologyId().topologyId()));
-            teNodeAttributesStateBuilder = teNodeAttributesStateBuilder
-                    .underlayTopology(underlayStateBuilder.build());
-        }
-
-        if (teSubsystemTeNode.connectivityMatrices() != null) {
-            ConnectivityMatrix.ConnectivityMatrixBuilder connectivityMatrixStateBuilder = DefaultConnectivityMatrix
-                    .builder();
-            for (org.onosproject.tetopology.management.api.node.ConnectivityMatrix teCm : teSubsystemTeNode
-                    .connectivityMatrices()) {
-                connectivityMatrixStateBuilder = connectivityMatrixStateBuilder
-                        .id(teCm.id())
-                        .isAllowed(teCm.isAllowed())
-                        .from(new DefaultFrom.FromBuilder()
-                                .tpRef(TpId.fromString(teCm.from().tpId()
-                                        .toString()))
-                                .build())
-                        .to(new DefaultTo.ToBuilder()
-                                .tpRef(TpId.fromString(teCm.to().tpId()
-                                        .toString()))
-                                .build());
-                teNodeAttributesStateBuilder = teNodeAttributesStateBuilder
-                        .addToConnectivityMatrix(connectivityMatrixStateBuilder
-                                .build());
-            }
-        }
-
-        State.StateBuilder yangStateBuilder = DefaultState.builder();
-        yangStateBuilder = yangStateBuilder.teNodeAttributes(teNodeAttributesStateBuilder.build());
-
-        if (teSubsystemTeNode.opStatus() != null) {
-            yangStateBuilder = yangStateBuilder.operStatus(EnumConverter
-                    .teSubsystem2YangOperStatus(teSubsystemTeNode
-                            .opStatus()));
-        }
-
-        return yangStateBuilder.build();
-    }
-
-    /**
-     * TE Node TunnelTerminationPoint object conversion from TE Topology subsystem to YANG.
-     *
-     * @param teTunnelTp TE TunnelTerminationPoint object
-     * @return TunnelTerminationPoint YANG object
-     */
-    private static TunnelTerminationPoint teSubsystem2YangTtp(
-                           org.onosproject.tetopology.management.api.node.TunnelTerminationPoint teTunnelTp) {
-        checkNotNull(teTunnelTp, E_NULL_TE_SUBSYSTEM_TE_TUNNEL_TP);
-
-        TunnelTerminationPoint.TunnelTerminationPointBuilder tunnelTpBuilder =
-                DefaultTunnelTerminationPoint.builder().tunnelTpId(teTunnelTp.getTunnelTpId());
-
-        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                .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.
-                State.StateBuilder ttpStateBuilder =
-        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                .ietftetopology.tenodeaugment.te.tunnelterminationpoint.DefaultState.builder();
-
-        if (Long.valueOf(teTunnelTp.getInterLayerLockId()) != null) {
-            ttpConfigBuilder = ttpConfigBuilder.interLayerLockId(teTunnelTp.getInterLayerLockId());
-            ttpStateBuilder  = ttpStateBuilder.interLayerLockId(teTunnelTp.getInterLayerLockId());
-        }
-
-        if (teTunnelTp.getSwitchingCapabilities() != null) {
-            // FIXME: switchingCapabilities is a list in
-            // teSubsystem, but is not a list in yang. how to handle
-            // this?
-            for (InterfaceSwitchingCapability iscTe : teTunnelTp.getSwitchingCapabilities()) {
-                // ttpConfigBuilder =
-                // ttpConfigBuilder.switchingCapability(switchingCapability)
-                // ttpStateBuilder =
-                // ttpStateBuilder.switchingCapability(switchingCapability)
-            }
-        }
-
-        if (teTunnelTp.getTerminationCapabilities() != null) {
-            for (TerminationCapability tcap : teTunnelTp.getTerminationCapabilities()) {
-                TerminationCapabilityBuilder tcapBuilder = DefaultTerminationCapability
-                        .builder();
-                // FIXME: at this moment, tcap does not have any getter or setter.
-                // add the following getLinkTpId possibly other attributes to Core data structure
-                // tcapConfigBuilder =
-                // tcapConfigBuilder.linkTp(TpId.fromString(tcap.getLinkTpId.toString()));
-                ttpConfigBuilder = ttpConfigBuilder
-                        .addToTerminationCapability(tcapBuilder.build());
-                ttpStateBuilder = ttpStateBuilder
-                        .addToTerminationCapability(tcapBuilder.build());
-            }
-        }
-
-        tunnelTpBuilder = tunnelTpBuilder.config(ttpConfigBuilder.build())
-                                         .state(ttpStateBuilder.build());
-
-        return tunnelTpBuilder.build();
-    }
 
     /**
      * Node object conversion from TE Topology subsystem to YANG.
      *
-     * @param teSubsystem TE subsystem node object
-     * @return YANG node object
+     * @param teSubsystem TE subsystem node
+     * @return YANG node
      */
     public static Node teSubsystem2YangNode(org.onosproject.tetopology.management.api.node.NetworkNode teSubsystem) {
-        checkNotNull(teSubsystem, E_NULL_TE_SUBSYSTEM_NODE);
-
-        NodeId nodeId = NodeId.fromString(teSubsystem.nodeId().toString());
-        Node.NodeBuilder builder = DefaultNode.builder().nodeId(nodeId);
-
-        if (teSubsystem.getSupportingNodeIds() != null) {
-            List<SupportingNode> sNodes = Lists.newArrayList();
-            SupportingNode.SupportingNodeBuilder spNodeBuilder = DefaultSupportingNode
-                    .builder();
-            for (NetworkNodeKey nodeKey : teSubsystem.getSupportingNodeIds()) {
-                sNodes.add(spNodeBuilder
-                        .networkRef(NetworkId
-                                .fromString(nodeKey.networkId().toString()))
-                        .nodeRef(NodeId.fromString(nodeKey.nodeId().toString()))
-                        .build());
-            }
-            builder = builder.supportingNode(sNodes);
-        }
-
-        if (teSubsystem.getTerminationPoints() != null) {
-            AugmentedNdNode.AugmentedNdNodeBuilder tpAugmentBuilder = DefaultAugmentedNdNode
-                    .builder();
-            List<TerminationPoint> teSubsystemTeTp = teSubsystem
-                    .getTerminationPoints();
-            for (TerminationPoint teTp : teSubsystemTeTp) {
-                tpAugmentBuilder.addToTerminationPoint(TerminationPointConverter
-                        .teSubsystem2YangTerminationPoint(teTp));
-            }
-            builder.addYangAugmentedInfo(tpAugmentBuilder.build(),
-                                         AugmentedNdNode.class);
-        }
-
-        if (teSubsystem.getTe() != null) {
-            AugmentedNwNode.AugmentedNwNodeBuilder nodeAugmentBuilder = DefaultAugmentedNwNode
-                    .builder();
-
-            TeNode teSubsystemTeNode = teSubsystem.getTe();
-
-            TeBuilder yangTeBuilder = DefaultTe.builder();
-
-            if (teSubsystemTeNode.teNodeId() != null) {
-                yangTeBuilder = yangTeBuilder.teNodeId(TeNodeId
-                        .fromString(teSubsystemTeNode.teNodeId().toString()));
-            }
-
-            // Set configuration data
-            // Set state data
-            yangTeBuilder = yangTeBuilder.config(teNode2YangConfig(teSubsystemTeNode))
-                                         .state(teNode2YangState(teSubsystemTeNode));
-
-            if (teSubsystemTeNode.tunnelTerminationPoints() != null) {
-                for (org.onosproject.tetopology.management.api.node.TunnelTerminationPoint
-                        teTunnelTp : teSubsystemTeNode.tunnelTerminationPoints()) {
-                    yangTeBuilder = yangTeBuilder.addToTunnelTerminationPoint(teSubsystem2YangTtp(teTunnelTp));
-                }
-            }
-
-            nodeAugmentBuilder = nodeAugmentBuilder.te(yangTeBuilder.build());
-            builder.addYangAugmentedInfo(nodeAugmentBuilder.build(),
-                                         AugmentedNwNode.class);
-        }
-        return builder.build();
+        //TODO: implementation to be submitted as a separate review
+        return null;
     }
 
     /**
      * Node object conversion from YANG to TE Topology subsystem.
      *
-     * @param yangNode YANG node object
-     * @param yangNetworkId YANG networkId object
-     * @return TE subsystem node object
+     * @param yangNode      Network node in YANG model
+     * @param yangNetworkId YANG network identifier in YANG model
+     * @return TE subsystem node
      */
     public static org.onosproject.tetopology.management.api.node.NetworkNode
-                      yang2TeSubsystemNode(Node yangNode, NetworkId yangNetworkId) {
-        checkNotNull(yangNode, E_NULL_YANG_NODE);
+    yang2TeSubsystemNode(Node yangNode, NetworkId yangNetworkId) {
 
-        org.onosproject.tetopology.management.api.node.DefaultNetworkNode node =
-                new org.onosproject.tetopology.management.api.node.DefaultNetworkNode(
-                       KeyId.keyId(yangNode.nodeId().uri().string()));
+        //TODO: implementation to be submitted as separate review
 
-        if (yangNode.supportingNode() != null) {
-            List<NetworkNodeKey> spNodes = Lists.newArrayList();
-            for (SupportingNode yangSpNode : yangNode.supportingNode()) {
-                NetworkNodeKey nodeKey = new NetworkNodeKey(KeyId.keyId(yangSpNode.nodeRef().uri().toString()),
-                                                            KeyId.keyId(yangSpNode.networkRef().uri().toString()));
-                spNodes.add(nodeKey);
-            }
-            node.setSupportingNodeIds(spNodes);
-        }
-
-        if (yangNode.yangAugmentedInfoMap() != null
-                && !yangNode.yangAugmentedInfoMap().isEmpty()) {
-
-            AugmentedNdNode yangTpNodeAugment = (AugmentedNdNode) yangNode
-                    .yangAugmentedInfo(AugmentedNdNode.class);
-            if (yang2TeSubsystemTpNodeAugment(yangTpNodeAugment) != null) {
-                node.setTerminationPoints(yang2TeSubsystemTpNodeAugment(yangTpNodeAugment));
-            }
-
-            AugmentedNwNode yangNodeAugment = (AugmentedNwNode) yangNode
-                    .yangAugmentedInfo(AugmentedNwNode.class);
-            if (yangNodeAugment != null && yangNodeAugment.te() != null && yangNodeAugment.te().teNodeId() != null) {
-                Te yangNodeAugTe = yangNodeAugment.te();
-                TeNode teNode = yang2TeSubsystemNodeAugment(yangNodeAugTe, yangNetworkId, yangNode.nodeId());
-                node.setTe(teNode);
-            }
-        }
-
-        return node;
+        return null;
     }
 
-    private static TeNode yang2TeSubsystemNodeConnectivityMatrix(TeNode teNode,
-            String networkId, String nodeId, List<ConnectivityMatrix> yangMatrix) {
-        List<org.onosproject.tetopology.management.api.node.ConnectivityMatrix> teCmList =
-                Lists.newArrayList();
-        for (ConnectivityMatrix cmYang : yangMatrix) {
-            Long id = cmYang.id();
-            TerminationPointKey from = new TerminationPointKey(
-                                           KeyId.keyId(networkId),
-                                           KeyId.keyId(nodeId),
-                                           KeyId.keyId(cmYang.from().tpRef().toString()));
-            TerminationPointKey to = new TerminationPointKey(
-                                           KeyId.keyId(networkId),
-                                           KeyId.keyId(nodeId),
-                                           KeyId.keyId(cmYang.to().tpRef().toString()));
-            boolean isAllowed = cmYang.isAllowed();
-            org.onosproject.tetopology.management.api.node.ConnectivityMatrix cmTe =
-                    new org.onosproject.tetopology.management.api.node.ConnectivityMatrix(
-                            id, from, to, isAllowed);
-            teCmList.add(cmTe);
-        }
-        teNode.setConnectivityMatrices(teCmList);
-        return teNode;
+    public static NetworkNodeKey yangNodeEvent2NetworkNodeKey(TeNodeEvent yangNodeEvent) {
+
+        //TODO: implementation to be submitted as separate review
+
+        return null;
     }
 
-    private static TeNode yang2TeSubsystemNodeUnderlayTopology(TeNode teNode,
-                                                               UnderlayTopology ut) {
-        TeNetworkTopologyId underlayTopology =
-                new TeNetworkTopologyId(KeyId.keyId(ut.networkIdRef().toString()),
-                new org.onosproject.tetopology.management.api.TeTopologyId(
-                            ((long) ut.providerIdRef()),
-                            ((long) ut.clientIdRef()),
-                            ut.teTopologyIdRef().toString()));
-        teNode.setUnderlayTopology(underlayTopology);
-        return teNode;
-    }
+    public static NetworkNode yangNodeEvent2NetworkNode(TeNodeEvent yangNodeEvent,
+                                                        TeTopologyService teTopologyService) {
 
-    private static TeNode yang2TeSubsystemTtp(TeNode teNode,
-                                              List<TunnelTerminationPoint> ttps) {
-        List<org.onosproject.tetopology.management.api.node.TunnelTerminationPoint> ttpTeList =
-                Lists.newArrayList();
-        for (TunnelTerminationPoint ttpYang : ttps) {
-            org.onosproject.tetopology.management.api.node.TunnelTerminationPoint ttpTe =
-                    new org.onosproject.tetopology.management.api.node.TunnelTerminationPoint(
-                            ttpYang.tunnelTpId());
-            ttpTe.setInterLayerLockId(ttpYang.config().interLayerLockId());
-            // FIXME: go through
-            // ttpYang.config().switchingCapability() and populate
-            // ttpTe.setSwitchingCapabilities(switchingCapabilities);
-            // FIXME: go through
-            // ttpYang.config().terminationCapability() and populate
-            // ttpTe.setTerminationCapability(terminationCapability);
-            ttpTeList.add(ttpTe);
-        }
-        teNode.setTunnelTerminationPoints(ttpTeList);
+        //TODO: implementation to be submitted as separate review
 
-        return teNode;
-    }
-
-    private static TeNode yang2TeSubsystemNodeAugment(Te yangNodeAugTe,
-            NetworkId yangNetworkId, NodeId yangNodeId) {
-        TeNode teNode = new TeNode(yangNodeAugTe.teNodeId().toString());
-        Config ynodeAugCfg = yangNodeAugTe.config();
-        if (ynodeAugCfg != null) {
-            TeNodeAttributes teNodeAttr = ynodeAugCfg.teNodeAttributes();
-            if (teNodeAttr != null) {
-                teNode.setAbstract(teNodeAttr.isAbstract());
-
-                if (teNodeAttr.adminStatus() != null) {
-                    teNode.setAdminStatus(EnumConverter.yang2TeSubsystemAdminStatus(
-                                                            ynodeAugCfg.teNodeAttributes().adminStatus()));
-                }
-
-                if (yangNodeAugTe.state() != null &&
-                        yangNodeAugTe.state().operStatus() != null) {
-                    teNode.setOpStatus(EnumConverter.yang2TeSubsystemOpStatus(
-                                                         yangNodeAugTe.state().operStatus()));
-                }
-
-                if (teNodeAttr.connectivityMatrix() != null) {
-                    teNode = yang2TeSubsystemNodeConnectivityMatrix(teNode,
-                                                                    yangNetworkId.uri().toString(),
-                                                                    yangNodeId.uri().toString(),
-                                                                    teNodeAttr.connectivityMatrix());
-                }
-
-                if (teNodeAttr.underlayTopology() != null) {
-                    teNode = yang2TeSubsystemNodeUnderlayTopology(teNode,
-                                                                  teNodeAttr.underlayTopology());
-                }
-            }
-        }
-
-        if (yangNodeAugTe.tunnelTerminationPoint() != null) {
-            teNode = yang2TeSubsystemTtp(teNode, yangNodeAugTe.tunnelTerminationPoint());
-        }
-        return teNode;
-    }
-
-    private static List<TerminationPoint> yang2TeSubsystemTpNodeAugment(AugmentedNdNode yangTpNodeAugment) {
-        if (yangTpNodeAugment.terminationPoint() != null) {
-            List<TerminationPoint> teTpList = Lists.newArrayList();
-            for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology
-                    .rev20151208.ietfnetworktopology.networks.network.node.augmentedndnode.TerminationPoint
-                    yangTpnode : yangTpNodeAugment.terminationPoint()) {
-                teTpList.add(TerminationPointConverter.yang2teSubsystemTerminationPoint(yangTpnode));
-            }
-            return teTpList;
-        }
         return null;
     }
 }
diff --git a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/TerminationPointConverter.java b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/TerminationPointConverter.java
index 945ad56..2084f3e 100644
--- a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/TerminationPointConverter.java
+++ b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/TerminationPointConverter.java
@@ -15,50 +15,18 @@
  */
 package org.onosproject.teyang.utils.topology;
 
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.List;
-
-import org.onosproject.tetopology.management.api.KeyId;
-import org.onosproject.tetopology.management.api.node.TeTerminationPoint;
-import org.onosproject.tetopology.management.api.node.TerminationPointKey;
-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.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.DefaultTerminationPoint;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
-               .ietfnetworktopology.networks.network.node.augmentedndnode.TerminationPoint;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
-               .ietfnetworktopology.networks.network.node.augmentedndnode.terminationpoint
-                       .DefaultSupportingTerminationPoint;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
-               .ietfnetworktopology.networks.network.node.augmentedndnode.terminationpoint
-                       .SupportingTerminationPoint;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.interfaceswitchingcapabilitylist.DefaultInterfaceSwitchingCapability;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.interfaceswitchingcapabilitylist.InterfaceSwitchingCapability;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.terminationpoint.AugmentedNtTerminationPoint;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-               .ietftetopology.networks.network.node.terminationpoint.DefaultAugmentedNtTerminationPoint;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.teterminationpointaugment.DefaultTe;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.teterminationpointaugment.DefaultTe.TeBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.teterminationpointaugment.te.Config;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.teterminationpointaugment.te.DefaultConfig;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.teterminationpointaugment.te.DefaultState;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.teterminationpointaugment.te.State;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTpId;
-
-import com.google.common.collect.Lists;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
+        .networks.network.node.augmentedndnode.TerminationPoint;
 
 /**
  * The termination point translations.
  */
 public final class TerminationPointConverter {
 
-    private static final String E_NULL_TE_SUBSYSTEM_TP = "TeSubsystem terminationPoint object cannot be null";
-    private static final String E_NULL_YANG_TP = "YANG terminationPoint object cannot be null";
+    private static final String E_NULL_TE_SUBSYSTEM_TP =
+            "TeSubsystem terminationPoint object cannot be null";
+    private static final String E_NULL_YANG_TP =
+            "YANG terminationPoint object cannot be null";
 
     // no instantiation
     private TerminationPointConverter() {
@@ -67,142 +35,28 @@
     /**
      * TerminationPoint object translation from TE Topology subsystem to YANG.
      *
-     * @param teSubsystem TE Topology subsystem termination point object
-     * @return TerminationPoint YANG object
+     * @param teSubsystem TE Topology subsystem termination point
+     * @return Termination point in YANG Java data structure
      */
     public static TerminationPoint teSubsystem2YangTerminationPoint(
-                                       org.onosproject.tetopology.management.api.node.TerminationPoint teSubsystem) {
-        checkNotNull(teSubsystem, E_NULL_TE_SUBSYSTEM_TP);
+            org.onosproject.tetopology.management.api.node.TerminationPoint teSubsystem) {
 
-        TpId tpId = TpId.fromString(teSubsystem.id().toString());
-        TerminationPoint.TerminationPointBuilder builder =
-                new DefaultTerminationPoint.TerminationPointBuilder().tpId(tpId);
-
-        if (teSubsystem.getSupportingTpIds() != null) {
-            List<SupportingTerminationPoint> tps = Lists.newArrayList();
-            SupportingTerminationPoint.SupportingTerminationPointBuilder
-                    spTpBuilder = DefaultSupportingTerminationPoint.builder();
-            for (TerminationPointKey tpKey : teSubsystem.getSupportingTpIds()) {
-                tps.add(spTpBuilder.networkRef(NetworkId.fromString(tpKey.networkId().toString()))
-                                   .nodeRef(NodeId.fromString(tpKey.nodeId().toString()))
-                                   .tpRef(TpId.fromString(tpKey.tpId().toString()))
-                                   .build());
-            }
-            builder = builder.supportingTerminationPoint(tps);
-        }
-
-        if (teSubsystem.getTe() != null) {
-            AugmentedNtTerminationPoint.AugmentedNtTerminationPointBuilder
-                    tpAugmentBuilder = DefaultAugmentedNtTerminationPoint.builder();
-
-            TeTerminationPoint teSubsystemTe = teSubsystem.getTe();
-            TeBuilder yangTeBuilder = DefaultTe.builder();
-
-            if (teSubsystemTe.teTpId() != null) {
-                yangTeBuilder = yangTeBuilder.teTpId(TeTpId.fromString(teSubsystemTe.teTpId().toString()));
-            }
-
-            Config yConfig = teSubsystem2YangTeAugConfig(teSubsystemTe);
-            yangTeBuilder = yangTeBuilder.config(yConfig);
-
-            State yState = teSubsystem2YangTeAugState(teSubsystemTe);
-            yangTeBuilder = yangTeBuilder.state(yState);
-
-            tpAugmentBuilder = tpAugmentBuilder.te(yangTeBuilder.build());
-            builder.addYangAugmentedInfo(tpAugmentBuilder.build(), AugmentedNtTerminationPoint.class);
-        }
-
-        return builder.build();
+        //TODO: implementation to be submitted as a separate review
+        return null;
     }
 
-    private static State teSubsystem2YangTeAugState(TeTerminationPoint teSubsystemTe) {
-        State.StateBuilder yangStateBuilder = DefaultState.builder();
-        yangStateBuilder.interLayerLockId(teSubsystemTe.getInterLayerLockId());
-
-        if (teSubsystemTe.interfaceSwitchingCapabilities() != null) {
-            for (org.onosproject.tetopology.management.api.node.InterfaceSwitchingCapability teIsc :
-                    teSubsystemTe.interfaceSwitchingCapabilities()) {
-                InterfaceSwitchingCapability.InterfaceSwitchingCapabilityBuilder isc =
-                        DefaultInterfaceSwitchingCapability.builder();
-                // FIXME: teIsc at this moment is empty, therefore we cannot
-                // really add its attributes to isc
-                yangStateBuilder.addToInterfaceSwitchingCapability(isc.build());
-            }
-        }
-        return yangStateBuilder.build();
-    }
-
-    private static Config teSubsystem2YangTeAugConfig(TeTerminationPoint teSubsystemTe) {
-        Config.ConfigBuilder yangConfigBuilder = DefaultConfig.builder();
-        yangConfigBuilder = yangConfigBuilder.interLayerLockId(teSubsystemTe.getInterLayerLockId());
-        if (teSubsystemTe.interfaceSwitchingCapabilities() != null) {
-            for (org.onosproject.tetopology.management.api.node.InterfaceSwitchingCapability teIsc :
-                    teSubsystemTe.interfaceSwitchingCapabilities()) {
-                InterfaceSwitchingCapability.InterfaceSwitchingCapabilityBuilder
-                    isc = DefaultInterfaceSwitchingCapability.builder();
-                // FIXME: teIsc at this moment is empty, therefore we cannot
-                // really add its attributes to isc
-                yangConfigBuilder = yangConfigBuilder.addToInterfaceSwitchingCapability(isc.build());
-            }
-        }
-        return yangConfigBuilder.build();
-    }
 
     /**
      * TerminationPoint object translation from YANG to TE Topology subsystem.
      *
-     * @param yangTp TerminationPoint YANG object
-     * @return TerminationPoint TE Topology subsystem termination point object
+     * @param yangTp Termination point in YANG Java data structure
+     * @return TerminationPoint TE Topology subsystem termination point
      */
     public static org.onosproject.tetopology.management.api.node.TerminationPoint
-                      yang2teSubsystemTerminationPoint(TerminationPoint yangTp) {
-        checkNotNull(yangTp, E_NULL_YANG_TP);
+    yang2teSubsystemTerminationPoint(TerminationPoint yangTp) {
 
-        org.onosproject.tetopology.management.api.node.DefaultTerminationPoint tp = new org.onosproject.tetopology
-                .management.api.node.DefaultTerminationPoint(KeyId.keyId(yangTp.tpId().uri().string()));
-
-        if (yangTp.supportingTerminationPoint() != null) {
-            List<org.onosproject.tetopology.management.api.node.TerminationPointKey> spTps = Lists.newArrayList();
-            for (SupportingTerminationPoint yangSptp : yangTp.supportingTerminationPoint()) {
-                org.onosproject.tetopology.management.api.node.TerminationPointKey tpKey =
-                        new org.onosproject.tetopology.management.api.node.TerminationPointKey(
-                                KeyId.keyId(yangSptp.networkRef().uri().string()),
-                                KeyId.keyId(yangSptp.nodeRef().uri().string()),
-                                KeyId.keyId(yangSptp.tpRef().uri().string()));
-                spTps.add(tpKey);
-            }
-            tp.setSupportingTpIds(spTps);
-        }
-
-        if (yangTp.yangAugmentedInfoMap() != null && !yangTp.yangAugmentedInfoMap().isEmpty()) {
-            AugmentedNtTerminationPoint yangTpAugment =
-                    (AugmentedNtTerminationPoint) yangTp.yangAugmentedInfo(AugmentedNtTerminationPoint.class);
-            if (yangTpAugment.te() != null && yangTpAugment.te().teTpId() != null) {
-                KeyId teTpId = KeyId.keyId(yangTpAugment.te().teTpId().toString());
-                if (yangTpAugment.te().config() != null) {
-                    long interLayerLockId = yangTpAugment.te().config().interLayerLockId();
-                    List<org.onosproject.tetopology.management.api.node.InterfaceSwitchingCapability>
-                            teIscList = Lists.newArrayList();
-                    if (yangTpAugment.te().config().interfaceSwitchingCapability() != null) {
-                        for (InterfaceSwitchingCapability iscConfigYang :
-                                yangTpAugment.te().config().interfaceSwitchingCapability()) {
-                            org.onosproject.tetopology.management.api.node.InterfaceSwitchingCapability iscTe =
-                                    new org.onosproject.tetopology.management.api.node.InterfaceSwitchingCapability();
-                            // FIXME: at this moment, iscTe does not have any
-                            // attributes. Therefore, I cannot feed it with
-                            // attributes of iscConfigYang
-                            teIscList.add(iscTe);
-                        }
-                    }
-
-                    TeTerminationPoint teSubsystemTp = new TeTerminationPoint(teTpId,
-                                                                              teIscList,
-                                                                              interLayerLockId);
-                    tp.setTe(teSubsystemTp);
-                }
-            }
-        }
-        return tp;
+        // TODO: implementation to be submitted as separate review
+        return null;
     }
 
 }
