diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeIsIsAreaId.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeIsIsAreaId.java
new file mode 100755
index 0000000..6e9f9ce
--- /dev/null
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeIsIsAreaId.java
@@ -0,0 +1,130 @@
+/*
+ * 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.Arrays;
+
+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 attribute ISIS Area Identifier.
+ */
+public class BgpAttrNodeIsIsAreaId implements BGPValueType {
+
+    protected static final Logger log = LoggerFactory
+            .getLogger(BgpAttrNodeIsIsAreaId.class);
+
+    public static final int ATTRNODE_ISISAREAID = 1027;
+
+    /* IS-IS Area Identifier TLV */
+    private byte[] isisAreaId;
+
+    /**
+     * Constructor to initialize value.
+     *
+     * @param isisAreaId ISIS area Identifier
+     */
+    public BgpAttrNodeIsIsAreaId(byte[] isisAreaId) {
+        this.isisAreaId = Arrays.copyOf(isisAreaId, isisAreaId.length);
+    }
+
+    /**
+     * Returns object of this class with specified values.
+     *
+     * @param isisAreaId ISIS area Identifier
+     * @return object of BgpAttrNodeIsIsAreaId
+     */
+    public static BgpAttrNodeIsIsAreaId of(final byte[] isisAreaId) {
+        return new BgpAttrNodeIsIsAreaId(isisAreaId);
+    }
+
+    /**
+     * Reads the IS-IS Area Identifier.
+     *
+     * @param cb ChannelBuffer
+     * @return object of BgpAttrNodeIsIsAreaId
+     * @throws BGPParseException while parsing BgpAttrNodeIsIsAreaId
+     */
+    public static BgpAttrNodeIsIsAreaId read(ChannelBuffer cb)
+            throws BGPParseException {
+        byte[] isisAreaId;
+
+        short lsAttrLength = cb.readShort();
+
+        if (cb.readableBytes() < lsAttrLength) {
+            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
+                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+                                   lsAttrLength);
+        }
+
+        isisAreaId = new byte[lsAttrLength];
+        cb.readBytes(isisAreaId);
+
+        return BgpAttrNodeIsIsAreaId.of(isisAreaId);
+    }
+
+    /**
+     * Returns ISIS area Identifier.
+     *
+     * @return Area ID
+     */
+    public byte[] attrNodeIsIsAreaId() {
+        return isisAreaId;
+    }
+
+    @Override
+    public short getType() {
+        return ATTRNODE_ISISAREAID;
+    }
+
+    @Override
+    public int hashCode() {
+        return Arrays.hashCode(isisAreaId);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof BgpAttrNodeIsIsAreaId) {
+            BgpAttrNodeIsIsAreaId other = (BgpAttrNodeIsIsAreaId) obj;
+            return Arrays.equals(isisAreaId, other.isisAreaId);
+        }
+        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()).omitNullValues()
+                .add("isisAreaId", isisAreaId).toString();
+    }
+}
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeName.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeName.java
new file mode 100755
index 0000000..a1f95e6
--- /dev/null
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeName.java
@@ -0,0 +1,129 @@
+/*
+ * 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.Arrays;
+
+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 attribute node name.
+ */
+public class BgpAttrNodeName implements BGPValueType {
+
+    protected static final Logger log = LoggerFactory
+            .getLogger(BgpAttrNodeName.class);
+
+    public static final int ATTRNODE_NAME = 1026;
+
+    /* Node Name */
+    private byte[] nodeName;
+
+    /**
+     * Constructor to initialize value.
+     *
+     * @param nodeName node name
+     */
+    public BgpAttrNodeName(byte[] nodeName) {
+        this.nodeName = Arrays.copyOf(nodeName, nodeName.length);
+    }
+
+    /**
+     * Returns object of this class with specified values.
+     *
+     * @param nodeName node name
+     * @return object of BgpAttrNodeName
+     */
+    public static BgpAttrNodeName of(final byte[] nodeName) {
+        return new BgpAttrNodeName(nodeName);
+    }
+
+    /**
+     * Reads the LS attribute node name.
+     *
+     * @param cb ChannelBuffer
+     * @return object of BgpAttrNodeName
+     * @throws BGPParseException while parsing BgpAttrNodeName
+     */
+    public static BgpAttrNodeName read(ChannelBuffer cb)
+            throws BGPParseException {
+        byte[] nodeName;
+
+        short lsAttrLength = cb.readShort();
+
+        if (cb.readableBytes() < lsAttrLength) {
+            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
+                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+                                   lsAttrLength);
+        }
+
+        nodeName = new byte[lsAttrLength];
+        cb.readBytes(nodeName);
+        return BgpAttrNodeName.of(nodeName);
+    }
+
+    /**
+     * Returns LS attribute node name.
+     *
+     * @return node name
+     */
+    public byte[] attrNodeName() {
+        return nodeName;
+    }
+
+    @Override
+    public short getType() {
+        return ATTRNODE_NAME;
+    }
+
+    @Override
+    public int hashCode() {
+        return Arrays.hashCode(nodeName);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof BgpAttrNodeName) {
+            BgpAttrNodeName other = (BgpAttrNodeName) obj;
+            return Arrays.equals(nodeName, other.nodeName);
+        }
+        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()).omitNullValues()
+                .add("nodeName", nodeName).toString();
+    }
+}
diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrOpaqueNode.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrOpaqueNode.java
new file mode 100755
index 0000000..3b0717e
--- /dev/null
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrOpaqueNode.java
@@ -0,0 +1,133 @@
+/*
+ * 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.Arrays;
+
+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 attribute opaque node.
+ */
+public class BgpAttrOpaqueNode implements BGPValueType {
+
+    protected static final Logger log = LoggerFactory
+            .getLogger(BgpAttrOpaqueNode.class);
+
+    public static final int ATTRNODE_OPAQUEDATA = 1025;
+
+    /* Opaque Node Attribute */
+    private byte[] opaqueNodeAttribute;
+
+    /**
+     * Constructor to initialize parameter.
+     *
+     * @param opaqueNodeAttribute opaque node attribute
+     */
+    public BgpAttrOpaqueNode(byte[] opaqueNodeAttribute) {
+        this.opaqueNodeAttribute = Arrays.copyOf(opaqueNodeAttribute, opaqueNodeAttribute.length);
+    }
+
+    /**
+     * Returns object of this class with specified values.
+     *
+     * @param opaqueNodeAttribute Prefix Metric
+     * @return object of BgpAttrOpaqueNode
+     */
+    public static BgpAttrOpaqueNode of(byte[] opaqueNodeAttribute) {
+        return new BgpAttrOpaqueNode(opaqueNodeAttribute);
+    }
+
+    /**
+     * Reads the Opaque Node Properties.
+     *
+     * @param cb ChannelBuffer
+     * @return object of BgpAttrOpaqueNode
+     * @throws BGPParseException while parsing BgpAttrOpaqueNode
+     */
+    public static BgpAttrOpaqueNode read(ChannelBuffer cb)
+            throws BGPParseException {
+
+        byte[] opaqueNodeAttribute;
+
+        short lsAttrLength = cb.readShort();
+
+        if (cb.readableBytes() < lsAttrLength) {
+            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
+                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+                                   lsAttrLength);
+        }
+
+        opaqueNodeAttribute = new byte[lsAttrLength];
+        cb.readBytes(opaqueNodeAttribute);
+
+        return BgpAttrOpaqueNode.of(opaqueNodeAttribute);
+    }
+
+    /**
+     * Returns opaque node attribute.
+     *
+     * @return LS node attribute value
+     */
+    public byte[] attrOpaqueNode() {
+        return opaqueNodeAttribute;
+    }
+
+    @Override
+    public short getType() {
+        return ATTRNODE_OPAQUEDATA;
+    }
+
+    @Override
+    public int hashCode() {
+        return Arrays.hashCode(opaqueNodeAttribute);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof BgpAttrOpaqueNode) {
+            BgpAttrOpaqueNode other = (BgpAttrOpaqueNode) obj;
+            return Arrays
+                    .equals(opaqueNodeAttribute, other.opaqueNodeAttribute);
+        }
+        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()).omitNullValues()
+                .add("opaqueNodeAttribute", opaqueNodeAttribute).toString();
+    }
+
+}
