TeTopology core and nbi bug fixes and improvements

Change-Id: I5f3dbcaa79b04c1b1b00b9df7ccae804953c3bae
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 c567667..1234f7c 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,7 +15,14 @@
  */
 package org.onosproject.teyang.utils.topology;
 
-import com.google.common.collect.Lists;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.tetopology.management.api.TeConstants.MAX_PRIORITY;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.BitSet;
+import java.util.List;
+
 import org.onlab.packet.Ip4Address;
 import org.onosproject.tetopology.management.api.KeyId;
 import org.onosproject.tetopology.management.api.TeStatus;
@@ -24,6 +31,7 @@
 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;
@@ -31,6 +39,7 @@
 import org.onosproject.tetopology.management.api.link.NetworkLinkKey;
 import org.onosproject.tetopology.management.api.link.PathElement;
 import org.onosproject.tetopology.management.api.link.TeLink;
+import org.onosproject.tetopology.management.api.link.TeLinkId;
 import org.onosproject.tetopology.management.api.link.TeLinkTpGlobalKey;
 import org.onosproject.tetopology.management.api.link.TeLinkTpKey;
 import org.onosproject.tetopology.management.api.link.TePathAttributes;
@@ -41,137 +50,96 @@
 import org.onosproject.tetopology.management.api.node.NodeTpKey;
 import org.onosproject.tetopology.management.api.node.TeNode;
 import org.onosproject.tetopology.management.api.node.TerminationPointKey;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev20130715.ietfinettypes.IpAddress;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NetworkId;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.Networks;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.NodeId;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.Network;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network
