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 f784fa7..1c07f9b 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,6 +15,12 @@
  */
 package org.onosproject.teyang.utils.topology;
 
+import org.onosproject.tetopology.management.api.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.
  */
@@ -24,5 +30,104 @@
     private EnumConverter() {
     }
 
-// TODO: implementation of this class will be submitted as a separate review.
-}
+    /**
+     * 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;
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/LinkConverter.java b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/LinkConverter.java
index 6b10176..401d1f9 100644
--- a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/LinkConverter.java
+++ b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/LinkConverter.java
@@ -15,13 +15,130 @@
  */
 package org.onosproject.teyang.utils.topology;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.List;
+import java.util.Map;
+
+import org.onlab.packet.Ip4Address;
+import org.onosproject.tetopology.management.api.KeyId;
+import org.onosproject.tetopology.management.api.TeStatus;
+import org.onosproject.tetopology.management.api.TeTopologyKey;
 import org.onosproject.tetopology.management.api.TeTopologyService;
+import org.onosproject.tetopology.management.api.link.CommonLinkData;
+import org.onosproject.tetopology.management.api.link.DefaultNetworkLink;
+import org.onosproject.tetopology.management.api.link.DefaultTeLink;
+import org.onosproject.tetopology.management.api.link.ElementType;
+import org.onosproject.tetopology.management.api.link.ExternalLink;
+import org.onosproject.tetopology.management.api.link.LinkBandwidth;
 import org.onosproject.tetopology.management.api.link.NetworkLink;
 import org.onosproject.tetopology.management.api.link.NetworkLinkKey;
