diff --git a/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeFlagBitTlv.java b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeFlagBitTlv.java
new file mode 100755
index 0000000..ba02f6d
--- /dev/null
+++ b/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/attr/BgpAttrNodeFlagBitTlv.java
@@ -0,0 +1,177 @@
+/*
+ * 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 attribute node flag.
+ */
+public class BgpAttrNodeFlagBitTlv implements BGPValueType {
+
+    protected static final Logger log = LoggerFactory
+            .getLogger(BgpAttrNodeFlagBitTlv.class);
+
+    public static final int ATTRNODE_FLAGBIT = 1024;
+
+    /* Node flag bit TLV */
+    private boolean bOverloadBit;
+    private boolean bAttachedBit;
+    private boolean bExternalBit;
+    private boolean bABRBit;
+
+    public static final int BIT_SET = 1;
+    public static final int FIRST_BIT = 0x80;
+    public static final int SECOND_BIT = 0x40;
+    public static final int THIRD_BIT = 0x20;
+    public static final int FOURTH_BIT = 0x01;
+
+    /**
+     * Constructor to initialize parameters.
+     *
+     * @param bOverloadBit Overload bit
+     * @param bAttachedBit Attached bit
+     * @param bExternalBit External bit
+     * @param bABRBit ABR Bit
+     */
+    BgpAttrNodeFlagBitTlv(boolean bOverloadBit, boolean bAttachedBit,
+                          boolean bExternalBit, boolean bABRBit) {
+        this.bOverloadBit = bOverloadBit;
+        this.bAttachedBit = bAttachedBit;
+        this.bExternalBit = bExternalBit;
+        this.bABRBit = bABRBit;
+    }
+
+    /**
+     * Reads the Node Flag Bits.
+     *
+     * @param cb ChannelBuffer
+     * @return attribute node flag bit tlv
+     * @throws BGPParseException while parsing BgpAttrNodeFlagBitTlv
+     */
+    public static BgpAttrNodeFlagBitTlv read(ChannelBuffer cb)
+            throws BGPParseException {
+        boolean bOverloadBit = false;
+        boolean bAttachedBit = false;
+        boolean bExternalBit = false;
+        boolean bABRBit = false;
+
+        short lsAttrLength = cb.readShort();
+
+        if (lsAttrLength != 1) {
+            Validation.validateLen(BGPErrorType.UPDATE_MESSAGE_ERROR,
+                                   BGPErrorType.ATTRIBUTE_LENGTH_ERROR,
+                                   lsAttrLength);
+        }
+
+        byte nodeFlagBits = cb.readByte();
+
+        bOverloadBit = ((nodeFlagBits & (byte) FIRST_BIT) == FIRST_BIT);
+        bAttachedBit = ((nodeFlagBits & (byte) SECOND_BIT) == SECOND_BIT);
+        bExternalBit = ((nodeFlagBits & (byte) THIRD_BIT) == THIRD_BIT);
+        bABRBit = ((nodeFlagBits & (byte) FOURTH_BIT) == FOURTH_BIT);
+
+        return new BgpAttrNodeFlagBitTlv(bOverloadBit, bAttachedBit,
+                                         bExternalBit, bABRBit);
+    }
+
+    /**
+     * Returns Overload Bit.
+     *
+     * @return Overload Bit
+     */
+    boolean getOverLoadBit() {
+        return bOverloadBit;
+    }
+
+    /**
+     * Returns Attached Bit.
+     *
+     * @return Attached Bit
+     */
+    boolean getAttachedBit() {
+        return bAttachedBit;
+    }
+
+    /**
+     * Returns External Bit.
+     *
+     * @return External Bit
+     */
+    boolean getExternalBit() {
+        return bExternalBit;
+    }
+
+    /**
+     * Returns ABR Bit.
+     *
+     * @return ABR Bit
+     */
+    boolean getABRBit() {
+        return bABRBit;
+    }
+
+    @Override
+    public short getType() {
+        return ATTRNODE_FLAGBIT;
+    }
+
+    @Override
+    public int write(ChannelBuffer cb) {
+        // TODO will be implementing it later
+        return 0;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(bOverloadBit, bAttachedBit, bExternalBit, bABRBit);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+
+        if (obj instanceof BgpAttrNodeFlagBitTlv) {
+            BgpAttrNodeFlagBitTlv other = (BgpAttrNodeFlagBitTlv) obj;
+            return Objects.equals(bOverloadBit, other.bOverloadBit)
+                    && Objects.equals(bAttachedBit, other.bAttachedBit)
+                    && Objects.equals(bExternalBit, other.bExternalBit)
+                    && Objects.equals(bABRBit, other.bABRBit);
+        }
+        return false;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("bOverloadBit", bOverloadBit)
+                .add("bAttachedBit", bAttachedBit)
+                .add("bExternalBit", bExternalBit).add("bABRBit", bABRBit)
+                .toString();
+    }
+}
