diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrTeDefaultMetric.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrTeDefaultMetric.java
new file mode 100755
index 0000000..7febe3c3
--- /dev/null
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpLinkAttrTeDefaultMetric.java
@@ -0,0 +1,132 @@
+/*
+ * 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.bgpio.types.attr;
+
+import java.util.Objects;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.bgpio.exceptions.BGPParseException;
+import org.onosproject.bgpio.types.BGPErrorType;
+import org.onosproject.bgpio.types.BGPValueType;
+import org.onosproject.bgpio.util.Validation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * Implements BGP link state Default TE metric link attribute.
+ */
+public class BgpLinkAttrTeDefaultMetric implements BGPValueType {
+
+    protected static final Logger log = LoggerFactory
+            .getLogger(BgpLinkAttrTeDefaultMetric.class);
+
+    public static final int ATTRLINK_TEDEFAULTMETRIC = 1092;
+    public static final int TE_DATA_LEN = 4;
+
+    /* TE Default Metric */
+    private int linkTeMetric;
+
+    /**
+     * Constructor to initialize the value.
+     *
+     * @param linkTeMetric TE default metric
+     *
+     */
+    public BgpLinkAttrTeDefaultMetric(int linkTeMetric) {
+        this.linkTeMetric = linkTeMetric;
+    }
+
+    /**
+     * Returns object of this class with specified values.
+     *
+     * @param linkTeMetric TE default metric
+     * @return object of BgpLinkAttrTeDefaultMetric
+     */
+    public static BgpLinkAttrTeDefaultMetric of(final int linkTeMetric) {
+        return new BgpLinkAttrTeDefaultMetric(linkTeMetric);
+    }
+
+    /**
+     * Reads the BGP link attributes of TE default metric.
+     *
+     * @param cb Channel buffer
+     * @return object of type BgpLinkAttrTeDefaultMetric
+     * @throws BGPParseException while parsing BgpLinkAttrTeDefaultMetric
+     */
+    public static BgpLinkAttrTeDefaultMetric read(ChannelBuffer cb)
+            throws BGPParseException {
+        int linkTeMetric;
+
+        short lsAttrLength = cb.readShort();
+
+        if ((lsAttrLength != TE_DATA_LEN)
+                || (cb.readableBytes() < lsAttrLength)) {
+            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
+                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+                                   lsAttrLength);
+        }
+
+        linkTeMetric = cb.readInt();
+
+        return new BgpLinkAttrTeDefaultMetric(linkTeMetric);
+    }
+
+    /**
+     * Returns the TE default metrics.
+     *
+     * @return link default metric
+     */
+    public int attrLinkDefTeMetric() {
+        return linkTeMetric;
+    }
+
+    @Override
+    public short getType() {
+        return ATTRLINK_TEDEFAULTMETRIC;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(linkTeMetric);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof BgpLinkAttrTeDefaultMetric) {
+            BgpLinkAttrTeDefaultMetric other = (BgpLinkAttrTeDefaultMetric) obj;
+            return Objects.equals(linkTeMetric, other.linkTeMetric);
+        }
+        return false;
+    }
+
+    @Override
+    public int write(ChannelBuffer cb) {
+        // TODO This will be implemented in the next version
+        return 0;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("linkTEMetric", linkTeMetric).toString();
+    }
+}