+import org.onosproject.tetopology.management.api.link.OduResource;
+import org.onosproject.tetopology.management.api.link.PathElement;
+import org.onosproject.tetopology.management.api.link.TeLink;
+import org.onosproject.tetopology.management.api.link.TeLinkTpGlobalKey;
+import org.onosproject.tetopology.management.api.link.TeLinkTpKey;
+import org.onosproject.tetopology.management.api.link.TePathAttributes;
+import org.onosproject.tetopology.management.api.link.TeTunnelId;
+import org.onosproject.tetopology.management.api.link.TunnelProtectionType;
+import org.onosproject.tetopology.management.api.link.UnderlayBackupPath;
+import org.onosproject.tetopology.management.api.link.UnderlayPath;
+import org.onosproject.tetopology.management.api.node.NodeTpKey;
+import org.onosproject.tetopology.management.api.node.TeNode;
+import org.onosproject.tetopology.management.api.node.TeNodeKey;
+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.topology.rev20151208.ietfnetworktopology
-        .networks.network.augmentedndnetwork.Link;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.Networks;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NodeId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.Network;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network.Node;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.LinkId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.TpId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology.networks.network.AugmentedNdNetwork;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.augmentedndnetwork.DefaultLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.augmentedndnetwork.DefaultLink.LinkBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.augmentedndnetwork.Link;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.augmentedndnetwork.link.DefaultDestination;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.augmentedndnetwork.link.DefaultSource;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.augmentedndnetwork.link.DefaultSupportingLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+                .ietfnetworktopology.networks.network.augmentedndnetwork.link.Destination
+                .DestinationBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.augmentedndnetwork.link.Source.SourceBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.augmentedndnetwork.link.SupportingLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.augmentedndnetwork.link.SupportingLink
+               .SupportingLinkBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology.networks.network.node.AugmentedNdNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.DefaultTeLinkEvent;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.TeLinkEvent;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.DefaultInformationSourceState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.InformationSourceState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.informationsourcestate.DefaultTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.informationsourcestate.Topology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks.network.AugmentedNwNetwork;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+               .ietftetopology.networks.network.link.AugmentedNtLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+               .ietftetopology.networks.network.link.DefaultAugmentedNtLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+               .ietftetopology.networks.network.link.DefaultAugmentedNtLink.AugmentedNtLinkBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks.network.node.AugmentedNwNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks.network.node.terminationpoint.AugmentedNtTerminationPoint;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.DefaultTe;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.DefaultTe.TeBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.Config;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultConfig;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultConfig.ConfigBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.DefaultState.StateBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkaugment.te.State;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.DefaultTeLinkAttributes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.DefaultTeLinkAttributes.TeLinkAttributesBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.TeLinkAttributes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultExternalDomain;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultExternalDomain.ExternalDomainBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultUnderlay;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.DefaultUnderlay.UnderlayBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconfigattributes.telinkattributes.ExternalDomain;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultTeSrlgs;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultTeSrlgs.TeSrlgsBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultUnreservedBandwidth;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.DefaultUnreservedBandwidth.UnreservedBandwidthBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.Te;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.TeSrlgs;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.UnreservedBandwidth;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkinfoattributes.LinkProtectionTypeEnum;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayBackupPath;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayBackupPath.UnderlayBackupPathBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayPrimaryPath;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayPrimaryPath.UnderlayPrimaryPathBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.UnderlayPrimaryPath;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.underlayprimarypath.DefaultPathElement;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.Srlg;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeNodeId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeOperStatus;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyEventType;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTpId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.tetopologyeventtype.TeTopologyEventTypeEnum;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
 
 /**
  * The conversion functions.
@@ -42,41 +159,828 @@
     private LinkConverter() {
     }
 
+    private static LinkProtectionTypeEnum teSubsystem2YangLinkProtectionType(TunnelProtectionType linkProtectionType) {
+        switch (linkProtectionType) {
+        case ENHANCED:
+            return LinkProtectionTypeEnum.ENHANCED;
+        case EXTRA_TRAFFIC:
+            return LinkProtectionTypeEnum.EXTRA_TRAFFIC;
+        case SHARED:
+            return LinkProtectionTypeEnum.SHARED;
+        case UNPROTECTED:
+            return LinkProtectionTypeEnum.UNPROTECTED;
+        case ONE_FOR_ONE:
+            return LinkProtectionTypeEnum.YANGAUTOPREFIX1_FOR_1;
+        case ONE_PLUS_ONE:
+            return LinkProtectionTypeEnum.YANGAUTOPREFIX1_PLUS_1;
+        default:
+            return null;
+        }
+    }
+    /**
+     * TE Link Config object conversion from TE Topology subsystem to YANG.
+     *
+     * @param teLink TE link object
+     * @return TE Link Config YANG object
+     */
+    private static Config teLink2YangConfig(TeLink teLink) {
+        checkNotNull(teLink, E_NULL_TELINK_DATA);
 
+        TeLinkAttributesBuilder attrBuilder = DefaultTeLinkAttributes.builder();
+
+        if (teLink.teLinkKey() != null) {
+            // what is link index? for now I used teLinkTpId
+            attrBuilder = attrBuilder.linkIndex(BigInteger.valueOf(teLink.teLinkKey().teLinkTpId()));
+        }
+
+        if (teLink.adminStatus() != null) {
+            attrBuilder = attrBuilder.adminStatus(EnumConverter.teSubsystem2YangAdminStatus(teLink.adminStatus()));
+        }
+
+        if (teLink.tunnelProtectionType() != null) {
+            attrBuilder = attrBuilder
+                    .linkProtectionType(teSubsystem2YangLinkProtectionType(teLink
+                            .tunnelProtectionType()));
+        }
+
+        attrBuilder = attrBuilder.teDefaultMetric(teLink.cost());
+
+        if (teLink.srlgs() != null) {
+            TeSrlgsBuilder teSrlgsBuilder = DefaultTeSrlgs.builder();
+            for (Long srlgLongVal : teLink.srlgs()) {
+                teSrlgsBuilder = teSrlgsBuilder.addToValue(new Srlg(srlgLongVal));
+            }
+            attrBuilder = attrBuilder.teSrlgs(teSrlgsBuilder.build());
+        }
+        attrBuilder = attrBuilder.isAbstract(teLink.flags().get(TeNode.BIT_ABSTRACT));
+
+        if (teLink.externalLink() != null) {
+            ExternalDomainBuilder edBuilder =
+                    DefaultExternalDomain.builder();
+            if (teLink.externalLink().plugId() != null) {
+                edBuilder.plugId(teLink.externalLink().plugId());
+            }
+            if (teLink.externalLink().externalLinkKey() != null) {
+                edBuilder = edBuilder
+                        .remoteTeLinkTpId(TeTpId.fromString(
+                                                                String.valueOf(teLink
+                                                                        .externalLink()
+                                                                        .externalLinkKey()
+                                                                        .teLinkTpId())))
+                        .remoteTeNodeId(TeNodeId.fromString(
+                                                                String.valueOf(teLink
+                                                                        .externalLink()
+                                                                        .externalLinkKey()
+                                                                        .teNodeId())));
+            }
+            attrBuilder = attrBuilder.externalDomain(edBuilder.build());
+        }
+
+        if (teLink.availBandwidth() != null) {
+            short i = 0;
+            for (float f : teLink.availBandwidth()) {
+                UnreservedBandwidthBuilder urBuilder =
+                        DefaultUnreservedBandwidth.builder()
+                                                  .bandwidth(BigDecimal.valueOf(f))
+                                                  .priority(i);
+                i++;
+                attrBuilder = attrBuilder.addToUnreservedBandwidth(urBuilder.build());
+            }
+        }
+
+        if (teLink.maxBandwidth() != null) {
+            // maxBandwidth is an array of float[], but in yang is just a big decimal
+            attrBuilder = attrBuilder.maxLinkBandwidth(BigDecimal.valueOf(teLink.maxBandwidth()[0]));
+        }
+        // FIXME: how to retrieve maxResvLinkBandwidth from teLink
+//        if (teLink.maxResvLinkBandwidth() != null) {
+//            attrBuilder = attrBuilder.maxResvLinkBandwidth(teLink.maxResvLinkBandwidth());
+//        }
+
+        UnderlayBuilder builder = DefaultUnderlay.builder();
+        if (teLink.primaryPath() != null) {
+
+            // TODO: what is underlayProtectionType in tePath?
+            // builder = builder.underlayProtectionType(tePath.protectionType());
+
+            builder = te2YangConfigUnderlayPrimaryPath(builder, teLink);
+        }
+
+        if (teLink.backupPaths() != null) {
+            builder = te2YangConfigUnderlayBackupPaths(builder, teLink);
+        }
+
+        attrBuilder = attrBuilder.underlay(builder.build());
+
+        ConfigBuilder yangConfigBuilder = DefaultConfig.builder()
+                                                       .teLinkAttributes(attrBuilder.build());
+        return yangConfigBuilder.build();
+    }
+
+    /**
+     * TE Link State object conversion from TE Topology subsystem to YANG.
+     *
+     * @param teLink TE link object
+     * @return TE Link State YANG object
+     */
+    private static State teLink2YangState(TeLink teLink) {
+        TeLinkAttributes
+            .TeLinkAttributesBuilder attrBuilder =
+                        DefaultTeLinkAttributes
+            .builder()
+            .teDefaultMetric(teLink.cost())
+            .isAbstract(teLink.flags().get(TeLink.BIT_ABSTRACT));
+        if (teLink.teLinkKey() != null) {
+            // what is link index? for now I used teLinkTpId
+            attrBuilder = attrBuilder.linkIndex(BigInteger.valueOf(teLink.teLinkKey().teLinkTpId()));
+        }
+
+        if (teLink.adminStatus() != null) {
+            attrBuilder = attrBuilder.adminStatus(EnumConverter.teSubsystem2YangAdminStatus(teLink.adminStatus()));
+        }
+        if (teLink.tunnelProtectionType() != null) {
+            attrBuilder = attrBuilder
+                    .linkProtectionType(teSubsystem2YangLinkProtectionType(teLink
+                            .tunnelProtectionType()));
+        }
+        // FIXME: maxBandwidth stuff are array[] in TE but not in yang...
+//        if (teLink.maxLinkBandwidth() != null) {
+//            attrBuilder = attrBuilder.maxLinkBandwidth(teLink.maxLinkBandwidth());
+//        }
+//        if (teLink.maxResvLinkBandwidth() != null) {
+//            attrBuilder = attrBuilder.maxResvLinkBandwidth(teLink.maxResvLinkBandwidth());
+//        }
+        if (teLink.srlgs() != null) {
+            TeSrlgs.TeSrlgsBuilder srlgsBuilder = DefaultTeSrlgs.builder();
+            for (Long srlgLongVal : teLink.srlgs()) {
+                srlgsBuilder = srlgsBuilder.addToValue(new Srlg(srlgLongVal));
+            }
+            attrBuilder = attrBuilder.teSrlgs(srlgsBuilder.build());
+        }
+
+        if (teLink.externalLink() != null) {
+            ExternalDomain.ExternalDomainBuilder edBuilder = DefaultExternalDomain
+                    .builder();
+            if (teLink.externalLink().plugId() != null) {
+                edBuilder = edBuilder.plugId(teLink.externalLink().plugId());
+            }
+            if (teLink.externalLink().externalLinkKey() != null) {
+                edBuilder = edBuilder
+                        .remoteTeLinkTpId(TeTpId.fromString(String.valueOf(teLink
+                                                                           .externalLink()
+                                                                           .externalLinkKey()
+                                                                           .teLinkTpId())))
+                        .remoteTeNodeId(TeNodeId.fromString(String.valueOf(teLink
+                                                                           .externalLink()
+                                                                           .externalLinkKey()
+                                                                           .teNodeId())));
+            }
+            attrBuilder = attrBuilder.externalDomain(edBuilder.build());
+
+        }
+
+        if (teLink.availBandwidth() != null) {
+            short i = 0;
+            for (float f : teLink.availBandwidth()) {
+                UnreservedBandwidth.UnreservedBandwidthBuilder urBuilder = DefaultUnreservedBandwidth
+                        .builder()
+                                               .bandwidth(BigDecimal.valueOf(f))
+                                               .priority(i);
+                i++;
+                attrBuilder = attrBuilder.addToUnreservedBandwidth(urBuilder.build());
+            }
+        }
+
+        StateBuilder yangStateBuilder = DefaultState.builder()
+                                                    .teLinkAttributes(attrBuilder.build());
+        if (teLink.opStatus() != null) {
+            yangStateBuilder = yangStateBuilder.operStatus(EnumConverter
+                                                           .teSubsystem2YangOperStatus(teLink.opStatus()));
+        }
+
+        if (teLink.sourceTeLinkId() != null) {
+            InformationSourceState.InformationSourceStateBuilder issBuilder = DefaultInformationSourceState.builder();
+
+            Topology.TopologyBuilder topologyBuilder = DefaultTopology.builder();
+            topologyBuilder = topologyBuilder.clientIdRef(teLink.sourceTeLinkId().clientId())
+                                             .providerIdRef(teLink.sourceTeLinkId().providerId())
+                                             .teTopologyIdRef(teLink.sourceTeLinkId().topologyId());
+            issBuilder = issBuilder.topology(topologyBuilder.build());
+            yangStateBuilder.informationSourceState(issBuilder.build());
+        }
+
+        // Once stateDerived underlay is available in yang and 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 teSubsNetworkLink TE subsystem link object
+     * @return YANG link object
+     */
+    public static Link teSubsystem2YangLink(
+            org.onosproject.tetopology.management.api.link.NetworkLink teSubsNetworkLink) {
+        checkNotNull(teSubsNetworkLink, E_NULL_TELINK);
+
+        LinkId linkId = LinkId.fromString(teSubsNetworkLink.linkId().toString());
+        LinkBuilder builder = DefaultLink.builder().linkId(linkId);
+        if (teSubsNetworkLink.supportingLinkIds() != null) {
+            List<SupportingLink> slinks = Lists.newArrayList();
+            SupportingLinkBuilder spLinkBuilder = DefaultSupportingLink.builder();
+            for (NetworkLinkKey linkKey : teSubsNetworkLink.supportingLinkIds()) {
+                slinks.add(spLinkBuilder.networkRef(NetworkId.fromString(
+                                                    linkKey.networkId().toString()))
+                                        .linkRef(LinkId.fromString(
+                                                    linkKey.linkId().toString()))
+                                        .build());
+            }
+            builder = builder.supportingLink(slinks);
+        }
+        if (teSubsNetworkLink.source() != null) {
+            SourceBuilder sourceBuilder = DefaultSource
+                                              .builder()
+                                              .sourceNode(NodeId.fromString(
+                                                   teSubsNetworkLink.source().nodeId().toString()))
+                                              .sourceTp(TpId.fromString(
+                                                   teSubsNetworkLink.source().tpId().toString()));
+            builder = builder.source(sourceBuilder.build());
+        }
+        if (teSubsNetworkLink.destination() != null) {
+            DestinationBuilder destBuilder = DefaultDestination
+                                                 .builder()
+                                                 .destNode(NodeId.fromString(
+                                                      teSubsNetworkLink.destination().nodeId().toString()))
+                                                 .destTp(TpId.fromString(
+                                                      teSubsNetworkLink.destination().tpId().toString()));
+            builder = builder.destination(destBuilder.build());
+        }
+
+        if (teSubsNetworkLink.teLink() != null) {
+            TeLink teData = teSubsNetworkLink.teLink();
+            TeBuilder yangTeBuilder = DefaultTe.builder()
+                                               .config(teLink2YangConfig(teData))
+                                               .state(teLink2YangState(teData));
+            // ignoring supportingTeLinkId when converting from core to yang?
+            // if (teData.supportingTeLinkId() != null) {
+            // }
+            AugmentedNtLinkBuilder linkAugmentBuilder =
+                    DefaultAugmentedNtLink.builder()
+                                          .te(yangTeBuilder.build());
+            builder.addYangAugmentedInfo(linkAugmentBuilder.build(), AugmentedNtLink.class);
+        }
+
+        return builder.build();
+    }
+
+    private static UnderlayBuilder te2YangConfigUnderlayPrimaryPath(
+            UnderlayBuilder yangBuilder,
+            TeLink teLink) {
+
+        org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath tePath = teLink.primaryPath();
+
+        UnderlayPrimaryPathBuilder pathBuilder =
+                                       DefaultUnderlayPrimaryPath.builder();
+        if (tePath.pathElements() != null) {
+            for (PathElement pathElementTe : tePath.pathElements()) {
+                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+                .ietftetopology.telinkunderlayattributes.underlayprimarypath.PathElement
+                   .PathElementBuilder pathElementYangBuilder = DefaultPathElement.builder();
+
+                pathElementYangBuilder = pathElementYangBuilder.pathElementId(pathElementTe.pathElementId());
+                //TODO: add some Type cross converter
+//              pathElementYangBuilder = pathElementYangBuilder.type(Type pathElementTe.type())
+
+                pathBuilder = pathBuilder.addToPathElement(pathElementYangBuilder.build());
+            }
+        }
+
+        pathBuilder = pathBuilder.clientIdRef(teLink.underlayTeTopologyId().clientId())
+                                 .providerIdRef(teLink.underlayTeTopologyId().providerId())
+                                 .teTopologyIdRef(teLink.underlayTeTopologyId().topologyId());
+
+        // TODO: get networkRefId from service
+//        pathBuilder = pathBuilder.networkIdRef(networkIdRef);
+
+        return yangBuilder.underlayPrimaryPath(pathBuilder.build());
+    }
+
+    private static UnderlayBuilder te2YangConfigUnderlayBackupPaths(UnderlayBuilder yangBuilder,
+                                                                    TeLink teLink) {
+        List<UnderlayBackupPath> tePaths = teLink.backupPaths();
+
+        for (UnderlayBackupPath tePath : tePaths) {
+            UnderlayBackupPathBuilder pathBuilder = DefaultUnderlayBackupPath
+                    .builder();
+            pathBuilder = pathBuilder.index(tePath.index());
+            pathBuilder = pathBuilder.clientIdRef(teLink.underlayTeTopologyId().clientId())
+                                     .providerIdRef(teLink.underlayTeTopologyId().providerId())
+                                     .teTopologyIdRef(teLink.underlayTeTopologyId().topologyId());
+            // TODO: find networkIdRef from the service
+//            pathBuilder = pathBuilder.networkIdRef(networkIdRef);
+
+            for (PathElement backupPathElementTe : tePath.pathElements()) {
+                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+                .ietftetopology.telinkunderlayattributes.underlaybackuppath.PathElement
+                .PathElementBuilder elementBuilder =
+                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+                .ietftetopology.telinkunderlayattributes.underlaybackuppath.DefaultPathElement
+                        .builder();
+
+                elementBuilder = elementBuilder.pathElementId(backupPathElementTe.pathElementId());
+                // TODO: add some Type cross conversion
+//                elementBuilder.type(type);
+
+                pathBuilder = pathBuilder
+                        .addToPathElement(elementBuilder.build());
+            }
+            yangBuilder = yangBuilder
+                    .addToUnderlayBackupPath(pathBuilder.build());
+        }
+
+        return yangBuilder;
+    }
+
+    private static TeLink yang2TeLinkAttributes(TeLinkAttributes yangLinkAttr,
+                                                State opState, Link yangLink,
+                                                Network yangNetwork,
+                                                Networks yangNetworks) {
+        TeNodeId teNodeId = findTeNodeId(yangNetwork,
+                                         yangLink.source().sourceNode(),
+                                         yangLink.source().sourceTp());
+        long teNodeIdLong = Ip4Address.valueOf(teNodeId.dottedQuad().string()).toInt();
+
+        TeLinkTpKey teLinkKey = new TeLinkTpKey(teNodeIdLong,
+                                                findTeTpId(yangNetwork,
+                                                           yangLink.source().sourceNode(),
+                                                           yangLink.source().sourceTp()));
+
+        TeNodeId teNodeIdDest = findTeNodeId(yangNetwork,
+                                             yangLink.destination().destNode(),
+                                             yangLink.destination().destTp());
+        long teNodeIdDestLong = Ip4Address.valueOf(teNodeIdDest.dottedQuad().string()).toInt();
+
+        TeLinkTpKey peerTeLinkKey = new TeLinkTpKey(teNodeIdDestLong,
+                                                    findTeTpId(yangNetwork,
+                                                               yangLink.destination().destNode(),
+                                                               yangLink.destination().destTp()));
+
+        TeLinkTpGlobalKey supportTeLinkId = findSupportTeLinkId(yangNetworks, yangLink);
+
+        org.onosproject.tetopology.management.api.TeStatus opStatus = null;
+        if (opState != null && opState.operStatus() != null) {
+            opStatus = EnumConverter.yang2TeSubsystemOpStatus(opState.operStatus());
+        }
+
+
+        TeLink teLink = yangLinkAttr2TeLinkAttributes(yangLinkAttr, opStatus, teNodeIdLong, teNodeIdDestLong, teLinkKey,
+                                                      peerTeLinkKey, supportTeLinkId);
+
+        return teLink;
+    }
+
+    private static TeLink yangLinkAttr2TeLinkAttributes(TeLinkAttributes yangLinkAtrr,
+                                                        org.onosproject.tetopology.management.api.TeStatus opStatus,
+                                                        long teNodeIdLong,
+                                                        long teNodeIdDestLong,
+                                                        TeLinkTpKey teLinkKey,
+                                                        TeLinkTpKey peerTeLinkKey,
+                                                        TeLinkTpGlobalKey supportTeLinkId) {
+        org.onosproject.tetopology.management.api.TeStatus adminStatus = null;
+
+        TeLinkTpGlobalKey sourceTeLinkId = null; // from yang to core, we can ignore sourceTeLinkId
+        TeTopologyKey underlayTopologyId = null;
+        CommonLinkData teData = null;
+
+        underlayTopologyId = new TeTopologyKey((long) yangLinkAtrr.underlay().underlayPrimaryPath().providerIdRef(),
+                                               (long) yangLinkAtrr.underlay().underlayPrimaryPath().clientIdRef(),
+                                               (long) yangLinkAtrr.underlay().underlayPrimaryPath().teTopologyIdRef());
+
+        if (yangLinkAtrr.adminStatus() != null) {
+            adminStatus = EnumConverter.yang2TeSubsystemAdminStatus(yangLinkAtrr.adminStatus());
+        }
+
+        BitSet flags = new BitSet();
+        if (yangLinkAtrr.isAbstract()) {
+            flags.set(TeLink.BIT_ABSTRACT);
+        }
+
+        ExternalLink externalLink = new ExternalLink(null, yangLinkAtrr.externalDomain().plugId());
+
+        UnderlayPath underlayPath = null;
+        underlayPath = yang2TeSubsystemUnderlayPath(yangLinkAtrr, teNodeIdLong,
+                                                    teNodeIdDestLong);
+        Long adminGroup = Long.valueOf(yangLinkAtrr.administrativeGroup().toString());
+        List<Long> interLayerLocks = null; // FIXME: how to find interLayerLocks?
+
+        List<UnreservedBandwidth> listOfUnreservedBandwidth = yangLinkAtrr.unreservedBandwidth();
+        float[] availBandwidth = new float[listOfUnreservedBandwidth.size()];
+        int i = 0;
+        for (UnreservedBandwidth urbw : listOfUnreservedBandwidth) {
+            availBandwidth[i] = urbw.bandwidth().floatValue();
+            i++;
+        }
+
+        float[] maxBandwidth = new float[1];
+        maxBandwidth[0] = yangLinkAtrr.maxLinkBandwidth().floatValue();
+
+        float[] maxAvailLspBandwidth = null; // FIXME: how to find this?
+        float[] minAvailLspBandwidth = null; // FIXME: how to find this?
+        LinkBandwidth bandwidth = new LinkBandwidth(
+                maxBandwidth,
+                availBandwidth,
+                maxAvailLspBandwidth,
+                minAvailLspBandwidth,
+                null); // FIXME: how to find odu resource?
+        List<Long> srlgs = Lists.newArrayList();
+        for (Srlg srlg : yangLinkAtrr.teSrlgs().value()) {
+            srlgs.add(srlg.uint32());
+        }
+        TePathAttributes teAttributes =
+                new TePathAttributes(yangLinkAtrr.teDefaultMetric(),
+                                     yangLinkAtrr.performanceMetric().measurement().unidirectionalDelay(),
+                                     srlgs);
+        teData = new CommonLinkData(adminStatus,
+                                    opStatus,
+                                    flags,
+                                    null, // switchingLayer
+                                    null, // encodingLayer
+                                    externalLink,
+                                    underlayPath,
+                                    teAttributes,
+                                    adminGroup,
+                                    interLayerLocks,
+                                    bandwidth);
+
+        TeLink te = new DefaultTeLink(teLinkKey, peerTeLinkKey,
+                                      underlayTopologyId, supportTeLinkId,
+                                      sourceTeLinkId, teData);
+        return te;
+    }
+
+    private static TeLinkTpGlobalKey findSupportTeLinkId(Networks yangNetworks,
+                                            Link yangLink) {
+        Network teNetworkFound = null;
+        LinkId teLinkIdFound = null;
+        for (Network ynetItem : yangNetworks.network()) {
+            if (ynetItem.networkId().equals(yangLink.supportingLink().get(0).networkRef())) {
+                teNetworkFound = ynetItem;
+                teLinkIdFound = yangLink.supportingLink().get(0).linkRef();
+                break;
+            }
+        }
+        Link teLinkFound = null;
+        if (teNetworkFound.yangAugmentedInfo(AugmentedNdNetwork.class) != null) {
+            AugmentedNdNetwork augmentLink =
+                    (AugmentedNdNetwork) teNetworkFound.yangAugmentedInfo(AugmentedNdNetwork.class);
+            for (Link link : augmentLink.link()) {
+                if (link.linkId().equals(teLinkIdFound)) {
+                    teLinkFound = link;
+                    break;
+                }
+            }
+        }
+
+        TeNodeId teSupportNodeId = findTeNodeId(teNetworkFound,
+                                                teLinkFound.source().sourceNode(),
+                                                teLinkFound.source().sourceTp());
+        long tenIdLong = Ip4Address.valueOf(teSupportNodeId.dottedQuad().string()).toInt();
+        long teSupportLinkTpId = findTeTpId(teNetworkFound,
+                                            teLinkFound.source().sourceNode(),
+                                            teLinkFound.source().sourceTp());
+
+        org.onosproject.tetopology.management.api.TeTopologyId teTopologyId = null;
+        if (teNetworkFound.yangAugmentedInfo(AugmentedNwNetwork.class) != null) {
+            AugmentedNwNetwork augmentTeIds =
+                    (AugmentedNwNetwork) teNetworkFound.yangAugmentedInfo(AugmentedNwNetwork.class);
+            teTopologyId =
+                    new org.onosproject.tetopology.management.api.TeTopologyId(
+                            augmentTeIds.te().clientId().uint32(),
+                            augmentTeIds.te().providerId().uint32(),
+                            augmentTeIds.te().teTopologyId().string());
+        }
+
+        TeLinkTpGlobalKey supportTeLinkId = new TeLinkTpGlobalKey(teTopologyId.providerId(),
+                                                teTopologyId.clientId(),
+                                                Long.valueOf(teTopologyId
+                                                        .topologyId()),
+                                                tenIdLong, teSupportLinkTpId);
+
+        return supportTeLinkId;
+    }
+
+    private static TeNodeId findTeNodeId(Network yangNetwork, NodeId yangNodeId, TpId yangTpId) {
+        TeNodeId teNodeId = null;
+        for (Node node : yangNetwork.node()) {
+            if (node.nodeId().equals(yangNodeId)) {
+                if (node.yangAugmentedInfoMap() != null
+                        && !node.yangAugmentedInfoMap().isEmpty()) {
+                    AugmentedNwNode yangNodeAugment = (AugmentedNwNode) node
+                            .yangAugmentedInfo(AugmentedNwNode.class);
+                    if (yangNodeAugment != null && yangNodeAugment.te() != null
+                            && yangNodeAugment.te().teNodeId() != null) {
+                        Te yangNodeAugTe = yangNodeAugment.te();
+                        teNodeId = yangNodeAugTe.teNodeId();
+                    }
+                }
+            }
+        }
+        return teNodeId;
+    }
+
+    private static long findTeTpId(Network yangNetwork, NodeId yangNodeId, TpId yangTpId) {
+        long teTpId = 0;
+        for (Node node : yangNetwork.node()) {
+            if (node.nodeId().equals(yangNodeId)) {
+                if (node.yangAugmentedInfoMap() != null
+                        && !node.yangAugmentedInfoMap().isEmpty()) {
+
+                    AugmentedNdNode yangTpNodeAugment = (AugmentedNdNode) node
+                            .yangAugmentedInfo(AugmentedNdNode.class);
+                    if (yangTpNodeAugment.terminationPoint() != null) {
+                        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()) {
+                            if (yangTpnode.tpId().equals(yangTpId)) {
+                                if (yangTpnode.yangAugmentedInfoMap() != null
+                                        && !yangTpnode.yangAugmentedInfoMap()
+                                                .isEmpty()) {
+                                    AugmentedNtTerminationPoint yangTpAugment =
+                                            (AugmentedNtTerminationPoint) yangTpnode
+                                                    .yangAugmentedInfo(AugmentedNtTerminationPoint.class);
+                                    if (yangTpAugment.te() != null && yangTpAugment.te().teTpId() != null) {
+                                        teTpId = Long.valueOf(yangTpAugment.te().teTpId().toString());
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return teTpId;
+    }
     /**
      * Link object conversion from YANG to TE Topology subsystem.
      *
      * @param yangLink  YANG link
-     * @param networkId YANG networkId
+     * @param yangNetwork YANG network
+     * @param yangNetworks YANG networks
      * @return TE subsystem link
      */
     public static org.onosproject.tetopology.management.api.link.NetworkLink
-    yang2TeSubsystemLink(Link yangLink, NetworkId networkId) {
+            yang2TeSubsystemLink(Link yangLink, Network yangNetwork,
+                                 Networks yangNetworks) {
+        NetworkId networkId = yangNetwork.networkId();
+        checkNotNull(yangLink, E_NULL_YANG_TELINK);
 
-        //TODO: Implementation will be submitted as a separate review
+        KeyId linkId = KeyId.keyId(yangLink.linkId().uri().toString());
+        NodeTpKey sourceNodeTpKey = null;
+        NodeTpKey destinationNodeTpKey = null;
+        List<NetworkLinkKey> spLinkIds = null;
+        TeLink te = null;
 
-        return null;
+        if (yangLink.supportingLink() != null) {
+            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);
+            }
+        }
+
+        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()));
+            sourceNodeTpKey = new NodeTpKey(source.nodeId(), source.tpId());
+        }
+
+        if (yangLink.destination() != null) {
+            TerminationPointKey destination = new TerminationPointKey(
+                                                      KeyId.keyId(networkId.uri().toString()),
+                                                      KeyId.keyId(yangLink.destination().destNode().uri().toString()),
+                                                      KeyId.keyId(yangLink.destination().destTp().uri().toString()));
+            destinationNodeTpKey = new NodeTpKey(destination.nodeId(), destination.tpId());
+        }
+
+        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) {
+                    te = yang2TeLinkAttributes(yangLinkAtrr,
+                                               yangLinkAugment.te().state(),
+                                               yangLink, yangNetwork,
+                                               yangNetworks);
+                }
+            }
+        }
+
+        org.onosproject.tetopology.management.api.link.DefaultNetworkLink link =
+                new DefaultNetworkLink(linkId,
+                                       sourceNodeTpKey,
+                                       destinationNodeTpKey,
+                                       spLinkIds,
+                                       te);
+        return link;
     }
 
-    public static Link teSubsystem2YangLink(NetworkLink link) {
+    private static org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath
+                    yang2TeSubsystemUnderlayPrimaryPath(UnderlayPrimaryPath yangpath,
+                                                        long teNodeId) {
+        org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath teUnderlayPrimaryPath = null;
 
-        //TODO: Implementation will be submitted as a separate review
+        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()) {
 
-        return null;
+            // TODO: find the proper type (ElementType) from pathElementConfigYang.type()
+            PathElement tePathElement = new PathElement(pathElementConfigYang.pathElementId(),
+                                                        teNodeId,
+                                                        null,
+                                                        false); // FIXME: how to find the proper value for loose?
+            pathElementList.add(tePathElement);
+        }
+
+        teUnderlayPrimaryPath = new org.onosproject.tetopology.management.api.link.
+                UnderlayPrimaryPath(pathElementList, false); // FIXME: how to find the proper value for loose?
+
+        return teUnderlayPrimaryPath;
+    }
+
+    private static List<UnderlayBackupPath>
+       yang2TeSubsystemUnderlayBackupPaths(
+                List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
+                    rev20160708.ietftetopology.telinkunderlayattributes.
+                    UnderlayBackupPath> yangpaths,
+                long teNodeId) {
+
+        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 = null;
+            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(),
+                                                                  teNodeId,
+                                                                  null, // FIXME: find the proper ElementType
+                                                                        // from pathElementBackupYang.type()
+                                                                  false); // FIXME: find the proper value for loose
+                backupPathElementList.add(tePathElementBackup);
+            }
+            ubp = new UnderlayBackupPath(yangConfig.index(),
+                                         backupPathElementList,
+                                         null); // FIXME: find the proper value for loose
+            underlayBackupPathsList.add(ubp);
+        }
+
+        return underlayBackupPathsList;
+    }
+
+    /**
+    * TE Link underlay path Config object conversion from YANG to TE Topology subsystem.
+    *
+    * @param yangLinkAtrr YANG link Config YANG object
+    * @return teSubsystem TE underlay path object
+    */
+    private static org.onosproject.tetopology.management.api.link.UnderlayPath
+               yang2TeSubsystemUnderlayPath(TeLinkAttributes yangLinkAtrr, long srcTeNodeId, long dstTeNodeId) {
+
+        checkNotNull(yangLinkAtrr, E_NULL_YANG_TELINK_CONFIG);
+
+        org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath underlayPrimaryPath = null;
+        List<UnderlayBackupPath> underlayBackupPathsList = null;
+        TeTunnelId teTunnelId = new TeTunnelId(srcTeNodeId, dstTeNodeId, 0); // FIXME: how to find teTunnelId?
+
+        if (yangLinkAtrr.underlay().underlayPrimaryPath() != null) {
+            underlayPrimaryPath =
+                    yang2TeSubsystemUnderlayPrimaryPath(yangLinkAtrr.underlay().underlayPrimaryPath(), srcTeNodeId);
+        }
+
+        if (yangLinkAtrr.underlay().underlayBackupPath() != null) {
+            underlayBackupPathsList =
+                    yang2TeSubsystemUnderlayBackupPaths(yangLinkAtrr.underlay().underlayBackupPath(), srcTeNodeId);
+        }
+
+        org.onosproject.tetopology.management.api.link.UnderlayPath teUnderlay =
+                    new org.onosproject.tetopology.management.api.link.
+                    UnderlayPath(underlayPrimaryPath,
+                                 underlayBackupPathsList,
+                                 TunnelProtectionType.of(yangLinkAtrr.underlay().underlayProtectionType()),
+                                 (long) yangLinkAtrr.underlay().underlayTrailSrc().tpRef(), // Is this correct?
+                                 (long) yangLinkAtrr.underlay().underlayTrailDes().tpRef(), // Is this correct?
+                                 teTunnelId);
+
+        return teUnderlay;
+    }
+
+    /**
+     * Converts a TE Topology link event from the data format used in
+     * the core to its corresponding YANG Object (YO) format.
+     *
+     * @param eventType Link event type
+     * @param linkData  TE Topology link event data
+     * @return YANG Object converted from linkData
+     */
+    public static TeLinkEvent teNetworkLink2yangTeLinkEvent(TeTopologyEventTypeEnum eventType,
+                                                            NetworkLink linkData) {
+        TeLinkEvent.TeLinkEventBuilder builder = new DefaultTeLinkEvent.TeLinkEventBuilder();
+
+        TeTopologyEventType yangEventType = new TeTopologyEventType(eventType);
+        builder.eventType(yangEventType);
+        LinkId linkId = LinkId.fromString(linkData.linkId().toString());
+        builder.linkRef(linkId);
+
+        TeLinkAttributes teLinkAttributes = teLink2YangConfig(linkData.teLink()).teLinkAttributes();
+        builder.teLinkAttributes(teLinkAttributes);
+
+        return builder.build();
     }
 
     public static NetworkLinkKey yangLinkEvent2NetworkLinkKey(TeLinkEvent yangLinkEvent) {
-
         //TODO: Implementation will be submitted as a separate review
+        NetworkId networkRef = (NetworkId) (yangLinkEvent.networkRef());
+        LinkId linkRef = (LinkId) (yangLinkEvent.linkRef());
+        KeyId networkId = KeyId.keyId(networkRef.uri().toString());
+        KeyId linkId = KeyId.keyId(linkRef.uri().toString());
 
-        return null;
+        NetworkLinkKey networkLinkKey = new NetworkLinkKey(networkId, linkId);
+
+        return networkLinkKey;
     }
 
     public static NetworkLink yangLinkEvent2NetworkLink(TeLinkEvent yangLinkEvent,
                                                         TeTopologyService teTopologyService) {
 
-        //TODO: Implementation will be submitted as a separate review
+        KeyId linkId = yangLinkEvent2NetworkLinkKey(yangLinkEvent).linkId();
 
-        return null;
+        org.onosproject.tetopology.management.api.
+                Network network = teTopologyService.network(
+                yangLinkEvent2NetworkLinkKey(yangLinkEvent).networkId());
+        if (network == null) {
+            return null;
+        }
+
+        NetworkLink networkLink = network.link(linkId);
+        if (networkLink == null) {
+            return null;
+        }
+
+        NodeTpKey sourceTp = networkLink.source();
+        NodeTpKey destTp = networkLink.destination();
+
+        List<NetworkLinkKey> supportingLinkIds = networkLink.supportingLinkIds();
+        TeLink teLink = networkLink.teLink();
+        if (teLink == null) {
+            return null;
+        }
+
+        TeOperStatus opState = yangLinkEvent.operStatus();
+        org.onosproject.tetopology.management.api.
+        TeStatus opStatus = EnumConverter.yang2TeSubsystemOpStatus(opState);
+
+        TeLink updatedTeLink = yangLinkEvent2TeLinkAttributes(yangLinkEvent, teLink, opStatus);
+
+
+        NetworkLink updatedNetworkLink = new DefaultNetworkLink(linkId, sourceTp, destTp, supportingLinkIds,
+                                                                updatedTeLink);
+
+        return updatedNetworkLink;
+    }
+
+    private static TeLink yangLinkEvent2TeLinkAttributes(TeLinkEvent yangLinkEvent, TeLink oldTeLink, TeStatus
+            opStatus) {
+
+        TeLinkAttributes yangTeLinkAttrs = yangLinkEvent.teLinkAttributes();
+
+        TeLinkTpKey teLinkKey = oldTeLink.teLinkKey();
+
+
+        long teNodeIdDest = oldTeLink.peerTeLinkKey().teNodeId();
+        long teNodeId = oldTeLink.teLinkKey().teNodeId();
+        TeLinkTpGlobalKey supportTeLinkId = oldTeLink.supportingTeLinkId();
+        TeLinkTpKey peerTeLinkKey = oldTeLink.peerTeLinkKey();
+
+        TeLink updatedTeLink = yangLinkAttr2TeLinkAttributes(yangTeLinkAttrs, opStatus, teNodeId, teNodeIdDest,
+                                                             teLinkKey, peerTeLinkKey, supportTeLinkId);
+
+        return updatedTeLink;
     }
 }
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 2205778..f87b0b1 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
@@ -57,6 +57,9 @@
         .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.IetfTeTopologyEventSubject;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.TeLinkEvent;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.TeNodeEvent;
 import org.onosproject.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