-        .Node;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
-        .LinkId;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
-        .TpId;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
-        .networks.network.AugmentedNdNetwork;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
-        .networks.network.augmentedndnetwork.DefaultLink;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
-        .networks.network.augmentedndnetwork.DefaultLink.LinkBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
-        .networks.network.augmentedndnetwork.Link;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
-        .networks.network.augmentedndnetwork.link.DefaultDestination;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
-        .networks.network.augmentedndnetwork.link.DefaultSource;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
-        .networks.network.augmentedndnetwork.link.DefaultSupportingLink;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
-        .networks.network.augmentedndnetwork.link.Destination.DestinationBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
-        .networks.network.augmentedndnetwork.link.Source.SourceBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
-        .networks.network.augmentedndnetwork.link.SupportingLink;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
-        .networks.network.augmentedndnetwork.link.SupportingLink.SupportingLinkBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology
-        .networks.network.node.AugmentedNdNode;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .DefaultTeLinkEvent;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev20151208.ietfnetwork.networks.network.Node;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.LinkId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.TpId;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology.networks.network.AugmentedNdNetwork;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.augmentedndnetwork.DefaultLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.augmentedndnetwork.DefaultLink.LinkBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.augmentedndnetwork.Link;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.augmentedndnetwork.link.DefaultDestination;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.augmentedndnetwork.link.DefaultSource;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.augmentedndnetwork.link.DefaultSupportingLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+                .ietfnetworktopology.networks.network.augmentedndnetwork.link.Destination
+                .DestinationBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.augmentedndnetwork.link.Source.SourceBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.augmentedndnetwork.link.SupportingLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208
+               .ietfnetworktopology.networks.network.augmentedndnetwork.link.SupportingLink
+               .SupportingLinkBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev20151208.ietfnetworktopology.networks.network.node.AugmentedNdNode;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.DefaultTeLinkEvent;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.TeLinkEvent;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .informationsourceattributes.DefaultInformationSourceState;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .informationsourceattributes.InformationSourceState;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .informationsourceattributes.informationsourcestate.DefaultTopology;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .informationsourceattributes.informationsourcestate.Topology;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
-        .network.AugmentedNwNetwork;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
-        .network.link.AugmentedNtLink;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
-        .network.link.DefaultAugmentedNtLink;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
-        .network.link.DefaultAugmentedNtLink.AugmentedNtLinkBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
-        .network.node.AugmentedNwNode;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.networks
-        .network.node.terminationpoint.AugmentedNtTerminationPoint;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkaugment.DefaultTe;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkaugment.DefaultTe.TeBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkaugment.te.Config;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkaugment.te.DefaultConfig;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkaugment.te.DefaultConfig.ConfigBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkaugment.te.DefaultState;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkaugment.te.DefaultState.StateBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkaugment.te.State;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkconfigattributes.DefaultTeLinkAttributes;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkconfigattributes.DefaultTeLinkAttributes.TeLinkAttributesBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkconfigattributes.TeLinkAttributes;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkconfigattributes.telinkattributes.DefaultExternalDomain;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkconfigattributes.telinkattributes.DefaultExternalDomain.ExternalDomainBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkconfigattributes.telinkattributes.DefaultUnderlay.UnderlayBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkconfigattributes.telinkattributes.ExternalDomain;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkconnectivityattributes.DefaultTeSrlgs;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkconnectivityattributes.DefaultTeSrlgs.TeSrlgsBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkconnectivityattributes.DefaultUnreservedBandwidth;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkconnectivityattributes.DefaultUnreservedBandwidth.UnreservedBandwidthBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkconnectivityattributes.TeSrlgs;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkconnectivityattributes.UnreservedBandwidth;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkinfoattributes.LinkProtectionTypeEnum;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkunderlayattributes.DefaultUnderlayBackupPath;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkunderlayattributes.DefaultUnderlayBackupPath.UnderlayBackupPathBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkunderlayattributes.DefaultUnderlayPrimaryPath;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkunderlayattributes.DefaultUnderlayPrimaryPath.UnderlayPrimaryPathBuilder;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkunderlayattributes.UnderlayPrimaryPath;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .telinkunderlayattributes.underlayprimarypath.DefaultPathElement;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
-        .tenodeaugment.Te;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.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.telinkconnectivityattributes.TeSrlgs;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkconnectivityattributes.UnreservedBandwidth;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkinfoattributes.LinkProtectionTypeEnum;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayBackupPath;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayBackupPath.UnderlayBackupPathBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayPrimaryPath;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.DefaultUnderlayPrimaryPath.UnderlayPrimaryPathBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.UnderlayPrimaryPath;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.telinkunderlayattributes.underlayprimarypath.DefaultPathElement;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology.tenodeaugment.Te;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.Srlg;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeNodeId;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeOperStatus;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes
-        .TeTopologyEventType;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTopologyEventType;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.TeTpId;
-import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes
-        .tetopologyeventtype.TeTopologyEventTypeEnum;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.DefaultUnnumberedLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.DefaultUnnumberedLink.UnnumberedLinkBuilder;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.explicitroutesubobject.type.UnnumberedLink;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.types.rev20160705.ietftetypes.tetopologyeventtype.TeTopologyEventTypeEnum;
 
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.BitSet;
-import java.util.List;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
+import com.google.common.collect.Lists;
 
 /**
  * The conversion functions.
@@ -194,30 +162,29 @@
 
     private static LinkProtectionTypeEnum teSubsystem2YangLinkProtectionType(TunnelProtectionType linkProtectionType) {
         switch (linkProtectionType) {
-            case ENHANCED:
-                return LinkProtectionTypeEnum.ENHANCED;
-            case EXTRA_TRAFFIC:
-                return LinkProtectionTypeEnum.EXTRA_TRAFFIC;
-            case SHARED:
-                return LinkProtectionTypeEnum.SHARED;
-            case UNPROTECTED:
-                return LinkProtectionTypeEnum.UNPROTECTED;
-            case ONE_FOR_ONE:
-                return LinkProtectionTypeEnum.YANGAUTOPREFIX1_FOR_1;
-            case ONE_PLUS_ONE:
-                return LinkProtectionTypeEnum.YANGAUTOPREFIX1_PLUS_1;
-            default:
-                return null;
+        case ENHANCED:
+            return LinkProtectionTypeEnum.ENHANCED;
+        case EXTRA_TRAFFIC:
+            return LinkProtectionTypeEnum.EXTRA_TRAFFIC;
+        case SHARED:
+            return LinkProtectionTypeEnum.SHARED;
+        case UNPROTECTED:
+            return LinkProtectionTypeEnum.UNPROTECTED;
+        case ONE_FOR_ONE:
+            return LinkProtectionTypeEnum.YANGAUTOPREFIX1_FOR_1;
+        case ONE_PLUS_ONE:
+            return LinkProtectionTypeEnum.YANGAUTOPREFIX1_PLUS_1;
+        default:
+            return null;
         }
     }
-
     /**
      * TE Link Config object conversion from TE Topology subsystem to YANG.
      *
      * @param teLink TE link object
      * @return TE Link Config YANG object
      */
-    private static Config teLink2YangConfig(TeLink teLink) {
+    private static Config teLink2YangConfig(TeLink teLink, TeTopologyService teTopologyService) {
         checkNotNull(teLink, E_NULL_TELINK_DATA);
 
         TeLinkAttributesBuilder attrBuilder = DefaultTeLinkAttributes.builder();
@@ -234,7 +201,7 @@
         if (teLink.tunnelProtectionType() != null) {
             attrBuilder = attrBuilder
                     .linkProtectionType(teSubsystem2YangLinkProtectionType(teLink
-                                                                                   .tunnelProtectionType()));
+                            .tunnelProtectionType()));
         }
 
         attrBuilder = attrBuilder.teDefaultMetric(teLink.cost());
