diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LinkLocalRemoteIdentifiersTlv.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LinkLocalRemoteIdentifiersTlv.java
new file mode 100644
index 0000000..988925f
--- /dev/null
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/LinkLocalRemoteIdentifiersTlv.java
@@ -0,0 +1,131 @@
+/*
+ * 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;
+
+import java.util.Objects;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * Provides Implementation of Link Local/Remote IdentifiersTlv.
+ */
+public class LinkLocalRemoteIdentifiersTlv implements BGPValueType {
+    private static final Logger log = LoggerFactory.getLogger(LinkLocalRemoteIdentifiersTlv.class);
+    public static final short TYPE = 258;
+    private static final int LENGTH = 8;
+
+    private final int linkLocalIdentifer;
+    private final int linkRemoteIdentifer;
+
+    /**
+     * Constructor to initialize parameters.
+     *
+     * @param linkLocalIdentifer link local Identifer
+     * @param linkRemoteIdentifer link remote Identifer
+     */
+    public LinkLocalRemoteIdentifiersTlv(int linkLocalIdentifer, int linkRemoteIdentifer) {
+        this.linkLocalIdentifer = linkLocalIdentifer;
+        this.linkRemoteIdentifer = linkRemoteIdentifer;
+    }
+
+    /**
+     * Returns link remote Identifer.
+     *
+     * @return link remote Identifer
+     */
+    public int getLinkRemoteIdentifier() {
+        return linkRemoteIdentifer;
+    }
+
+    /**
+     * Returns link local Identifer.
+     *
+     * @return link local Identifer
+     */
+    public int getLinkLocalIdentifier() {
+        return linkLocalIdentifer;
+    }
+
+    @Override
+    public short getType() {
+        return TYPE;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(linkLocalIdentifer, linkRemoteIdentifer);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof LinkLocalRemoteIdentifiersTlv) {
+            LinkLocalRemoteIdentifiersTlv other = (LinkLocalRemoteIdentifiersTlv) obj;
+            return Objects.equals(this.linkLocalIdentifer, other.linkLocalIdentifer)
+                    && Objects.equals(this.linkRemoteIdentifer, other.linkRemoteIdentifer);
+        }
+        return false;
+    }
+
+    @Override
+    public int write(ChannelBuffer cb) {
+        int iLenStartIndex = cb.writerIndex();
+        cb.writeShort(TYPE);
+        cb.writeShort(LENGTH);
+        cb.writeInt(linkLocalIdentifer);
+        cb.writeInt(linkRemoteIdentifer);
+        return cb.writerIndex() - iLenStartIndex;
+    }
+
+    /**
+     * Reads the channel buffer and returns object of LinkLocalRemoteIdentifiersTlv.
+     *
+     * @param cb channelBuffer
+     * @return object of LinkLocalRemoteIdentifiersTlv
+     */
+    public static LinkLocalRemoteIdentifiersTlv read(ChannelBuffer cb) {
+        int linkLocalIdentifer = cb.readInt();
+        int linkRemoteIdentifer = cb.readInt();
+        return LinkLocalRemoteIdentifiersTlv.of(linkLocalIdentifer, linkRemoteIdentifer);
+    }
+
+    /**
+     * Returns object of this class with specified link local identifer and link remote identifer.
+     *
+     * @param linkLocalIdentifer link local identifier
+     * @param linkRemoteIdentifer link remote identifier
+     * @return object of LinkLocalRemoteIdentifiersTlv
+     */
+    public static LinkLocalRemoteIdentifiersTlv of(final int linkLocalIdentifer, final int linkRemoteIdentifer) {
+        return new LinkLocalRemoteIdentifiersTlv(linkLocalIdentifer, linkRemoteIdentifer);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("TYPE", TYPE)
+                .add("LENGTH", LENGTH)
+                .add("linkLocalIdentifer", linkLocalIdentifer)
+                .add("linkRemoteIdentifer", linkRemoteIdentifer)
+                .toString();
+    }
+}
\ No newline at end of file