@@ -75,6 +78,7 @@
         .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.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.tetopologyeventtype.TeTopologyEventTypeEnum;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -228,10 +232,10 @@
             org.onosproject.tetopology.management.api.Network teNetwork;
             if (stateNetwork == null) {
                 log.info("networkId {} can't be found in yangNetworkStates",
-                         network.networkId());
-                teNetwork = yang2TeSubsystemNetwork(network);
+                          network.networkId());
+                teNetwork = yang2TeSubsystemNetwork(network, yangNetworks);
             } else {
-                teNetwork = yang2TeSubsystemNetwork(network, stateNetwork);
+                teNetwork = yang2TeSubsystemNetwork(network, stateNetwork, yangNetworks);
             }
             networks.add(teNetwork);
         }
@@ -388,15 +392,17 @@
     /**
      * Network conversion from YANG to TE Topology subsystem.
      *
-     * @param yangNetwork      Network YANG object
+     * @param yangNetwork Network YANG object
      * @param yangNetworkState NetworkState YANG object
+     * @param yangNetworks Networks YANG object
      * @return TE Topology subsystem defaultNetwork object
      */
     private static org.onosproject.tetopology.management.api.DefaultNetwork yang2TeDefaultNetwork(
-            Network yangNetwork,
-            org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.
-                    yang.ietf.network.rev20151208.ietfnetwork.networksstate.
-                    Network yangNetworkState) {
+                                                Network yangNetwork,
+                                                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.
+                                                yang.ietf.network.rev20151208.ietfnetwork.networksstate.
+                                                Network yangNetworkState,
+                                                Networks yangNetworks) {
         checkNotNull(yangNetwork, E_NULL_YANG_NETWORK);
         checkNotNull(yangNetwork.networkId(), E_NULL_YANG_NETWORKID);
         String networkId = yangNetwork.networkId().uri().string();
@@ -424,7 +430,7 @@
             for (Node node : yangNetwork.node()) {
                 // Convert the Yang Node to a TE node.
                 teNodes.put(KeyId.keyId(node.nodeId().uri().string()),
-                            NodeConverter.yang2TeSubsystemNode(node, yangNetwork.networkId()));
+                            NodeConverter.yang2TeSubsystemNode(node, yangNetwork));
             }
         }
 