@@ -257,27 +224,25 @@
             if (teLink.externalLink().externalLinkKey() != null) {
                 edBuilder = edBuilder
                         .remoteTeLinkTpId(TeTpId.fromString(
-                                String.valueOf(teLink
-                                                       .externalLink()
-                                                       .externalLinkKey()
-                                                       .teLinkTpId())))
+                                                                String.valueOf(teLink
+                                                                        .externalLink()
+                                                                        .externalLinkKey()
+                                                                        .teLinkTpId())))
                         .remoteTeNodeId(TeNodeId.fromString(
-                                String.valueOf(teLink
-                                                       .externalLink()
-                                                       .externalLinkKey()
-                                                       .teNodeId())));
+                                                                String.valueOf(teLink
+                                                                        .externalLink()
+                                                                        .externalLinkKey()
+                                                                        .teNodeId())));
             }
             attrBuilder = attrBuilder.externalDomain(edBuilder.build());
         }
 
         if (teLink.availBandwidth() != null) {
-            short i = 0;
-            for (float f : teLink.availBandwidth()) {
+            for (short i = 0; i < teLink.availBandwidth().length; i++) {
                 UnreservedBandwidthBuilder urBuilder =
                         DefaultUnreservedBandwidth.builder()
-                                .bandwidth(BigDecimal.valueOf(f))
-                                .priority(i);
-                i++;
+                                                  .bandwidth(BigDecimal.valueOf(teLink.availBandwidth()[i]))
+                                                  .priority(i);
                 attrBuilder = attrBuilder.addToUnreservedBandwidth(urBuilder.build());
             }
         }
@@ -291,23 +256,27 @@
 //            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());
+        if (teLink.primaryPath() != null || teLink.backupPaths() != null) {
+            UnderlayBuilder builder = DefaultUnderlay.builder();
+            if (teLink.primaryPath() != null) {
+                // TODO: what is underlayProtectionType in tePath?
+                // builder =
+                // builder.underlayProtectionType(tePath.protectionType());
+                builder = te2YangConfigUnderlayPrimaryPath(builder, teLink,
+                                                           teTopologyService);
+            }
+
+            if (teLink.backupPaths() != null) {
+                builder = te2YangConfigUnderlayBackupPaths(builder, teLink,
+                                                           teTopologyService);
+            }
+
+            attrBuilder = attrBuilder.underlay(builder.build());
+        }
+
 
         ConfigBuilder yangConfigBuilder = DefaultConfig.builder()
-                .teLinkAttributes(attrBuilder.build());
+                                                       .teLinkAttributes(attrBuilder.build());
         return yangConfigBuilder.build();
     }
 
@@ -319,11 +288,11 @@
      */
     private static State teLink2YangState(TeLink teLink) {
         TeLinkAttributes
-                .TeLinkAttributesBuilder attrBuilder =
-                DefaultTeLinkAttributes
-                        .builder()
-                        .teDefaultMetric(teLink.cost())
-                        .isAbstract(teLink.flags().get(TeLink.BIT_ABSTRACT));
+            .TeLinkAttributesBuilder attrBuilder =
+                        DefaultTeLinkAttributes
+            .builder()
+            .teDefaultMetric(teLink.cost())
+            .isAbstract(teLink.flags().get(TeLink.BIT_ABSTRACT));
         if (teLink.teLinkKey() != null) {
             // what is link index? for now I used teLinkTpId
             attrBuilder = attrBuilder.linkIndex(BigInteger.valueOf(teLink.teLinkKey().teLinkTpId()));
@@ -335,7 +304,7 @@
         if (teLink.tunnelProtectionType() != null) {
             attrBuilder = attrBuilder
                     .linkProtectionType(teSubsystem2YangLinkProtectionType(teLink
-                                                                                   .tunnelProtectionType()));
+                            .tunnelProtectionType()));
         }
         if (teLink.maxBandwidth() != null) {
             // maxBandwidth is an array of float[], but in yang is just a big decimal
@@ -361,13 +330,13 @@
             if (teLink.externalLink().externalLinkKey() != null) {
                 edBuilder = edBuilder
                         .remoteTeLinkTpId(TeTpId.fromString(String.valueOf(teLink
-                                                                                   .externalLink()
-                                                                                   .externalLinkKey()
-                                                                                   .teLinkTpId())))
+                                                                           .externalLink()
+                                                                           .externalLinkKey()
+                                                                           .teLinkTpId())))
                         .remoteTeNodeId(TeNodeId.fromString(String.valueOf(teLink
-                                                                                   .externalLink()
-                                                                                   .externalLinkKey()
-                                                                                   .teNodeId())));
+                                                                           .externalLink()
+                                                                           .externalLinkKey()
+                                                                           .teNodeId())));
             }
             attrBuilder = attrBuilder.externalDomain(edBuilder.build());
 
