Changing converter utility code to match the latest TE Subsystem APIs.

Change-Id: I82effa0431d5f7ccaa36e5f75a85324219de17ab
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()));
             }
         }