@@ -436,7 +442,7 @@
             for (Link link : augmentLink.link()) {
                 // Convert the Yang Link to a TE link.
                 teLinks.put(KeyId.keyId(link.linkId().uri().string()),
-                            LinkConverter.yang2TeSubsystemLink(link, yangNetwork.networkId()));
+                            LinkConverter.yang2TeSubsystemLink(link, yangNetwork, yangNetworks));
             }
         }
 
@@ -466,35 +472,30 @@
      * Network object conversion from YANG to TE Topology subsystem.
      *
      * @param yangNetwork Network YANG object
+     * @param yangNetworks Networks YANG object
      * @return network TE Topology subsystem networks object
      */
-    public static org.onosproject.tetopology.management.api.Network yang2TeSubsystemNetwork(Network yangNetwork) {
-        return yang2TeDefaultNetwork(yangNetwork, null);
+    public static org.onosproject.tetopology.management.api.Network yang2TeSubsystemNetwork(Network yangNetwork,
+                                                                                            Networks yangNetworks) {
+        return yang2TeDefaultNetwork(yangNetwork, null, yangNetworks);
     }
 
     /**
      * 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
+     * @param yangNetworks Networks 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) {
+    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, Networks yangNetworks) {
         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);
+                yang2TeDefaultNetwork(yangNetwork, yangNetworkState, yangNetworks);
 
         String networkref = yangNetworkState.networkRef().toString();
         checkState(teNetwork.networkId().toString().equals(networkref),
@@ -511,8 +512,69 @@
      * @return YANG Object converted from event
      */
     public static IetfTeTopologyEvent teTopoEvent2YangIetfTeTopoEvent(TeTopologyEvent event) {
-        // TODO: implementation will be submitted as a seperate review.
-        return null;
+        IetfTeTopologyEvent yangEvent = null;
+        IetfTeTopologyEventSubject eventSubject = new IetfTeTopologyEventSubject();
+
+        IetfTeTopologyEvent.Type yangEventType = teTopoEventType2YangIetfTopoEventType(event.type());
+        if (yangEventType == IetfTeTopologyEvent.Type.TE_LINK_EVENT) {
+            NetworkLink eventData = (NetworkLink) event.subject();
+            TeTopologyEventTypeEnum linkEventType = teTopoEventType2YangTeTopoEventType(event.type());
+            TeLinkEvent yangLinkEvent = LinkConverter.teNetworkLink2yangTeLinkEvent(linkEventType, eventData);
+            eventSubject.teLinkEvent(yangLinkEvent);
+            yangEvent = new IetfTeTopologyEvent(IetfTeTopologyEvent.Type.TE_LINK_EVENT, eventSubject);
+        } else if (yangEventType == IetfTeTopologyEvent.Type.TE_NODE_EVENT) {
+            NetworkNode eventData = (NetworkNode) event.subject();
+            TeTopologyEventTypeEnum nodeEventType = teTopoEventType2YangTeTopoEventType(event.type());
+            TeNodeEvent yangNodeEvent = NodeConverter.teNetworkNode2yangTeNodeEvent(nodeEventType, eventData);
+            eventSubject.teNodeEvent(yangNodeEvent);
+            yangEvent = new IetfTeTopologyEvent(IetfTeTopologyEvent.Type.TE_NODE_EVENT, eventSubject);
+        }
+
+        return yangEvent;
+    }
+
+    private static IetfTeTopologyEvent.Type teTopoEventType2YangIetfTopoEventType(TeTopologyEvent.Type type) {
+        IetfTeTopologyEvent.Type returnType = null;
+
+        switch (type) {
+            case LINK_ADDED:
+            case LINK_REMOVED:
+            case LINK_UPDATED:
+                returnType = IetfTeTopologyEvent.Type.TE_LINK_EVENT;
+                break;
+            case NODE_ADDED:
+            case NODE_REMOVED:
+            case NODE_UPDATED:
+                returnType = IetfTeTopologyEvent.Type.TE_NODE_EVENT;
+                break;
+            default:
+                log.error("teTopoEventType2YangIetfTopoEventType: unknown type: {}", type);
+        }
+
+        return returnType;
+    }
+
+    private static TeTopologyEventTypeEnum teTopoEventType2YangTeTopoEventType(TeTopologyEvent.Type type) {
+        TeTopologyEventTypeEnum returnType = null;
+
+        switch (type) {
+            case LINK_ADDED:
+            case NODE_ADDED:
+                returnType = TeTopologyEventTypeEnum.ADD;
+                break;
+            case LINK_REMOVED:
+            case NODE_REMOVED:
+                returnType = TeTopologyEventTypeEnum.REMOVE;
+                break;
+            case LINK_UPDATED:
+            case NODE_UPDATED:
+                returnType = TeTopologyEventTypeEnum.UPDATE;
+                break;
+            default:
+                log.error("teTopoEventType2YangTeTopoEventType: unknown type: {}", type);
+        }
+
+        return returnType;
     }
 }
 