@@ -377,19 +346,17 @@
             short i = 0;
             for (float f : teLink.availBandwidth()) {
                 UnreservedBandwidth.UnreservedBandwidthBuilder urBuilder = DefaultUnreservedBandwidth
-                        .builder()
-                        .bandwidth(BigDecimal.valueOf(f))
-                        .priority(i);
+                        .builder().bandwidth(BigDecimal.valueOf(f)).priority(i);
                 i++;
                 attrBuilder = attrBuilder.addToUnreservedBandwidth(urBuilder.build());
             }
         }
 
         StateBuilder yangStateBuilder = DefaultState.builder()
-                .teLinkAttributes(attrBuilder.build());
+                                                    .teLinkAttributes(attrBuilder.build());
         if (teLink.opStatus() != null) {
             yangStateBuilder = yangStateBuilder.operStatus(EnumConverter
-                                                                   .teSubsystem2YangOperStatus(teLink.opStatus()));
+                                                           .teSubsystem2YangOperStatus(teLink.opStatus()));
         }
 
         if (teLink.sourceTeLinkId() != null) {
@@ -397,8 +364,8 @@
 
             Topology.TopologyBuilder topologyBuilder = DefaultTopology.builder();
             topologyBuilder = topologyBuilder.clientIdRef(teLink.sourceTeLinkId().clientId())
-                    .providerIdRef(teLink.sourceTeLinkId().providerId())
-                    .teTopologyIdRef(teLink.sourceTeLinkId().topologyId());
+                                             .providerIdRef(teLink.sourceTeLinkId().providerId())
+                                             .teTopologyIdRef(teLink.sourceTeLinkId().topologyId());
             issBuilder = issBuilder.topology(topologyBuilder.build());
             yangStateBuilder.informationSourceState(issBuilder.build());
         }
@@ -407,7 +374,7 @@
         // 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);
+        //yangStateBuilder = yangStateBuilder.underlay(stateDerivedUnderlay);
 
         return yangStateBuilder.build();
     }
@@ -416,10 +383,12 @@
      * Link object conversion from TE Topology subsystem to YANG.
      *
      * @param teSubsNetworkLink TE subsystem link object
+     * @param teTopologyService teTopology core service
      * @return YANG link object
      */
     public static Link teSubsystem2YangLink(
-            org.onosproject.tetopology.management.api.link.NetworkLink teSubsNetworkLink) {
+            org.onosproject.tetopology.management.api.link.NetworkLink teSubsNetworkLink,
+            TeTopologyService teTopologyService) {
         checkNotNull(teSubsNetworkLink, E_NULL_TELINK);
 
         LinkId linkId = LinkId.fromString(teSubsNetworkLink.linkId().toString());
@@ -429,43 +398,43 @@
             SupportingLinkBuilder spLinkBuilder = DefaultSupportingLink.builder();
             for (NetworkLinkKey linkKey : teSubsNetworkLink.supportingLinkIds()) {
                 slinks.add(spLinkBuilder.networkRef(NetworkId.fromString(
-                        linkKey.networkId().toString()))
-                                   .linkRef(LinkId.fromString(
-                                           linkKey.linkId().toString()))
-                                   .build());
+                                                    linkKey.networkId().toString()))
+                                        .linkRef(LinkId.fromString(
+                                                    linkKey.linkId().toString()))
+                                        .build());
             }
             builder = builder.supportingLink(slinks);
         }
         if (teSubsNetworkLink.source() != null) {
             SourceBuilder sourceBuilder = DefaultSource
-                    .builder()
-                    .sourceNode(NodeId.fromString(
-                            teSubsNetworkLink.source().nodeId().toString()))
-                    .sourceTp(TpId.fromString(
-                            teSubsNetworkLink.source().tpId().toString()));
+                                              .builder()
+                                              .sourceNode(NodeId.fromString(
+                                                   teSubsNetworkLink.source().nodeId().toString()))
+                                              .sourceTp(TpId.fromString(
+                                                   teSubsNetworkLink.source().tpId().toString()));
             builder = builder.source(sourceBuilder.build());
         }
         if (teSubsNetworkLink.destination() != null) {
             DestinationBuilder destBuilder = DefaultDestination
-                    .builder()
-                    .destNode(NodeId.fromString(
-                            teSubsNetworkLink.destination().nodeId().toString()))
-                    .destTp(TpId.fromString(
-                            teSubsNetworkLink.destination().tpId().toString()));
+                                                 .builder()
+                                                 .destNode(NodeId.fromString(
+                                                      teSubsNetworkLink.destination().nodeId().toString()))
+                                                 .destTp(TpId.fromString(
+                                                      teSubsNetworkLink.destination().tpId().toString()));
             builder = builder.destination(destBuilder.build());
         }
 
         if (teSubsNetworkLink.teLink() != null) {
             TeLink teData = teSubsNetworkLink.teLink();
             TeBuilder yangTeBuilder = DefaultTe.builder()
-                    .config(teLink2YangConfig(teData))
-                    .state(teLink2YangState(teData));
+                                               .config(teLink2YangConfig(teData, teTopologyService))
+                                               .state(teLink2YangState(teData));
             // ignoring supportingTeLinkId when converting from core to yang?
             // if (teData.supportingTeLinkId() != null) {
             // }
             AugmentedNtLinkBuilder linkAugmentBuilder =
                     DefaultAugmentedNtLink.builder()
-                            .te(yangTeBuilder.build());
+                                          .te(yangTeBuilder.build());
             builder.addYangAugmentedInfo(linkAugmentBuilder.build(), AugmentedNtLink.class);
         }
 
