diff --git a/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/LinkTed.java b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/LinkTed.java
new file mode 100644
index 0000000..3a68603
--- /dev/null
+++ b/apps/iptopology-api/src/main/java/org/onosproject/iptopology/api/LinkTed.java
@@ -0,0 +1,349 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.iptopology.api;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
+
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.Ip6Address;
+import org.onlab.util.Bandwidth;
+
+/**
+ * Represents Link Traffic engineering parameters.
+ */
+public class LinkTed {
+    private final Bandwidth maximumLink;
+    private final Bandwidth maxReserved;
+    private final List<Bandwidth> maxUnResBandwidth;
+    private final Metric teMetric;
+    private final Metric igpMetric;
+    private final List<Ip4Address> ipv4LocRouterId;
+    private final List<Ip6Address> ipv6LocRouterId;
+    private final List<Ip4Address> ipv4RemRouterId;
+    private final List<Ip6Address> ipv6RemRouterId;
+    private final Color color;
+    private final Signalling signalType;
+    private final List<Srlg> srlgGroup;
+    private final ProtectionType protectType;
+
+    /**
+     * Constructor to initialize its parameter.
+     *
+     * @param maximumLink maximum bandwidth can be used
+     * @param maxReserved max bandwidth that can be reserved
+     * @param maxUnResBandwidth amount of bandwidth reservable
+     * @param teMetric Traffic engineering metric
+     * @param igpMetric IGP metric
+     * @param color information on administrative group assigned to the interface
+     * @param signalType MPLS signaling protocols
+     * @param srlgGroup Shared Risk Link Group information
+     * @param protectType protection capabilities of the link
+     * @param ipv4LocRouterId IPv4 router-Id of local node
+     * @param ipv6LocRouterId IPv6 router-Id of local node
+     * @param ipv4RemRouterId IPv4 router-Id of remote node
+     * @param ipv6RemRouterId IPv6 router-Id of remote node
+     */
+    public LinkTed(Bandwidth maximumLink, Bandwidth maxReserved, List<Bandwidth> maxUnResBandwidth,
+                   Metric teMetric, Metric igpMetric, Color color, Signalling signalType, List<Srlg> srlgGroup,
+                   ProtectionType protectType, List<Ip4Address> ipv4LocRouterId, List<Ip6Address> ipv6LocRouterId,
+                   List<Ip4Address> ipv4RemRouterId, List<Ip6Address> ipv6RemRouterId) {
+        this.maximumLink = maximumLink;
+        this.maxReserved = maxReserved;
+        this.maxUnResBandwidth = maxUnResBandwidth;
+        this.teMetric = teMetric;
+        this.igpMetric = igpMetric;
+        this.color = color;
+        this.signalType = signalType;
+        this.srlgGroup = srlgGroup;
+        this.protectType = protectType;
+        this.ipv4LocRouterId = ipv4LocRouterId;
+        this.ipv6LocRouterId = ipv6LocRouterId;
+        this.ipv4RemRouterId = ipv4RemRouterId;
+        this.ipv6RemRouterId = ipv6RemRouterId;
+    }
+
+    /**
+     * Provides maximum bandwidth can be used on the link.
+     *
+     * @return maximum bandwidth
+     */
+    public Bandwidth maximumLink() {
+        return maximumLink;
+    }
+
+    /**
+     * Amount of bandwidth reservable on the link.
+     *
+     * @return unreserved bandwidth
+     */
+    public List<Bandwidth> maxUnResBandwidth() {
+        return maxUnResBandwidth;
+    }
+
+    /**
+     * Provides max bandwidth that can be reserved on the link.
+     *
+     * @return max bandwidth reserved
+     */
+    public Bandwidth maxReserved() {
+        return maxReserved;
+    }
+
+    /**
+     * Provides Traffic engineering metric for the link.
+     *
+     * @return Traffic engineering metric
+     */
+    public Metric teMetric() {
+        return teMetric;
+    }
+
+    /**
+     * Provides IGP metric for the link.
+     *
+     * @return IGP metric
+     */
+    public Metric igpMetric() {
+        return igpMetric;
+    }
+
+    /**
+     * Provides protection capabilities of the link.
+     *
+     * @return link protection type
+     */
+    public ProtectionType protectType() {
+        return protectType;
+    }
+
+    /**
+     * Provides Shared Risk Link Group information.
+     *
+     * @return Shared Risk Link Group value
+     */
+    public List<Srlg> srlgGroup() {
+        return srlgGroup;
+    }
+
+    /**
+     * Provides which MPLS signaling protocols are enabled.
+     *
+     * @return signal type
+     */
+    public Signalling signalType() {
+        return signalType;
+    }
+
+    /**
+     * Provides information on administrative group assigned to the interface.
+     *
+     * @return 4-octect bit mask assigned by network administrator
+     */
+    public Color color() {
+        return color;
+    }
+
+    /**
+     * Provides IPv4 router-Id of local node.
+     *
+     * @return IPv4 router-Id of local node
+     */
+    public List<Ip4Address> ipv4LocRouterId() {
+        return ipv4LocRouterId;
+    }
+
+    /**
+     * Provides IPv6 router-Id of local node.
+     *
+     * @return IPv6 router-Id of local node
+     */
+    public List<Ip6Address> ipv6LocRouterId() {
+        return ipv6LocRouterId;
+    }
+
+    /**
+     * Provides IPv4 router-Id of remote node.
+     *
+     * @return IPv4 router-Id of remote node
+     */
+    public List<Ip4Address> ipv4RemRouterId() {
+        return ipv4RemRouterId;
+    }
+
+    /**
+     * Provides IPv6 router-Id of remote node.
+     *
+     * @return IPv6 router-Id of remote node
+     */
+    public List<Ip6Address> ipv6RemRouterId() {
+        return ipv6RemRouterId;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(maximumLink, maxReserved, maxUnResBandwidth, teMetric, igpMetric,
+                ipv4LocRouterId, ipv6LocRouterId, ipv4RemRouterId, ipv6RemRouterId,
+                color, signalType, srlgGroup, protectType);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof LinkTed) {
+            int countCommonBandwidth = 0;
+            int countOtherCommonBandwidth = 0;
+            int countOther4LocRouterId = 0;
+            int countCommon4LocRouterId = 0;
+            int countOther6RemRouterId = 0;
+            int countCommon6RemRouterId = 0;
+            int countOther4RemRouterId = 0;
+            int countCommon4RemRouterId = 0;
+            int countCommon6LocRouterId = 0;
+            int countOther6LocRouterId = 0;
+            int countCommonSrlg = 0;
+            int countOtherSrlg = 0;
+            boolean isCommonBandwidth = true;
+            boolean isCommonIp4Loc = true;
+            boolean isCommonIp4Rem = true;
+            boolean isCommonIp6Loc = true;
+            boolean isCommonIp6Rem = true;
+            boolean isCommonSrlg = true;
+            LinkTed other = (LinkTed) obj;
+            Iterator<Bandwidth> objListIterator = other.maxUnResBandwidth.iterator();
+            countOtherCommonBandwidth = other.maxUnResBandwidth.size();
+            countCommonBandwidth = maxUnResBandwidth.size();
+
+            Iterator<Ip4Address> ipv4local = other.ipv4LocRouterId.iterator();
+            countOther4LocRouterId = other.ipv4LocRouterId.size();
+            countCommon4LocRouterId = ipv4LocRouterId.size();
+
+            Iterator<Ip4Address> ipv4remote = other.ipv4RemRouterId.iterator();
+            countOther4RemRouterId = other.ipv4RemRouterId.size();
+            countCommon4RemRouterId = ipv4RemRouterId.size();
+
+            Iterator<Ip6Address> ipv6local = other.ipv6LocRouterId.iterator();
+            countOther6LocRouterId = other.ipv6LocRouterId.size();
+            countCommon6LocRouterId = ipv6LocRouterId.size();
+
+            Iterator<Ip6Address> ipv6remote = other.ipv6RemRouterId.iterator();
+            countOther6RemRouterId = other.ipv6RemRouterId.size();
+            countCommon6RemRouterId = ipv6RemRouterId.size();
+
+            Iterator<Srlg> srlg = other.srlgGroup.iterator();
+            countOtherSrlg = other.srlgGroup.size();
+            countCommonSrlg = srlgGroup.size();
+
+            if (countOtherCommonBandwidth != countCommonBandwidth
+                    || countOther4LocRouterId != countCommon4LocRouterId
+                    || countOther4RemRouterId != countCommon4RemRouterId
+                    || countOther6LocRouterId != countCommon6LocRouterId
+                    || countOther6RemRouterId != countCommon6RemRouterId
+                    || countOtherSrlg != countCommonSrlg) {
+                return false;
+            } else {
+                while (objListIterator.hasNext() && isCommonBandwidth) {
+                    Bandwidth subTlv = objListIterator.next();
+                    if (maxUnResBandwidth.contains(subTlv) && other.maxUnResBandwidth.contains(subTlv)) {
+                        isCommonBandwidth = Objects.equals(maxUnResBandwidth.get(maxUnResBandwidth.indexOf(subTlv)),
+                                other.maxUnResBandwidth.get(other.maxUnResBandwidth.indexOf(subTlv)));
+                    } else {
+                        isCommonBandwidth = false;
+                    }
+                }
+                while (ipv4local.hasNext() && isCommonIp4Loc) {
+                    Ip4Address subTlv = ipv4local.next();
+                    if (ipv4LocRouterId.contains(subTlv) && other.ipv4LocRouterId.contains(subTlv)) {
+                        isCommonIp4Loc = Objects.equals(ipv4LocRouterId.get(ipv4LocRouterId.indexOf(subTlv)),
+                                other.ipv4LocRouterId.get(other.ipv4LocRouterId.indexOf(subTlv)));
+                    } else {
+                        isCommonIp4Loc = false;
+                    }
+                }
+                while (ipv4remote.hasNext() && isCommonIp4Rem) {
+                    Ip4Address subTlv = ipv4remote.next();
+                    if (ipv4RemRouterId.contains(subTlv) && other.ipv4RemRouterId.contains(subTlv)) {
+                        isCommonIp4Rem = Objects.equals(ipv4RemRouterId.get(ipv4RemRouterId.indexOf(subTlv)),
+                                other.ipv4RemRouterId.get(other.ipv4RemRouterId.indexOf(subTlv)));
+                    } else {
+                        isCommonIp4Rem = false;
+                    }
+                }
+                while (ipv6remote.hasNext() && isCommonIp6Rem) {
+                    Ip6Address subTlv = ipv6remote.next();
+                    if (ipv6RemRouterId.contains(subTlv) && other.ipv6RemRouterId.contains(subTlv)) {
+                        isCommonIp6Rem = Objects.equals(ipv6RemRouterId.get(ipv6RemRouterId.indexOf(subTlv)),
+                                other.ipv6RemRouterId.get(other.ipv6RemRouterId.indexOf(subTlv)));
+                    } else {
+                        isCommonIp6Rem = false;
+                    }
+                }
+                while (ipv6local.hasNext() && isCommonIp6Loc) {
+                    Ip6Address subTlv = ipv6local.next();
+                    if (ipv6LocRouterId.contains(subTlv) && other.ipv6LocRouterId.contains(subTlv)) {
+                        isCommonIp6Loc = Objects.equals(ipv6LocRouterId.get(ipv6LocRouterId.indexOf(subTlv)),
+                                other.ipv6LocRouterId.get(other.ipv6LocRouterId.indexOf(subTlv)));
+                    } else {
+                        isCommonIp6Loc = false;
+                    }
+                }
+                while (srlg.hasNext() && isCommonIp6Loc) {
+                    Srlg subTlv = srlg.next();
+                    if (srlgGroup.contains(subTlv) && other.srlgGroup.contains(subTlv)) {
+                        isCommonSrlg = Objects.equals(srlgGroup.get(srlgGroup.indexOf(subTlv)),
+                                other.srlgGroup.get(other.srlgGroup.indexOf(subTlv)));
+                    } else {
+                        isCommonSrlg = false;
+                    }
+                }
+                return isCommonBandwidth && isCommonIp4Loc && isCommonIp4Rem && isCommonIp6Rem && isCommonIp6Loc
+                        && isCommonSrlg
+                        && Objects.equals(igpMetric, other.igpMetric)
+                        && Objects.equals(teMetric, other.teMetric)
+                        && Objects.equals(maximumLink, other.maximumLink)
+                        && Objects.equals(protectType, other.protectType)
+                        && Objects.equals(color, other.color)
+                        && Objects.equals(signalType, other.signalType);
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("igpMetric", igpMetric)
+                .add("teMetric", teMetric)
+                .add("maximumLink", maximumLink)
+                .add("maxReserved", maxReserved)
+                .add("maxUnResBandwidth", maxUnResBandwidth)
+                .add("ipv4LocRouterId", ipv4LocRouterId)
+                .add("ipv4RemRouterId", ipv4RemRouterId)
+                .add("ipv6LocRouterId", ipv6LocRouterId)
+                .add("ipv6RemRouterId", ipv6RemRouterId)
+                .add("protectType", protectType)
+                .add("color", color)
+                .add("srlgGroup", srlgGroup)
+                .add("signalType", signalType)
+                .toString();
+    }
+}
\ No newline at end of file