diff --git a/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NodeConverter.java b/apps/tenbi/utils/src/main/java/org/onosproject/teyang/utils/topology/NodeConverter.java
index b0daeee..c231060 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,13 +15,95 @@
  */
 package org.onosproject.teyang.utils.topology;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.nio.ByteBuffer;
+import java.util.BitSet;
+import java.util.List;
+import java.util.Map;
+
+import org.onlab.packet.Ip4Address;
+import org.onosproject.tetopology.management.api.EncodingType;
+import org.onosproject.tetopology.management.api.KeyId;
+import org.onosproject.tetopology.management.api.SwitchingType;
+import org.onosproject.tetopology.management.api.TeStatus;
+import org.onosproject.tetopology.management.api.TeTopologyKey;
 import org.onosproject.tetopology.management.api.TeTopologyService;
+import org.onosproject.tetopology.management.api.link.ElementType;
+import org.onosproject.tetopology.management.api.link.NetworkLink;
+import org.onosproject.tetopology.management.api.link.TeLinkId;
+import org.onosproject.tetopology.management.api.link.TePathAttributes;
+import org.onosproject.tetopology.management.api.link.UnderlayAbstractPath;
+import org.onosproject.tetopology.management.api.node.CommonNodeData;
+import org.onosproject.tetopology.management.api.node.ConnectivityMatrix;
+import org.onosproject.tetopology.management.api.node.ConnectivityMatrixKey;
+import org.onosproject.tetopology.management.api.node.DefaultNetworkNode;
+import org.onosproject.tetopology.management.api.node.DefaultTeNode;
+import org.onosproject.tetopology.management.api.node.LocalLinkConnectivity;
 import org.onosproject.tetopology.management.api.node.NetworkNode;
 import org.onosproject.tetopology.management.api.node.NetworkNodeKey;
+import org.onosproject.tetopology.management.api.node.TeNode;
+import org.onosproject.tetopology.management.api.node.TeNodeKey;
+import org.onosproject.tetopology.management.api.node.TerminationPoint;
+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.networks.network
-        .Node;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NodeId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.Network;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
+               .ietfnetwork.networks.network.DefaultNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
+               .ietfnetwork.networks.network.Node;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
+               .ietfnetwork.networks.network.node.DefaultSupportingNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208
+               .ietfnetwork.networks.network.node.SupportingNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology.TpId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology.networks.network.AugmentedNdNetwork;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology.networks.network.augmentedndnetwork.Link;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.node.AugmentedNdNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.node.DefaultAugmentedNdNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.DefaultTeNodeEvent;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.TeNodeEvent;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.DefaultInformationSourceState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.InformationSourceState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.DefaultInformationSourceState.InformationSourceStateBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.informationsourcestate.DefaultTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.informationsourceattributes.informationsourcestate.Topology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+               .ietftetopology.networks.network.node.AugmentedNwNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+               .ietftetopology.networks.network.node.DefaultAugmentedNwNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.DefaultTe;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.DefaultTe.TeBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.Te;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.Config;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.DefaultConfig;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.DefaultState;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.DefaultTunnelTerminationPoint;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.State;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.te.TunnelTerminationPoint;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconfigattributes.DefaultTeNodeAttributes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconfigattributes.TeNodeAttributes;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconfigattributes.TeNodeAttributes.TeNodeAttributesBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.DefaultConnectivityMatrix;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.DefaultConnectivityMatrix.ConnectivityMatrixBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.connectivitymatrix.DefaultFrom;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.connectivitymatrix.DefaultTo;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeinfoattributes.DefaultUnderlayTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeinfoattributes.UnderlayTopology;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodetunnelterminationcapability.DefaultTerminationCapability;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodetunnelterminationcapability.TerminationCapability;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.Srlg;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeAdminStatus;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeNodeId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyEventType;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.tetopologyeventtype.TeTopologyEventTypeEnum;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 
 /**
  * Node conversion functions.
@@ -41,6 +123,217 @@
     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();
+        teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
+                .isAbstract(teSubsystemTeNode.flags()
+                        .get(TeNode.BIT_ABSTRACT));
+
+        if (teSubsystemTeNode.adminStatus() != null) {
+            teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
+                    .adminStatus(EnumConverter.teSubsystem2YangAdminStatus(teSubsystemTeNode.adminStatus()));
+        }
+
+        if (teSubsystemTeNode.name() != null) {
+            teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
+                    .name(DomainName.fromString(teSubsystemTeNode.name()));
+        }
+
+        if (teSubsystemTeNode.underlayTeTopologyId() != null) {
+            teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
+                    .underlayTopology(teNode2YangUnderlay(teSubsystemTeNode
+                            .underlayTeTopologyId()));
+        }
+
+        // TODO: should we ignore this from te to yang? as we've already set yang supportingNode
+        if (teSubsystemTeNode.supportingTeNodeId() != null) {
+        }
+
+        if (teSubsystemTeNode.connectivityMatrices() != null) {
+            teNodeAttributesConfigBuilder = te2YangConnectivityMatrix(teNodeAttributesConfigBuilder,
+                                                                      teSubsystemTeNode.connectivityMatrices());
+        }
+
+
+        Config.ConfigBuilder yangConfigBuilder = DefaultConfig.builder();
+        yangConfigBuilder = yangConfigBuilder.teNodeAttributes(teNodeAttributesConfigBuilder.build());
+
+        return yangConfigBuilder.build();
+    }
+
+    private static TeNodeAttributesBuilder
+                    te2YangConnectivityMatrix(TeNodeAttributesBuilder teNodeAttributesConfigBuilder,
+                                              Map<Long, ConnectivityMatrix> connectivityMatrices) {
+        ConnectivityMatrixBuilder connectivityMatrixConfigBuilder = DefaultConnectivityMatrix.builder();
+        for (Map.Entry<Long, ConnectivityMatrix> teCmEntry :
+            connectivityMatrices.entrySet()) {
+            connectivityMatrixConfigBuilder = connectivityMatrixConfigBuilder
+                    .id(teCmEntry.getKey())
+                    .isAllowed(!teCmEntry.getValue().flags()
+                               .get(ConnectivityMatrix.BIT_DISALLOWED))
+                    .from(new DefaultFrom.FromBuilder() // TODO: for now, assuming that there is
+                                                        // only one 'from', and mergingList is empty
+                          .tpRef(teCmEntry.getValue().from())
+                                         .build())
+                    .to(new DefaultTo.ToBuilder() // TODO: for now, assuming that there is only
+                                                  // one item in constrainingElements list
+                          .tpRef(teCmEntry.getValue().constrainingElements().get(0))
+                                         .build());
+            teNodeAttributesConfigBuilder = teNodeAttributesConfigBuilder
+                    .addToConnectivityMatrix(connectivityMatrixConfigBuilder
+                            .build());
+        }
+        return teNodeAttributesConfigBuilder;
+    }
+
+    private static UnderlayTopology teNode2YangUnderlay(TeTopologyKey underlayTopology) {
+        UnderlayTopology.UnderlayTopologyBuilder underlayBuilder = DefaultUnderlayTopology
+                .builder()
+                .teTopologyIdRef(TeTopologyId
+                        .fromString(String.valueOf(underlayTopology.topologyId())))
+                .clientIdRef(underlayTopology.clientId())
+                .providerIdRef(underlayTopology.providerId());
+        // TODO: find networkId from the service
+//                .networkIdRef(networkIdRef)
+        return underlayBuilder.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.flags()
+                                                .get(TeNode.BIT_ABSTRACT));
+
+        if (teSubsystemTeNode.adminStatus() != null) {
+            teNodeAttributesStateBuilder = teNodeAttributesStateBuilder
+                    .adminStatus(EnumConverter.teSubsystem2YangAdminStatus(teSubsystemTeNode.adminStatus()));
+        }
+
+        if (teSubsystemTeNode.name() != null) {
+            teNodeAttributesStateBuilder = teNodeAttributesStateBuilder
+                    .name(DomainName.fromString(teSubsystemTeNode.name()));
+        }
+
+        if (teSubsystemTeNode.underlayTeTopologyId() != null) {
+            teNodeAttributesStateBuilder = teNodeAttributesStateBuilder
+                    .underlayTopology(teNode2YangUnderlay(teSubsystemTeNode
+                            .underlayTeTopologyId()));
+        }
+
+        if (teSubsystemTeNode.connectivityMatrices() != null) {
+            teNodeAttributesStateBuilder = te2YangConnectivityMatrix(teNodeAttributesStateBuilder,
+                                                                      teSubsystemTeNode.connectivityMatrices());
+        }
+
+        // TODO: should we ignore this from te to yang? as we've already set yang supportingNode
+        if (teSubsystemTeNode.supportingTeNodeId() != null) {
+        }
+
+        State.StateBuilder yangStateBuilder = DefaultState.builder();
+        yangStateBuilder = yangStateBuilder.teNodeAttributes(teNodeAttributesStateBuilder.build());
+
+        if (teSubsystemTeNode.opStatus() != null) {
+            yangStateBuilder = yangStateBuilder.operStatus(EnumConverter
+                                                           .teSubsystem2YangOperStatus(teSubsystemTeNode.opStatus()));
+        }
+
+        if (teSubsystemTeNode.sourceTeNodeId() != null) {
+            InformationSourceState.InformationSourceStateBuilder issBuilder = DefaultInformationSourceState.builder();
+
+            Topology.TopologyBuilder topologyBuilder = DefaultTopology.builder();
+            topologyBuilder =
+                    topologyBuilder.clientIdRef(teSubsystemTeNode.sourceTeNodeId().clientId())
+                                   .providerIdRef(teSubsystemTeNode.sourceTeNodeId().providerId())
+                                   // is this correct? Why not sourceTeNodeId().teTopologyKey()?
+                                   .teTopologyIdRef(teSubsystemTeNode
+                                                    .sourceTeNodeId().topologyId());
+            issBuilder = issBuilder.topology(topologyBuilder.build());
+            yangStateBuilder.informationSourceState(issBuilder.build());
+        }
+
+        return yangStateBuilder.build();
+    }
+
+    private static class ByteUtils {
+        private static ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
+
+        public static byte[] longToBytes(long x) {
+            buffer.putLong(0, x);
+            return buffer.array();
+        }
+
+        public static long bytesToLong(byte[] bytes) {
+            buffer.put(bytes, 0, bytes.length);
+            buffer.flip(); // need flip
+            return buffer.getLong();
+        }
+    }
+
+    /**
+     * 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, Long teTpId) {
+        checkNotNull(teTunnelTp, E_NULL_TE_SUBSYSTEM_TE_TUNNEL_TP);
+
+        TunnelTerminationPoint.TunnelTerminationPointBuilder tunnelTpBuilder =
+                DefaultTunnelTerminationPoint.builder().tunnelTpId(ByteUtils.longToBytes(teTpId.longValue()));
+
+        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+            .ietftetopology.tenodeaugment.te.tunnelterminationpoint.Config.ConfigBuilder ttpConfigBuilder =
+        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();
+
+        // Assuming teTunnelTp only has one interLayerLock
+        if (teTunnelTp.interLayerLockList() != null && !teTunnelTp.interLayerLockList().isEmpty()) {
+            ttpConfigBuilder = ttpConfigBuilder.interLayerLockId(teTunnelTp.interLayerLockList().get(0));
+            ttpStateBuilder  = ttpStateBuilder.interLayerLockId(teTunnelTp.interLayerLockList().get(0));
+        }
+
+        TerminationCapability.TerminationCapabilityBuilder
+                            tcapConfigBuilder = DefaultTerminationCapability.builder();
+        // TODO: retrieve more attributes from teTunnelTp and assign to tcapConfigBuilder.
+        // For which ones we can do the conversion?
+        // FIXME: once new yang model is used, we can make llc from teTunnelTp.localLinkConnectivityList()
+        ttpConfigBuilder = ttpConfigBuilder.addToTerminationCapability(tcapConfigBuilder.build());
+
+        TerminationCapability.TerminationCapabilityBuilder tcapStateBuilder =
+                DefaultTerminationCapability.builder();
+        // TODO: retrieve more attributes from teTunnelTp and assign to tcapStateBuilder
+        // For which ones we can do the conversion?
+        ttpStateBuilder = ttpStateBuilder.addToTerminationCapability(tcapStateBuilder.build());
+
+        tunnelTpBuilder = tunnelTpBuilder.config(ttpConfigBuilder.build())
+                                         .state(ttpStateBuilder.build());
+
+        return tunnelTpBuilder.build();
+    }
 
     /**
      * Node object conversion from TE Topology subsystem to YANG.
@@ -49,37 +342,546 @@
      * @return YANG node
      */
     public static Node teSubsystem2YangNode(org.onosproject.tetopology.management.api.node.NetworkNode teSubsystem) {
-        //TODO: implementation to be submitted as a separate review
-        return null;
+        checkNotNull(teSubsystem, E_NULL_TE_SUBSYSTEM_NODE);
+
+        NodeId nodeId = NodeId.fromString(teSubsystem.nodeId().toString());
+        Node.NodeBuilder builder = DefaultNode.builder().nodeId(nodeId);
+
+        if (teSubsystem.supportingNodeIds() != null) {
+            List<SupportingNode> sNodes = Lists.newArrayList();
+            SupportingNode.SupportingNodeBuilder spNodeBuilder = DefaultSupportingNode
+                    .builder();
+            for (NetworkNodeKey nodeKey : teSubsystem.supportingNodeIds()) {
+                sNodes.add(spNodeBuilder
+                        .networkRef(NetworkId
+                                .fromString(nodeKey.networkId().toString()))
+                        .nodeRef(NodeId.fromString(nodeKey.nodeId().toString()))
+                        .build());
+            }
+            builder = builder.supportingNode(sNodes);
+        }
+
+        if (teSubsystem.terminationPoints() != null) {
+            AugmentedNdNode.AugmentedNdNodeBuilder tpAugmentBuilder = DefaultAugmentedNdNode
+                    .builder();
+            Map<KeyId, TerminationPoint> teSubsystemTeTp = teSubsystem
+                    .terminationPoints();
+
+            for (TerminationPoint teTp : teSubsystemTeTp.values()) {
+                tpAugmentBuilder.addToTerminationPoint(TerminationPointConverter
+                        .teSubsystem2YangTerminationPoint(teTp));
+            }
+            builder.addYangAugmentedInfo(tpAugmentBuilder.build(),
+                                         AugmentedNdNode.class);
+        }
+
+        if (teSubsystem.teNode() != null) {
+            AugmentedNwNode.AugmentedNwNodeBuilder nodeAugmentBuilder = DefaultAugmentedNwNode
+                    .builder();
+
+            TeNode teSubsystemTeNode = teSubsystem.teNode();
+
+            TeBuilder yangTeBuilder = DefaultTe.builder();
+
+            yangTeBuilder = yangTeBuilder.teNodeId(TeNodeId
+                    .fromString(String.valueOf(teSubsystemTeNode.teNodeId())));
+
+            // Set configuration data
+            // Set state data
+            yangTeBuilder = yangTeBuilder.config(teNode2YangConfig(teSubsystemTeNode))
+                                         .state(teNode2YangState(teSubsystemTeNode));
+
+            if (teSubsystemTeNode.tunnelTerminationPoints() != null) {
+                for (Map.Entry<Long, org.onosproject.tetopology.management.api.node.TunnelTerminationPoint> entry :
+                        teSubsystemTeNode.tunnelTerminationPoints().entrySet()) {
+                    yangTeBuilder = yangTeBuilder
+                            .addToTunnelTerminationPoint(teSubsystem2YangTtp(entry
+                                    .getValue(), entry.getKey()));
+                }
+            }
+
+            nodeAugmentBuilder = nodeAugmentBuilder.te(yangTeBuilder.build());
+            builder.addYangAugmentedInfo(nodeAugmentBuilder.build(),
+                                         AugmentedNwNode.class);
+        }
+        return builder.build();
     }
 
     /**
      * Node object conversion from YANG to TE Topology subsystem.
      *
-     * @param yangNode      Network node in YANG model
-     * @param yangNetworkId YANG network identifier in YANG model
+     * @param yangNode Node in YANG model
+     * @param yangNetwork YANG network
+     * @param yangNetwork Network node in YANG model
      * @return TE subsystem node
      */
     public static org.onosproject.tetopology.management.api.node.NetworkNode