@@ -479,24 +448,30 @@
         org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath tePath = teLink.primaryPath();
 
         UnderlayPrimaryPathBuilder pathBuilder =
-                DefaultUnderlayPrimaryPath.builder();
+                                       DefaultUnderlayPrimaryPath.builder();
         if (tePath.pathElements() != null) {
             for (PathElement pathElementTe : tePath.pathElements()) {
                 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                        .ietftetopology.telinkunderlayattributes.underlayprimarypath.PathElement
-                        .PathElementBuilder pathElementYangBuilder = DefaultPathElement.builder();
+                .ietftetopology.telinkunderlayattributes.underlayprimarypath.PathElement
+                   .PathElementBuilder pathElementYangBuilder = DefaultPathElement.builder();
 
                 pathElementYangBuilder = pathElementYangBuilder.pathElementId(pathElementTe.pathElementId());
-                //TODO: add some Type cross converter
-//              pathElementYangBuilder = pathElementYangBuilder.type(Type pathElementTe.type())
+                //TODO: check more types here
+                if (pathElementTe.type() instanceof TeLinkId) {
+                    UnnumberedLinkBuilder unmBuilder = DefaultUnnumberedLink.builder()
+                            .routerId(IpAddress.fromString(
+                                             Ip4Address.valueOf((int) pathElementTe.teNodeId()).toString()))
+                            .interfaceId(((TeLinkId) pathElementTe.type()).value());
+                    pathElementYangBuilder = pathElementYangBuilder.type(unmBuilder.build());
+                }
 
                 pathBuilder = pathBuilder.addToPathElement(pathElementYangBuilder.build());
             }
         }
 
         pathBuilder = pathBuilder.clientIdRef(teLink.underlayTeTopologyId().clientId())
-                .providerIdRef(teLink.underlayTeTopologyId().providerId())
-                .teTopologyIdRef(teLink.underlayTeTopologyId().topologyId());
+                                 .providerIdRef(teLink.underlayTeTopologyId().providerId())
+                                 .teTopologyIdRef(teLink.underlayTeTopologyId().topologyId());
 
         pathBuilder = pathBuilder.networkIdRef(teTopologyService.networkId(teLink.underlayTeTopologyId()));
 
@@ -513,22 +488,28 @@
                     .builder();
             pathBuilder = pathBuilder.index(tePath.index());
             pathBuilder = pathBuilder.clientIdRef(teLink.underlayTeTopologyId().clientId())
-                    .providerIdRef(teLink.underlayTeTopologyId().providerId())
-                    .teTopologyIdRef(teLink.underlayTeTopologyId().topologyId());
+                                     .providerIdRef(teLink.underlayTeTopologyId().providerId())
+                                     .teTopologyIdRef(teLink.underlayTeTopologyId().topologyId());
 
             pathBuilder = pathBuilder.networkIdRef(teTopologyService.networkId(teLink.underlayTeTopologyId()));
 
             for (PathElement backupPathElementTe : tePath.pathElements()) {
                 org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                        .ietftetopology.telinkunderlayattributes.underlaybackuppath.PathElement
-                        .PathElementBuilder elementBuilder =
-                        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
-                                .ietftetopology.telinkunderlayattributes.underlaybackuppath.DefaultPathElement
-                                .builder();
+                .ietftetopology.telinkunderlayattributes.underlaybackuppath.PathElement
+                .PathElementBuilder elementBuilder =
+                org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
+                .ietftetopology.telinkunderlayattributes.underlaybackuppath.DefaultPathElement
+                        .builder();
 
                 elementBuilder = elementBuilder.pathElementId(backupPathElementTe.pathElementId());
-                // TODO: add some Type cross conversion
-//                elementBuilder.type(type);
+                //TODO: check more types here
+                if (backupPathElementTe.type() instanceof TeLinkId) {
+                    UnnumberedLinkBuilder unmBuilder = DefaultUnnumberedLink.builder()
+                            .routerId(IpAddress.fromString(
+                                             Ip4Address.valueOf((int) backupPathElementTe.teNodeId()).toString()))
+                            .interfaceId(((TeLinkId) backupPathElementTe.type()).value());
+                    elementBuilder = elementBuilder.type(unmBuilder.build());
+                }
 
                 pathBuilder = pathBuilder
                         .addToPathElement(elementBuilder.build());
@@ -570,9 +551,9 @@
         TeLinkTpKey peerTeLinkKey = null;
         if (yangLink.destination() != null) {
             peerTeLinkKey = new TeLinkTpKey(teNodeIdDestLong,
-                                            findTeTpId(yangNetwork,
-                                                       yangLink.destination().destNode(),
-                                                       yangLink.destination().destTp()));
+                                                        findTeTpId(yangNetwork,
+                                                                   yangLink.destination().destNode(),
+                                                                   yangLink.destination().destTp()));
         }
 
         TeLinkTpGlobalKey supportTeLinkId = findSupportTeLinkId(yangNetworks, yangLink);