-    yang2TeSubsystemNode(Node yangNode, NetworkId yangNetworkId) {
+                    yang2TeSubsystemNode(Node yangNode, Network yangNetwork) {
+        checkNotNull(yangNode, E_NULL_YANG_NODE);
 
-        //TODO: implementation to be submitted as separate review
+        org.onosproject.tetopology.management.api.node.DefaultNetworkNode node;
+        List<NetworkNodeKey> spNodes = null;
+        TeNode teNode = null;
+        Map<KeyId, TerminationPoint> tps = null;
 
+        if (yangNode.supportingNode() != null) {
+            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);
+            }
+        }
+
+        if (yangNode.yangAugmentedInfoMap() != null
+                && !yangNode.yangAugmentedInfoMap().isEmpty()) {
+
+            AugmentedNdNode yangTpNodeAugment = (AugmentedNdNode) yangNode
+                    .yangAugmentedInfo(AugmentedNdNode.class);
+            if (yang2TeSubsystemTpNodeAugment(yangTpNodeAugment) != null) {
+                tps = yang2TeSubsystemTpNodeAugment(yangTpNodeAugment);
+            }
+
+            AugmentedNwNode yangNodeAugment = (AugmentedNwNode) yangNode
+                    .yangAugmentedInfo(AugmentedNwNode.class);
+            if (yangNodeAugment != null && yangNodeAugment.te() != null && yangNodeAugment.te().teNodeId() != null) {
+                Te yangNodeAugTe = yangNodeAugment.te();
+                teNode = yang2TeSubsystemNodeAugment(yangNodeAugTe,
+                                                     yangNetwork,
+                                                     yangNode,
+                                                     tps);
+            }
+        }
+
+        node = new org.onosproject.tetopology.management.api.node
+                .DefaultNetworkNode(KeyId.keyId(yangNode.nodeId().uri().string()), spNodes, teNode, tps);
+        return node;
+    }
+
+    // TODO: convert connectivity matrix from yang to te
+    private static Map<Long, ConnectivityMatrix>
+                    yang2TeSubsystemNodeConnectivityMatrix(String networkId,
+                                                           String nodeId,
+                                                           List<org.onosproject.yang.gen.v1.urn.ietf
+                                                           .params.xml.ns.yang.ietf.te.topology.rev20160708
+                                                           .ietftetopology.tenodeconnectivitymatrix.
+                                                           ConnectivityMatrix> yangMatrix) {
+
+        Map<Long, ConnectivityMatrix> teCmList = Maps.newHashMap();
+
+
+        for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te
+                .topology.rev20160708.ietftetopology.tenodeconnectivitymatrix.
+                ConnectivityMatrix cmYang : yangMatrix) {
+
+            ElementType from = new TeLinkId((long) cmYang.from().tpRef()); // is this correct?
+
+            UnderlayAbstractPath underlayPath = null; // ignore
+
+            List<ElementType> mergingList = Lists.newArrayList(); // empty merging list for now
+
+            List<ElementType> constrainingElements = Lists.newArrayList();
+            ElementType to = new TeLinkId((long) cmYang.to().tpRef()); // is this correct?
+            constrainingElements.add(to);
+
+            BitSet flags = new BitSet(); // what are the flags in cmYang?
+
+            List<Long> srlgs = Lists.newArrayList();
+            if (cmYang.teSrlgs() != null) {
+                for (Srlg srlg : cmYang.teSrlgs().value()) {
+                    srlgs.add(srlg.uint32());
+                }
+            }
+            TePathAttributes teAttributes = new
+                    TePathAttributes(cmYang.teDefaultMetric(),
+                                     cmYang.performanceMetric().measurement().unidirectionalDelay(),
+                                     srlgs);
+            ConnectivityMatrix coreCm = new ConnectivityMatrix(cmYang.id(),
+                                                               from,
+                                                               mergingList ,
+                                                               constrainingElements,
+                                                               flags,
+                                                               teAttributes ,
+                                                               underlayPath);
+
+            teCmList.put(cmYang.id(), coreCm);
+        }
+
+        return teCmList;
+    }
+
+    private static TeTopologyKey yang2TeSubsystemNodeUnderlayTopology(UnderlayTopology ut) {
+        TeTopologyKey tetopokey = new TeTopologyKey((Long) ut.providerIdRef(),
+                                                    (Long) ut.clientIdRef(),
+                                                    (Long) ut.teTopologyIdRef());
+        return tetopokey;
+    }
+
+    // TODO: retrieve the details of tunnel termiantion points from yang to te
+    private static Map<Long, org.onosproject.tetopology.management.api.node.
+                      TunnelTerminationPoint> yang2TeSubsystemTtp(List<TunnelTerminationPoint> ttps) {
+        Map<Long, org.onosproject.tetopology.management.api.node.TunnelTerminationPoint> ttpsMap = Maps
+                .newHashMap();
+        for (TunnelTerminationPoint ttpYang : ttps) {
+
+            SwitchingType switchingLayer = null; // how to find switching type?
+            EncodingType encodingLayer = null; // TODO: find proper encoding type from ttpYang.config().encoding();
+            BitSet flags = new BitSet(); // how to set flags?
+            List<Long> interLayerLockList = Lists.newArrayList();
+            interLayerLockList.add(ttpYang.config().interLayerLockId()); // interLayerLock in yang is not a list
+
+            List<LocalLinkConnectivity> localLinkConnectivityList = Lists.newArrayList();
+            // FIXME: once new yang model is used, we can make llc
+//            LocalLinkConnectivity llc = new LocalLinkConnectivity(constrainingElements,
+//                                                                  flags,
+//                                                                  teAttributes,
+//                                                                  underlayPath)
+
+            float[] availAdaptBandwidth = null; // how to find availableBandwidth?
+
+            org.onosproject.tetopology.management.api.node.
+                TunnelTerminationPoint ttpTe = new
+                org.onosproject.tetopology.management.api.node.
+                DefaultTunnelTerminationPoint(ByteUtils.bytesToLong(ttpYang.tunnelTpId()),
+                                              switchingLayer ,
+                                              encodingLayer,
+                                              flags,
+                                              interLayerLockList,
+                                              localLinkConnectivityList,
+                                              availAdaptBandwidth);
+
+            ttpsMap.put(ByteUtils.bytesToLong(ttpYang.tunnelTpId()), ttpTe);
+        }
+
+        return ttpsMap;
+    }
+
+    private static TeNode yang2TeSubsystemNodeAugment(Te yangNodeAugTe,
+                                                      Network yangNetwork,
+                                                      Node yangNode,
+                                                      Map<KeyId, TerminationPoint> yangTps) {
+
+
+        NodeId yangNodeId = yangNode.nodeId();
+        List<SupportingNode> yangSupportNodes = yangNode.supportingNode();
+
+        NetworkId yangNetworkId = yangNetwork.networkId();
+
+        long teNodeId = Ip4Address.valueOf(yangNodeAugTe.teNodeId().dottedQuad().string()).toInt();
+
+        TeTopologyKey underlayTopologyIdId = null;
+
+        // FIXME: yang has a list of supporting nodes, but TeNode only has one
+        // supportTeNodeId. How ro retrieve providerId, clientId, topologyId, teNodeId?
+        TeNodeKey supportTeNodeId = null;
+//        supportTeNodeId = new TeNodeKey(providerId, clientId, topologyId, teNodeId)
+//        yangSupportNodes.get(0).
+
+        TeNodeKey sourceTeNodeId = null; //ignore
+        CommonNodeData teData = null;
+        Map<Long, ConnectivityMatrix> connMatrices = null;
+        Map<Long, org.onosproject.tetopology.management.api.node.TunnelTerminationPoint> ttps = null;
+        List<Long> teLinkIds = Lists.newArrayList();
+        List<Long> teTpIds = Lists.newArrayList();
+
+        // ********************************************** to find teLinkIds
+        if (yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class) != null) {
+            AugmentedNdNetwork augmentLink =
+                    (AugmentedNdNetwork) yangNetwork.yangAugmentedInfo(AugmentedNdNetwork.class);
+            for (Link link : augmentLink.link()) {
+                if (link.source().sourceNode().equals(yangNodeAugTe.teNodeId())) {
+                    teLinkIds.add(Long.valueOf(link.linkId().uri().string()));
+                }
+            }
+        }
+        // ********************************************** to find teTpIds
+        if (yangNode.yangAugmentedInfoMap() != null
+                && !yangNode.yangAugmentedInfoMap().isEmpty()) {
+
+            AugmentedNdNode yangTpNodeAugment = (AugmentedNdNode) yangNode
+                    .yangAugmentedInfo(AugmentedNdNode.class);
+
+            if (yangTpNodeAugment.terminationPoint() != null) {
+                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()) {
+                    teTpIds.add(Long.valueOf(yangTpnode.tpId().uri().string()));
+                }
+            }
+        }
+        // **********************************************
+
+        Config ynodeAugCfg = yangNodeAugTe.config();
+
+        if (ynodeAugCfg != null) {
+            TeNodeAttributes teNodeAttr = ynodeAugCfg.teNodeAttributes();
+            if (teNodeAttr != null) {
+
+                if (teNodeAttr.underlayTopology() != null) {
+
+                    underlayTopologyIdId = yang2TeSubsystemNodeUnderlayTopology(teNodeAttr
+                            .underlayTopology());
+                }
+                BitSet flags = new BitSet();
+                if (teNodeAttr.isAbstract()) {
+                    flags.set(TeNode.BIT_ABSTRACT);
+                }
+                teData = new CommonNodeData(
+                                            teNodeAttr.name().string(),
+                                            EnumConverter.yang2TeSubsystemAdminStatus(teNodeAttr.adminStatus()),
+                                            EnumConverter.yang2TeSubsystemOpStatus(yangNodeAugTe.state().operStatus()),
+                                            flags);
+
+                if (teNodeAttr.connectivityMatrix() != null) {
+                    connMatrices = yang2TeSubsystemNodeConnectivityMatrix(yangNetworkId.uri().toString(),
+                                                                    yangNodeId.uri().toString(),
+                                                                    teNodeAttr.connectivityMatrix());
+                }
+
+            }
+        }
+
+        if (yangNodeAugTe.tunnelTerminationPoint() != null) {
+            ttps = yang2TeSubsystemTtp(yangNodeAugTe.tunnelTerminationPoint());
+        }
+
+        TeNode teNode = new DefaultTeNode(teNodeId,
+                                          underlayTopologyIdId,
+                                          supportTeNodeId,
+                                          sourceTeNodeId,
+                                          teData,
+                                          connMatrices,
+                                          teLinkIds,
+                                          ttps,
+                                          teTpIds);
+        return teNode;
+    }
+
+    private static Map<KeyId, TerminationPoint> yang2TeSubsystemTpNodeAugment(AugmentedNdNode yangTpNodeAugment) {
+        Map<KeyId, TerminationPoint> tps;
+        if (yangTpNodeAugment.terminationPoint() != null) {
+            tps = Maps.newHashMap();
+            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()) {
+                tps.put(KeyId.keyId(yangTpnode.tpId().uri().toString()),
+                        TerminationPointConverter.yang2teSubsystemTerminationPoint(yangTpnode));
+            }
+            return tps;
+        }
         return null;
     }
 
-    public static NetworkNodeKey yangNodeEvent2NetworkNodeKey(TeNodeEvent yangNodeEvent) {
+    /**
+     * Converts a TE Topology node event from the data format used in
+     * the core to its corresponding YANG Object (YO) format.
+     *
+     * @param eventType Node event type
+     * @param nodeData  TE Topology node event data
+     * @return YANG Object converted from nodeData
+     */
+    public static TeNodeEvent teNetworkNode2yangTeNodeEvent(TeTopologyEventTypeEnum eventType,
+                                                            NetworkNode nodeData) {
+        TeNodeEvent.TeNodeEventBuilder builder = new DefaultTeNodeEvent.TeNodeEventBuilder();
 
+        TeTopologyEventType yangEventType = new TeTopologyEventType(eventType);
+        builder.eventType(yangEventType);
+
+        NodeId nodeId = NodeId.fromString(nodeData.nodeId().toString());
+        builder.nodeRef(nodeId);
+
+        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
+                rev20160708.ietftetopology.tenodeconfigattributesnotification.
+                TeNodeAttributes teNodeAttributes = teNode2YangTeNodeAttributes(nodeData.teNode());
+        builder.teNodeAttributes(teNodeAttributes);
+
+        return builder.build();
+    }
+
+    private static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.
+            ietf.te.topology.rev20160708.ietftetopology.
+            tenodeconfigattributesnotification.
+            TeNodeAttributes teNode2YangTeNodeAttributes(TeNode teNode) {
+
+        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
+                rev20160708.ietftetopology.tenodeconfigattributesnotification.
+                TeNodeAttributes.TeNodeAttributesBuilder attrBuilder =
+                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
+                        rev20160708.ietftetopology.tenodeconfigattributesnotification.
+                        DefaultTeNodeAttributes.builder();
+
+        if (teNode.connectivityMatrices() != null) {
+
+            org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+            .tenodeconnectivitymatrixabs.DefaultConnectivityMatrix
+            .ConnectivityMatrixBuilder connectivityMatrixConfigBuilder = org.onosproject.yang.gen.v1.urn.ietf.
+            params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeconnectivitymatrixabs.
+            DefaultConnectivityMatrix.builder();
+            for (Map.Entry<Long, ConnectivityMatrix> teCmEntry :
+                teNode.connectivityMatrices().entrySet()) {
+                connectivityMatrixConfigBuilder = connectivityMatrixConfigBuilder
+                        .id(teCmEntry.getKey())
+                        .isAllowed(!teCmEntry.getValue().flags()
+                                   .get(ConnectivityMatrix.BIT_DISALLOWED))
+                        .from(new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+                              .ietftetopology.tenodeconnectivitymatrixabs.connectivitymatrix.DefaultFrom
+                              .FromBuilder() // TODO: for now, assuming that there is
+                                                            // only one 'from', and mergingList is empty
+                              .tpRef(teCmEntry.getValue().from())
+                                             .build())
+                        .to(new org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+                            .ietftetopology.tenodeconnectivitymatrixabs.connectivitymatrix
+                            .DefaultTo.ToBuilder() // TODO: for now, assuming that there is only
+                                                      // one item in constrainingElements list
+                              .tpRef(teCmEntry.getValue().constrainingElements().get(0))
+                                             .build());
+                attrBuilder = attrBuilder
+                        .addToConnectivityMatrix(connectivityMatrixConfigBuilder
+                                .build());
+            }
+        }
+
+        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
+                rev20160708.ietftetopology.tenodeconfigattributesnotification.
+                TeNodeAttributes teNodeAttributes = attrBuilder.build();
+
+        return teNodeAttributes;
+    }
+
+    public static NetworkNodeKey yangNodeEvent2NetworkNodeKey(TeNodeEvent yangNodeEvent) {
         //TODO: implementation to be submitted as separate review
 
-        return null;
+        NetworkId networkRef = (NetworkId) (yangNodeEvent.networkRef());
+        NodeId nodeRef = (NodeId) (yangNodeEvent.nodeRef());
+        KeyId networkId = KeyId.keyId(networkRef.uri().toString());
+        KeyId nodeId = KeyId.keyId(nodeRef.uri().toString());
+
+        NetworkNodeKey networkNodeKey = new NetworkNodeKey(networkId, nodeId);
+
+        return networkNodeKey;
     }
 
     public static NetworkNode yangNodeEvent2NetworkNode(TeNodeEvent yangNodeEvent,
                                                         TeTopologyService teTopologyService) {
-
         //TODO: implementation to be submitted as separate review
 
-        return null;
+        KeyId networkNodeId = yangNodeEvent2NetworkNodeKey(yangNodeEvent).nodeId();
+
+        org.onosproject.tetopology.management.api.Network network = teTopologyService.network
+                (yangNodeEvent2NetworkNodeKey(yangNodeEvent).networkId());
+        if (network == null) {
+            return null;
+        }
+
+        NetworkNode networkNode = network.node(networkNodeId);
+        if (networkNode == null) {
+            return null;
+        }
+
+        List<NetworkNodeKey> supportingNodeIds = networkNode.supportingNodeIds();
+        Map<KeyId, TerminationPoint> tps = networkNode.terminationPoints();
+
+        TeNode teNode = networkNode.teNode();
+        if (teNode == null) {
+            return null;
+        }
+
+        TeNode updatedTeNode = yangNodeEvent2TeNode(yangNodeEvent, teNode);
+
+        NetworkNode updatedNetworkNode = new DefaultNetworkNode(networkNodeId, supportingNodeIds, updatedTeNode, tps);
+
+        return updatedNetworkNode;
+    }
+
+    private static TeNode yangNodeEvent2TeNode(TeNodeEvent yangNodeEvent, TeNode oldTeNode) {
+
+        long teNodeId = oldTeNode.teNodeId();
+        TeTopologyKey underlayTopoId = oldTeNode.underlayTeTopologyId();
+        TeNodeKey supportTeNodeId = oldTeNode.sourceTeNodeId();
+        TeNodeKey sourceTeNodeId = oldTeNode.sourceTeNodeId();
+        Map<Long, ConnectivityMatrix> connMatrices = oldTeNode.connectivityMatrices();
+        List<Long> teLinkIds = oldTeNode.teLinkIds();
+        Map<Long, org.onosproject.tetopology.management.
+                api.node.TunnelTerminationPoint> ttps = oldTeNode.tunnelTerminationPoints();
+        List<Long> teTpIds = oldTeNode.teLinkIds();
+        String name = oldTeNode.name();
+        TeStatus adminStatus = oldTeNode.adminStatus();
+        TeStatus opStatus = oldTeNode.opStatus();
+        BitSet flags = oldTeNode.flags();
+
+        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
+                .tenodeconfigattributesnotification
+                .TeNodeAttributes yangTeNodeAttrs = yangNodeEvent.teNodeAttributes();
+
+        if (yangTeNodeAttrs != null) {
+            TeAdminStatus yangAdminStatus = yangTeNodeAttrs.adminStatus();
+            if (yangAdminStatus != null) {
+                adminStatus = EnumConverter.yang2TeSubsystemAdminStatus(yangAdminStatus);
+            }
+
+            BitSet yangFlags = yangTeNodeAttrs.selectLeafFlags();
+            if (yangFlags != null) {
+                flags = yangFlags;
+            }
+
+            List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.
+                    ietf.te.topology.rev20160708.ietftetopology
+                    .tenodeconnectivitymatrixabs.ConnectivityMatrix> yangConnMatrices = yangTeNodeAttrs
+                    .connectivityMatrix();
+            if (yangConnMatrices != null) {
+                for (org.onosproject.yang.gen.v1.
+                        urn.ietf.params.xml.ns.yang.
+                        ietf.te.topology
+                        .rev20160708.ietftetopology
+                        .tenodeconnectivitymatrixabs
+                        .ConnectivityMatrix yangConnMatrix : yangConnMatrices) {
+                    Long cmId = new Long(yangConnMatrix.id());
+                    ConnectivityMatrix oldConnMatrix = connMatrices.get(new Long(yangConnMatrix.id()));
+                    if (oldConnMatrix != null) {
+                        ConnectivityMatrix newConnMatrix = yangNodeEvent2TeConnectivityMatrix(yangConnMatrix,
+                                                                                              oldConnMatrix);
+                        connMatrices.remove(cmId);
+                        connMatrices.put(cmId, newConnMatrix);
+                    }
+                }
+            }
+        }
+
+        CommonNodeData teData = new CommonNodeData(name, adminStatus, opStatus, flags);
+        TeNode updatedTeNode = new DefaultTeNode(teNodeId, underlayTopoId, supportTeNodeId, sourceTeNodeId, teData,
+                                                 connMatrices, teLinkIds, ttps, teTpIds);
+
+        return updatedTeNode;
+    }
+
+    private static ConnectivityMatrix yangNodeEvent2TeConnectivityMatrix(org.onosproject.yang.gen.v1.
+                                                                         urn.ietf.params.xml.ns.yang.
+                                                                         ietf.te.topology
+                                                                         .rev20160708.ietftetopology
+                                                                         .tenodeconnectivitymatrixabs
+                                                                         .ConnectivityMatrix yangConnMatrix,
+                                                                 ConnectivityMatrix oldTeConnMatrix) {
+
+        long id = yangConnMatrix.id();
+        ElementType from = new TeLinkId((long) (yangConnMatrix.from().tpRef()));
+        UnderlayAbstractPath underlayPath = null;
+        List<ElementType> mergingList = Lists.newArrayList();
+
+        List<ElementType> constrainingElements = Lists.newArrayList();
+        ElementType to = new TeLinkId((long) (yangConnMatrix.to().tpRef()));
+        constrainingElements.add(to);
+
+        BitSet flags = oldTeConnMatrix.flags();
+
+        TePathAttributes teAttributes = oldTeConnMatrix.teAttributes();
+
+        ConnectivityMatrix updatedConnMatrix = new ConnectivityMatrix(id,
+                                                                      from,
+                                                                      mergingList,
+                                                                      constrainingElements,
+                                                                      flags,
+                                                                      teAttributes,
+                                                                      underlayPath);
+        return updatedConnMatrix;
     }
 }
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 2084f3e..18ac803 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,8 +15,43 @@
  */
 package org.onosproject.teyang.utils.topology;
 
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
-        .networks.network.node.augmentedndnode.TerminationPoint;
+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.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.interfaceswitchingcapabilitylist.interfaceswitchingcapability.DefaultMaxLspBandwidth;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.interfaceswitchingcapabilitylist.interfaceswitchingcapability.MaxLspBandwidth;
+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;
 
 /**
  * The termination point translations.
@@ -38,13 +73,79 @@
      * @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) {
+    public static TerminationPoint teSubsystem2YangTerminationPoint(org.onosproject.tetopology.management.api.node.
+                                                                    TerminationPoint teSubsystem) {
+        checkNotNull(teSubsystem, E_NULL_TE_SUBSYSTEM_TP);
 
-        //TODO: implementation to be submitted as a separate review
-        return null;
+        TpId tpId = TpId.fromString(teSubsystem.tpId().toString());
+        TerminationPoint.TerminationPointBuilder builder =
+                new DefaultTerminationPoint.TerminationPointBuilder().tpId(tpId);
+
+        if (teSubsystem.supportingTpIds() != null) {
+            List<SupportingTerminationPoint> tps = Lists.newArrayList();
+            SupportingTerminationPoint.SupportingTerminationPointBuilder
+                    spTpBuilder = DefaultSupportingTerminationPoint.builder();
+            for (TerminationPointKey tpKey : teSubsystem.supportingTpIds()) {
+                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.teTpId() != null) {
+            AugmentedNtTerminationPoint.AugmentedNtTerminationPointBuilder
+                    tpAugmentBuilder = DefaultAugmentedNtTerminationPoint.builder();
+
+            TeBuilder yangTeBuilder = DefaultTe.builder();
+
+            yangTeBuilder = yangTeBuilder.teTpId(TeTpId.fromString((String.valueOf(teSubsystem.teTpId()))));
+
+            Config yConfig = teSubsystem2YangTeAugConfig(teSubsystem);
+            yangTeBuilder = yangTeBuilder.config(yConfig);
+
+            State yState = teSubsystem2YangTeAugState(teSubsystem);
+            yangTeBuilder = yangTeBuilder.state(yState);
+
+            tpAugmentBuilder = tpAugmentBuilder.te(yangTeBuilder.build());
+            builder.addYangAugmentedInfo(tpAugmentBuilder.build(), AugmentedNtTerminationPoint.class);
+        }
+
+        return builder.build();
     }
 
+    private static State teSubsystem2YangTeAugState(org.onosproject.tetopology.management.api.node.
+            TerminationPoint teSubsystemTe) {
+        State.StateBuilder yangStateBuilder = DefaultState.builder();
+        // FIXME: interLayerLocks is a list in core but not in yang
+//        yangStateBuilder = yangStateBuilder.interLayerLockId(teLink.interLayerLocks().get(0));
+
+        return yangStateBuilder.build();
+    }
+
+    private static Config teSubsystem2YangTeAugConfig(org.onosproject.tetopology.management.api.node.
+                                                      TerminationPoint teSubsystemTe) {
+        Config.ConfigBuilder yangConfigBuilder = DefaultConfig.builder();
+        //FIXME: interLayerLocks is a list in core but not in yang
+        // yangConfigBuilder =
+        // yangConfigBuilder.interLayerLockId(teLink.interLayerLocks().get(0));
+
+        InterfaceSwitchingCapability.InterfaceSwitchingCapabilityBuilder isc =
+                DefaultInterfaceSwitchingCapability.builder();
+
+        MaxLspBandwidth.MaxLspBandwidthBuilder maxlspBW = DefaultMaxLspBandwidth
+                .builder();
+//        for (float f : teLink.maxAvialLspBandwidth()) {
+//            // is converting from float to long ok?
+//            maxlspBW = maxlspBW.bandwidth(BigDecimal.valueOf((long) f));
+//            isc = isc.addToMaxLspBandwidth(maxlspBW.build());
+//        }
+
+        yangConfigBuilder = yangConfigBuilder.addToInterfaceSwitchingCapability(isc.build());
+
+        return yangConfigBuilder.build();
+    }
 
     /**
      * TerminationPoint object translation from YANG to TE Topology subsystem.
@@ -53,10 +154,38 @@
      * @return TerminationPoint TE Topology subsystem termination point
      */
     public static org.onosproject.tetopology.management.api.node.TerminationPoint