@@ -634,20 +615,21 @@
         List<Long> interLayerLocks = null; // FIXME: how to find interLayerLocks?
 
         List<UnreservedBandwidth> listOfUnreservedBandwidth = yangLinkAtrr.unreservedBandwidth();
-        float[] availBandwidth = new float[listOfUnreservedBandwidth.size()];
-        int i = 0;
+        float[] availBandwidth = new float[MAX_PRIORITY + 1];
         for (UnreservedBandwidth urbw : listOfUnreservedBandwidth) {
-            availBandwidth[i] = urbw.bandwidth().floatValue();
-            i++;
+            availBandwidth[urbw.priority()] = urbw.bandwidth().floatValue();
         }
 
-        float[] maxBandwidth = new float[1];
+        float[] maxBandwidth = new float[MAX_PRIORITY + 1];
         if (yangLinkAtrr.maxLinkBandwidth() != null) {
-            maxBandwidth[0] = yangLinkAtrr.maxLinkBandwidth().floatValue();
+            // Core TE has an array, but YANG is an integer
+            for (short p = 0; p <= MAX_PRIORITY; p++) {
+                maxBandwidth[p] = yangLinkAtrr.maxLinkBandwidth().floatValue();
+            }
         }
 
-        float[] maxAvailLspBandwidth = null; // FIXME: how to find this?
-        float[] minAvailLspBandwidth = null; // FIXME: how to find this?
+        float[] maxAvailLspBandwidth = availBandwidth; // FIXME: how to find this?
+        float[] minAvailLspBandwidth = availBandwidth; // FIXME: how to find this?
         LinkBandwidth bandwidth = new LinkBandwidth(
                 maxBandwidth,
                 availBandwidth,
@@ -665,9 +647,8 @@
         TePathAttributes teAttributes =
                 new TePathAttributes(yangLinkAtrr.teDefaultMetric(),
                                      yangLinkAtrr.performanceMetric() == null ? null :
-                                             (yangLinkAtrr.performanceMetric().measurement() == null ? null :
-                                                     yangLinkAtrr.performanceMetric().measurement()
-                                                             .unidirectionalDelay()),
+                                           (yangLinkAtrr.performanceMetric().measurement() == null ? null :
+                                               yangLinkAtrr.performanceMetric().measurement().unidirectionalDelay()),
                                      srlgs);
         teData = new CommonLinkData(adminStatus,
                                     opStatus,
@@ -688,7 +669,7 @@
     }
 
     private static TeLinkTpGlobalKey findSupportTeLinkId(Networks yangNetworks,
-                                                         Link yangLink) {
+                                            Link yangLink) {
         Network teNetworkFound = null;
         LinkId teLinkIdFound = null;
         TeLinkTpGlobalKey supportTeLinkId = null;
@@ -741,7 +722,7 @@
             supportTeLinkId = new TeLinkTpGlobalKey(teTopologyId.providerId(),
                                                     teTopologyId.clientId(),
                                                     Long.valueOf(teTopologyId
-                                                                         .topologyId()),
+                                                            .topologyId()),
                                                     tenIdLong, teSupportLinkTpId);
         }
 
@@ -783,7 +764,7 @@
                             if (yangTpnode.tpId().equals(yangTpId)) {
                                 if (yangTpnode.yangAugmentedInfoMap() != null
                                         && !yangTpnode.yangAugmentedInfoMap()
-                                        .isEmpty()) {
+                                                .isEmpty()) {
                                     AugmentedNtTerminationPoint yangTpAugment =
                                             (AugmentedNtTerminationPoint) yangTpnode
                                                     .yangAugmentedInfo(AugmentedNtTerminationPoint.class);
@@ -799,18 +780,17 @@
         }
         return teTpId;
     }
-
     /**
      * Link object conversion from YANG to TE Topology subsystem.
      *
-     * @param yangLink     YANG link
-     * @param yangNetwork  YANG network
+     * @param yangLink  YANG link
+     * @param yangNetwork YANG network
      * @param yangNetworks YANG networks
      * @return TE subsystem link
      */
     public static org.onosproject.tetopology.management.api.link.NetworkLink