-    yang2teSubsystemTerminationPoint(TerminationPoint yangTp) {
+                      yang2teSubsystemTerminationPoint(TerminationPoint yangTp) {
+        checkNotNull(yangTp, E_NULL_YANG_TP);
 
-        // TODO: implementation to be submitted as separate review
-        return null;
+        org.onosproject.tetopology.management.api.node.DefaultTerminationPoint tp = null;
+        List<org.onosproject.tetopology.management.api.node.TerminationPointKey> spTps = null;
+        KeyId teTpId = null;
+
+        if (yangTp.supportingTerminationPoint() != null) {
+            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);
+            }
+        }
+
+        if (yangTp.yangAugmentedInfoMap() != null && !yangTp.yangAugmentedInfoMap().isEmpty()) {
+            AugmentedNtTerminationPoint yangTpAugment =
+                    (AugmentedNtTerminationPoint) yangTp.yangAugmentedInfo(AugmentedNtTerminationPoint.class);
+            if (yangTpAugment.te() != null && yangTpAugment.te().teTpId() != null) {
+                teTpId = KeyId.keyId(yangTpAugment.te().teTpId().toString());
+            }
+        }
+
+        tp = new org.onosproject.tetopology.management.api.node
+                .DefaultTerminationPoint(KeyId.keyId(yangTp.tpId().uri().string()),
+                                         spTps,
+                                         Long.valueOf(teTpId.toString()));
+        return tp;
     }
 
 }
diff --git a/providers/ietfte/topology/src/main/java/org/onosproject/provider/te/topology/TeTopologyRestconfProvider.java b/providers/ietfte/topology/src/main/java/org/onosproject/provider/te/topology/TeTopologyRestconfProvider.java
index 442b65f..2fd6aec 100644
--- a/providers/ietfte/topology/src/main/java/org/onosproject/provider/te/topology/TeTopologyRestconfProvider.java
+++ b/providers/ietfte/topology/src/main/java/org/onosproject/provider/te/topology/TeTopologyRestconfProvider.java
@@ -270,7 +270,7 @@
             //Convert the YO to TE Core data and update TE Core.
             for (Network nw : ietfNetwork.networks().network()) {
                 topologyProviderService.networkUpdated(
-                        NetworkConverter.yang2TeSubsystemNetwork(nw));
+                        NetworkConverter.yang2TeSubsystemNetwork(nw, ietfNetwork.networks()));
             }
         }
 