-    yang2TeSubsystemLink(Link yangLink, Network yangNetwork,
-                         Networks yangNetworks) {
+            yang2TeSubsystemLink(Link yangLink, Network yangNetwork,
+                                 Networks yangNetworks) {
         NetworkId networkId = yangNetwork.networkId();
         checkNotNull(yangLink, E_NULL_YANG_TELINK);
 
@@ -831,17 +811,17 @@
 
         if (yangLink.source() != null) {
             TerminationPointKey source = new TerminationPointKey(
-                    KeyId.keyId(networkId.uri().toString()),
-                    KeyId.keyId(yangLink.source().sourceNode().uri().toString()),
-                    KeyId.keyId(yangLink.source().sourceTp().uri().toString()));
+                                                 KeyId.keyId(networkId.uri().toString()),
+                                                 KeyId.keyId(yangLink.source().sourceNode().uri().toString()),
+                                                 KeyId.keyId(yangLink.source().sourceTp().uri().toString()));
             sourceNodeTpKey = new NodeTpKey(source.nodeId(), source.tpId());
         }
 
         if (yangLink.destination() != null) {
             TerminationPointKey destination = new TerminationPointKey(
-                    KeyId.keyId(networkId.uri().toString()),
-                    KeyId.keyId(yangLink.destination().destNode().uri().toString()),
-                    KeyId.keyId(yangLink.destination().destTp().uri().toString()));
+                                                      KeyId.keyId(networkId.uri().toString()),
+                                                      KeyId.keyId(yangLink.destination().destNode().uri().toString()),
+                                                      KeyId.keyId(yangLink.destination().destTp().uri().toString()));
             destinationNodeTpKey = new NodeTpKey(destination.nodeId(), destination.tpId());
         }
 
@@ -873,19 +853,25 @@
     }
 
     private static org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath
-    yang2TeSubsystemUnderlayPrimaryPath(UnderlayPrimaryPath yangpath,
-                                        long teNodeId) {
+                    yang2TeSubsystemUnderlayPrimaryPath(UnderlayPrimaryPath yangpath,
+                                                        long teNodeId) {
         org.onosproject.tetopology.management.api.link.UnderlayPrimaryPath teUnderlayPrimaryPath = null;
 
         List<PathElement> pathElementList = Lists.newArrayList();
         for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708.ietftetopology
                 .telinkunderlayattributes.underlayprimarypath.
-                PathElement pathElementConfigYang : yangpath.pathElement()) {
+                PathElement pathElementYang : yangpath.pathElement()) {
 
-            // TODO: find the proper type (ElementType) from pathElementConfigYang.type()
-            PathElement tePathElement = new PathElement(pathElementConfigYang.pathElementId(),
-                                                        teNodeId,
-                                                        null,
+            long nodeId = 0;
+            ElementType type = null;
+            // TODO: check more types
+            if (pathElementYang.type() instanceof UnnumberedLink) {
+                nodeId = Long.valueOf(((UnnumberedLink) pathElementYang.type()).routerId().toString());
+                type = new TeLinkId(((UnnumberedLink) pathElementYang.type()).interfaceId());
+            }
+            PathElement tePathElement = new PathElement(pathElementYang.pathElementId(),
+                                                        nodeId,
+                                                        type,
                                                         false); // FIXME: how to find the proper value for loose?
             pathElementList.add(tePathElement);
         }
@@ -897,11 +883,11 @@
     }
 
     private static List<UnderlayBackupPath>
-    yang2TeSubsystemUnderlayBackupPaths(
-            List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
+       yang2TeSubsystemUnderlayBackupPaths(
+                List<org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.
                     rev20160708.ietftetopology.telinkunderlayattributes.
                     UnderlayBackupPath> yangpaths,
-            long teNodeId) {
+                long teNodeId) {
 
         List<UnderlayBackupPath> underlayBackupPathsList = Lists.newArrayList();
         for (org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.te.topology.rev20160708
@@ -909,15 +895,20 @@
                 UnderlayBackupPath yangConfig : yangpaths) {
             UnderlayBackupPath ubp = null;
             List<PathElement> backupPathElementList = Lists.newArrayList();
+            long nodeId = 0;
+            ElementType type = null;
             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
+                    PathElement backupYang : yangConfig.pathElement()) {
+                // TODO: check more types
+                if (backupYang.type() instanceof UnnumberedLink) {
+                    nodeId = Long.valueOf(((UnnumberedLink) backupYang.type()).routerId().toString());
+                    type = new TeLinkId(((UnnumberedLink) backupYang.type()).interfaceId());
+                }
+                PathElement tePathElementBackup = new PathElement(backupYang.pathElementId(),
+                                                                  nodeId,
+                                                                  type,
+                                                                  false);
                 backupPathElementList.add(tePathElementBackup);
             }
             ubp = new UnderlayBackupPath(yangConfig.index(),
@@ -930,13 +921,13 @@
     }
 
     /**
-     * TE Link underlay path Config object conversion from YANG to TE Topology subsystem.
-     *
-     * @param yangLinkAtrr YANG link Config YANG object
-     * @return teSubsystem TE underlay path object
-     */
+    * TE Link underlay path Config object conversion from YANG to TE Topology subsystem.
+    *
+    * @param yangLinkAtrr YANG link Config YANG object
+    * @return teSubsystem TE underlay path object
+    */
     private static org.onosproject.tetopology.management.api.link.UnderlayPath
-    yang2TeSubsystemUnderlayPath(TeLinkAttributes yangLinkAtrr, long srcTeNodeId, long dstTeNodeId) {
+               yang2TeSubsystemUnderlayPath(TeLinkAttributes yangLinkAtrr, long srcTeNodeId, long dstTeNodeId) {
 
         checkNotNull(yangLinkAtrr, E_NULL_YANG_TELINK_CONFIG);
 
@@ -957,12 +948,12 @@
         org.onosproject.tetopology.management.api.link.UnderlayPath teUnderlay = null;
         if (yangLinkAtrr.underlay() != null) {
             teUnderlay = new org.onosproject.tetopology.management.api.link.
-                    UnderlayPath(underlayPrimaryPath,
-                                 underlayBackupPathsList,
-                                 TunnelProtectionType.of(yangLinkAtrr.underlay().underlayProtectionType()),
-                                 (long) yangLinkAtrr.underlay().underlayTrailSrc().tpRef(), // Is this correct?
-                                 (long) yangLinkAtrr.underlay().underlayTrailDes().tpRef(), // Is this correct?
-                                 teTunnelId);
+                        UnderlayPath(underlayPrimaryPath,
+                                     underlayBackupPathsList,
+                                     TunnelProtectionType.of(yangLinkAtrr.underlay().underlayProtectionType()),
+                                     (long) yangLinkAtrr.underlay().underlayTrailSrc().tpRef(), // Is this correct?
+                                     (long) yangLinkAtrr.underlay().underlayTrailDes().tpRef(), // Is this correct?
+                                     teTunnelId);
         }
 
         return teUnderlay;
@@ -1023,16 +1014,14 @@
     }
 
     /**
-     * Converts a YANG network link notification event into  a TE network
-     * link.
+     * Converts a YANG network link notification event into a TE network link.
      *
-     * @param yangLinkEvent     YANG network link notification
+     * @param yangLinkEvent YANG network link notification
      * @param teTopologyService TE Topology service used to help the conversion
      * @return TE network link
      */
     public static NetworkLink yangLinkEvent2NetworkLink(TeLinkEvent yangLinkEvent,
                                                         TeTopologyService teTopologyService) {
-
         KeyId linkId = yangLinkEvent2NetworkLinkKey(yangLinkEvent).linkId();
 
         org.onosproject.tetopology.management.api.
@@ -1061,28 +1050,27 @@
 
         TeOperStatus opState = yangLinkEvent.operStatus();
         org.onosproject.tetopology.management.api.
-                TeStatus opStatus = EnumConverter.yang2TeSubsystemOpStatus(opState);
+        TeStatus opStatus = EnumConverter.yang2TeSubsystemOpStatus(opState);
 
         TeLink updatedTeLink = yangLinkEvent2TeLinkAttributes(yangLinkEvent, teLink, opStatus);
 
 
-        NetworkLink updatedNetworkLink = new DefaultNetworkLink(linkId,
-                                                                sourceTp,
-                                                                destTp,
-                                                                supportingLinkIds,
+        NetworkLink updatedNetworkLink = new DefaultNetworkLink(linkId, sourceTp, destTp, supportingLinkIds,
                                                                 updatedTeLink);
 
         return updatedNetworkLink;
     }
 
-    private static TeLink yangLinkEvent2TeLinkAttributes(TeLinkEvent yangLinkEvent,
-                                                         TeLink oldTeLink,
-                                                         TeStatus opStatus) {
+    private static TeLink yangLinkEvent2TeLinkAttributes(TeLinkEvent yangLinkEvent, TeLink oldTeLink, TeStatus
+            opStatus) {
 
         TeLinkAttributes yangTeLinkAttrs = yangLinkEvent.teLinkAttributes();
 
         TeLinkTpKey teLinkKey = oldTeLink.teLinkKey();
 
+
+        //long teNodeIdDest = oldTeLink.peerTeLinkKey().teNodeId();
+        //long teNodeIdSrc = oldTeLink.teLinkKey().teNodeId();
         long teNodeIdDest = 0;
         long teNodeIdSrc = 0;