diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDestinationPortNum.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDestinationPortNum.java
index b9020c8..3ad87a3 100755
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDestinationPortNum.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDestinationPortNum.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.bgpio.types;
 
+import java.util.LinkedList;
 import java.util.Objects;
 import java.util.List;
 import org.jboss.netty.buffer.ChannelBuffer;
@@ -78,12 +79,34 @@
      * Reads the channel buffer and returns object.
      *
      * @param cb channelBuffer
-     * @param type address type
      * @return object of flow spec destination port number
      * @throws BgpParseException while parsing BgpFsDestinationPortNum
      */
-    public static BgpFsDestinationPortNum read(ChannelBuffer cb, short type) throws BgpParseException {
-        return null;
+    public static BgpFsDestinationPortNum read(ChannelBuffer cb) throws BgpParseException {
+        List<BgpFsOperatorValue> operatorValue = new LinkedList<>();
+        byte option;
+        short port;
+
+        /*
+        0   1   2   3   4   5   6   7
+        +---+---+---+---+---+---+---+----+
+        | e | a |   len  | 0 |lt |gt |eq |
+        +---+---+---+---+---+---+---+----+
+        */
+
+        do {
+            option = (byte) cb.readByte();
+            int len = (option & Constants.BGP_FLOW_SPEC_LEN_MASK) >> 4;
+            if ((1 << len) == 1) {
+                port = cb.readByte();
+                operatorValue.add(new BgpFsOperatorValue(option, new byte[] {(byte) port}));
+            } else {
+                port = cb.readShort();
+                operatorValue.add(new BgpFsOperatorValue(option, new byte[] {(byte) (port >> 8), (byte) port}));
+            }
+        } while ((option & Constants.BGP_FLOW_SPEC_END_OF_LIST_MASK) == 0);
+
+        return new BgpFsDestinationPortNum(operatorValue);
     }
 
     @Override
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDestinationPrefix.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDestinationPrefix.java
index 63a6898..6a6a28b 100755
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDestinationPrefix.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDestinationPrefix.java
@@ -22,6 +22,8 @@
 import org.onlab.packet.IpPrefix;
 import org.onosproject.bgpio.exceptions.BgpParseException;
 import org.onosproject.bgpio.util.Constants;
+import org.onosproject.bgpio.util.Validation;
+
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 
@@ -33,6 +35,7 @@
     public static final byte FLOW_SPEC_TYPE = Constants.BGP_FLOWSPEC_DST_PREFIX;
     private byte length;
     private IpPrefix ipPrefix;
+    public static final int BYTE_IN_BITS = 8;
 
     /**
      * Constructor to initialize parameters.
@@ -89,12 +92,32 @@
      * Reads the channel buffer and returns object of IPv4AddressTlv.
      *
      * @param cb channelBuffer
-     * @param type address type
      * @return object of flow spec destination prefix
      * @throws BgpParseException while parsing BgpFsDestinationPrefix
      */
-    public static BgpFsDestinationPrefix read(ChannelBuffer cb, short type) throws BgpParseException {
-        return null;
+    public static BgpFsDestinationPrefix read(ChannelBuffer cb) throws BgpParseException {
+        IpPrefix ipPrefix;
+
+        int length = cb.readByte();
+        if (length == 0) {
+            byte[] prefix = new byte[] {0};
+            ipPrefix = Validation.bytesToPrefix(prefix, length);
+            return new BgpFsDestinationPrefix((byte) ipPrefix.prefixLength(), ipPrefix);
+        }
+        int len = length / BYTE_IN_BITS;
+        int reminder = length % BYTE_IN_BITS;
+        if (reminder > 0) {
+            len = len + 1;
+        }
+        if (cb.readableBytes() < len) {
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                    BgpErrorType.MALFORMED_ATTRIBUTE_LIST, cb.readableBytes());
+        }
+        byte[] prefix = new byte[len];
+        cb.readBytes(prefix, 0, len);
+        ipPrefix = Validation.bytesToPrefix(prefix, length);
+
+        return new BgpFsDestinationPrefix((byte) ipPrefix.prefixLength(), ipPrefix);
     }
 
     /**
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDscpValue.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDscpValue.java
index e383399..6165a50 100755
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDscpValue.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsDscpValue.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.bgpio.types;
 
+import java.util.LinkedList;
 import java.util.Objects;
 import java.util.List;
 import org.jboss.netty.buffer.ChannelBuffer;
@@ -79,12 +80,20 @@
      * Reads the channel buffer and returns object.
      *
      * @param cb channelBuffer
-     * @param type address type
      * @return object of flow spec DSCP value
      * @throws BgpParseException while parsing BgpFsDscpValue
      */
-    public static BgpFsDscpValue read(ChannelBuffer cb, short type) throws BgpParseException {
-        return null;
+    public static BgpFsDscpValue read(ChannelBuffer cb) throws BgpParseException {
+        List<BgpFsOperatorValue> operatorValue = new LinkedList<>();
+        byte option;
+        byte dscpValue;
+
+        do {
+            option = (byte) cb.readByte();
+            dscpValue = cb.readByte();
+            operatorValue.add(new BgpFsOperatorValue(option, new byte[] {(byte) dscpValue}));
+        } while ((option & Constants.BGP_FLOW_SPEC_END_OF_LIST_MASK) == 0);
+        return new BgpFsDscpValue(operatorValue);
     }
 
     @Override
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsFragment.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsFragment.java
index 4c6bf79..933b7db 100755
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsFragment.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsFragment.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.bgpio.types;
 
+import java.util.LinkedList;
 import java.util.Objects;
 import java.util.List;
 import org.jboss.netty.buffer.ChannelBuffer;
@@ -79,12 +80,21 @@
      * Reads the channel buffer and returns object.
      *
      * @param cb channelBuffer
-     * @param type address type
      * @return object of flow spec fragment
      * @throws BgpParseException while parsing BgpFsFragment
      */
-    public static BgpFsFragment read(ChannelBuffer cb, short type) throws BgpParseException {
-        return null;
+    public static BgpFsFragment read(ChannelBuffer cb) throws BgpParseException {
+        List<BgpFsOperatorValue> operatorValue = new LinkedList<>();
+        byte option;
+        byte fragment;
+
+        do {
+            option = (byte) cb.readByte();
+            fragment = cb.readByte();
+            operatorValue.add(new BgpFsOperatorValue(option, new byte[] {(byte) fragment}));
+        } while ((option & Constants.BGP_FLOW_SPEC_END_OF_LIST_MASK) == 0);
+
+        return new BgpFsFragment(operatorValue);
     }
 
     @Override
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsIcmpCode.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsIcmpCode.java
index 7ae2501..dadc9a1 100755
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsIcmpCode.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsIcmpCode.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.bgpio.types;
 
+import java.util.LinkedList;
 import java.util.Objects;
 
 import org.jboss.netty.buffer.ChannelBuffer;
@@ -79,12 +80,21 @@
      * Reads the channel buffer and returns object.
      *
      * @param cb channelBuffer
-     * @param type address type
      * @return object of flow spec ICMP code
      * @throws BgpParseException while parsing BgpFsIcmpCode
      */
-    public static BgpFsIcmpCode read(ChannelBuffer cb, short type) throws BgpParseException {
-        return null;
+    public static BgpFsIcmpCode read(ChannelBuffer cb) throws BgpParseException {
+        List<BgpFsOperatorValue> operatorValue = new LinkedList<>();
+        byte option;
+        byte icmpCode;
+
+        do {
+            option = (byte) cb.readByte();
+            icmpCode = cb.readByte();
+            operatorValue.add(new BgpFsOperatorValue(option, new byte[] {(byte) icmpCode}));
+        } while ((option & Constants.BGP_FLOW_SPEC_END_OF_LIST_MASK) == 0);
+
+        return new BgpFsIcmpCode(operatorValue);
     }
 
     @Override
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsIcmpType.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsIcmpType.java
index d3d0329..22682b9 100755
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsIcmpType.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsIcmpType.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.bgpio.types;
 
+import java.util.LinkedList;
 import java.util.Objects;
 
 import org.jboss.netty.buffer.ChannelBuffer;
@@ -78,12 +79,21 @@
      * Reads the channel buffer and returns object.
      *
      * @param cb channelBuffer
-     * @param type address type
      * @return object of flow spec ICMP type
      * @throws BgpParseException while parsing BgpFsIcmpType
      */
-    public static BgpFsIcmpType read(ChannelBuffer cb, short type) throws BgpParseException {
-        return null;
+    public static BgpFsIcmpType read(ChannelBuffer cb) throws BgpParseException {
+        List<BgpFsOperatorValue> operatorValue = new LinkedList<>();
+        byte option;
+        byte icmpType;
+
+        do {
+            option = (byte) cb.readByte();
+            icmpType = cb.readByte();
+            operatorValue.add(new BgpFsOperatorValue(option, new byte[] {(byte) icmpType}));
+        } while ((option & Constants.BGP_FLOW_SPEC_END_OF_LIST_MASK) == 0);
+
+        return new BgpFsIcmpType(operatorValue);
     }
 
     @Override
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsIpProtocol.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsIpProtocol.java
index 725d4ad..6da7e54 100755
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsIpProtocol.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsIpProtocol.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.bgpio.types;
 
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Objects;
 
@@ -89,12 +90,21 @@
      * Reads the channel buffer and returns object.
      *
      * @param cb channelBuffer
-     * @param type address type
      * @return object of flow spec IP protocol
      * @throws BgpParseException while parsing BgpFsIpProtocol
      */
-    public static BgpFsIpProtocol read(ChannelBuffer cb, short type) throws BgpParseException {
-        return null;
+    public static BgpFsIpProtocol read(ChannelBuffer cb) throws BgpParseException {
+        List<BgpFsOperatorValue> operatorValue = new LinkedList<>();
+        byte option;
+        byte proto;
+
+        do {
+            option = (byte) cb.readByte();
+            proto = cb.readByte();
+            operatorValue.add(new BgpFsOperatorValue(option, new byte[] {(byte) proto}));
+        } while ((option & Constants.BGP_FLOW_SPEC_END_OF_LIST_MASK) == 0);
+
+        return new BgpFsIpProtocol(operatorValue);
     }
 
     @Override
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsPacketLength.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsPacketLength.java
index 5e2a83b..215da13 100755
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsPacketLength.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsPacketLength.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.bgpio.types;
 
+import java.util.LinkedList;
 import java.util.Objects;
 import java.util.List;
 import org.jboss.netty.buffer.ChannelBuffer;
@@ -79,12 +80,28 @@
      * Reads the channel buffer and returns object.
      *
      * @param cb channelBuffer
-     * @param type address type
      * @return object of flow spec packet length
      * @throws BgpParseException while parsing BgpFsPacketLength
      */
-    public static BgpFsPacketLength read(ChannelBuffer cb, short type) throws BgpParseException {
-        return null;
+    public static BgpFsPacketLength read(ChannelBuffer cb) throws BgpParseException {
+        List<BgpFsOperatorValue> operatorValue = new LinkedList<>();
+        byte option;
+        short packetLen;
+
+        do {
+            option = (byte) cb.readByte();
+            int len = (option & Constants.BGP_FLOW_SPEC_LEN_MASK) >> 4;
+            if ((1 << len) == 1) {
+                packetLen = cb.readByte();
+                operatorValue.add(new BgpFsOperatorValue(option, new byte[] {(byte) packetLen}));
+            } else {
+                packetLen = cb.readShort();
+                operatorValue.add(new BgpFsOperatorValue(option,
+                                  new byte[] {(byte) (packetLen >> 8), (byte) packetLen}));
+            }
+        } while ((option & Constants.BGP_FLOW_SPEC_END_OF_LIST_MASK) == 0);
+
+        return new BgpFsPacketLength(operatorValue);
     }
 
     @Override
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsPortNum.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsPortNum.java
index 95872523..9aef15e 100755
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsPortNum.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsPortNum.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.bgpio.types;
 
+import java.util.LinkedList;
 import java.util.Objects;
 import java.util.List;
 import org.jboss.netty.buffer.ChannelBuffer;
@@ -78,12 +79,29 @@
      * Reads the channel buffer and returns object.
      *
      * @param cb channelBuffer
-     * @param type address type
      * @return object of flow spec port number
      * @throws BgpParseException while parsing BgpFsPortNum
      */
-    public static BgpFsPortNum read(ChannelBuffer cb, short type) throws BgpParseException {
-        return null;
+    public static BgpFsPortNum read(ChannelBuffer cb) throws BgpParseException {
+        List<BgpFsOperatorValue> operatorValue = new LinkedList<>();
+        byte option;
+        short port;
+
+        do {
+            option = (byte) cb.readByte();
+            int len = (option & Constants.BGP_FLOW_SPEC_LEN_MASK) >> 4;
+            if ((1 << len) == 1) {
+                port = cb.readByte();
+                operatorValue.add(new BgpFsOperatorValue(option, new byte[] {(byte) port}));
+            } else {
+                port = cb.readShort();
+                operatorValue.add(new BgpFsOperatorValue(option, new byte[] {(byte) (port >> 8), (byte) port}));
+            }
+
+
+        } while ((option & Constants.BGP_FLOW_SPEC_END_OF_LIST_MASK) == 0);
+
+        return new BgpFsPortNum(operatorValue);
     }
 
     @Override
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsSourcePortNum.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsSourcePortNum.java
index 52f3f3c..25ea179 100755
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsSourcePortNum.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsSourcePortNum.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.bgpio.types;
 
+import java.util.LinkedList;
 import java.util.Objects;
 import java.util.List;
 import org.jboss.netty.buffer.ChannelBuffer;
@@ -79,12 +80,27 @@
      * Reads the channel buffer and returns object.
      *
      * @param cb channelBuffer
-     * @param type address type
      * @return object of flow spec source port number
      * @throws BgpParseException while parsing BgpFsSourcePortNum
      */
-    public static BgpFsSourcePortNum read(ChannelBuffer cb, short type) throws BgpParseException {
-        return null;
+    public static BgpFsSourcePortNum read(ChannelBuffer cb) throws BgpParseException {
+        List<BgpFsOperatorValue> operatorValue = new LinkedList<>();
+        byte option;
+        short port;
+
+        do {
+            option = (byte) cb.readByte();
+            int len = (option & Constants.BGP_FLOW_SPEC_LEN_MASK) >> 4;
+            if ((1 << len) == 1) {
+                port = cb.readByte();
+                operatorValue.add(new BgpFsOperatorValue(option, new byte[] {(byte) port}));
+            } else {
+                port = cb.readShort();
+                operatorValue.add(new BgpFsOperatorValue(option, new byte[] {(byte) (port >> 8), (byte) port}));
+            }
+        } while ((option & Constants.BGP_FLOW_SPEC_END_OF_LIST_MASK) == 0);
+
+        return new BgpFsSourcePortNum(operatorValue);
     }
 
     @Override
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsSourcePrefix.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsSourcePrefix.java
index 5b75684..babf71f 100755
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsSourcePrefix.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsSourcePrefix.java
@@ -22,6 +22,7 @@
 import org.onlab.packet.IpPrefix;
 import org.onosproject.bgpio.exceptions.BgpParseException;
 import org.onosproject.bgpio.util.Constants;
+import org.onosproject.bgpio.util.Validation;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
@@ -34,7 +35,7 @@
     public static final byte FLOW_SPEC_TYPE = Constants.BGP_FLOWSPEC_SRC_PREFIX;
     private byte length;
     private IpPrefix ipPrefix;
-
+    public static final int BYTE_IN_BITS = 8;
     /**
      * Constructor to initialize parameters.
      *
@@ -90,12 +91,33 @@
      * Reads the channel buffer and returns object of IPv4AddressTlv.
      *
      * @param cb channelBuffer
-     * @param type address type
      * @return object of flow spec source prefix
      * @throws BgpParseException while parsing BgpFsSourcePrefix
      */
-    public static BgpFsSourcePrefix read(ChannelBuffer cb, short type) throws BgpParseException {
-        return null;
+    public static BgpFsSourcePrefix read(ChannelBuffer cb) throws BgpParseException {
+        IpPrefix ipPrefix;
+
+        int length = cb.readByte();
+        if (length == 0) {
+            byte[] prefix = new byte[] {0};
+            ipPrefix = Validation.bytesToPrefix(prefix, length);
+            return new BgpFsSourcePrefix((byte) ipPrefix.prefixLength(), ipPrefix);
+        }
+
+        int len = length / BYTE_IN_BITS;
+        int reminder = length % BYTE_IN_BITS;
+        if (reminder > 0) {
+            len = len + 1;
+        }
+        if (cb.readableBytes() < len) {
+            Validation.validateLen(BgpErrorType.UPDATE_MESSAGE_ERROR,
+                    BgpErrorType.MALFORMED_ATTRIBUTE_LIST, cb.readableBytes());
+        }
+        byte[] prefix = new byte[len];
+        cb.readBytes(prefix, 0, len);
+        ipPrefix = Validation.bytesToPrefix(prefix, length);
+
+        return new BgpFsSourcePrefix((byte) ipPrefix.prefixLength(), ipPrefix);
     }
 
     /**
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsTcpFlags.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsTcpFlags.java
index fef2d3f..7af2350 100755
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsTcpFlags.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/BgpFsTcpFlags.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.bgpio.types;
 
+import java.util.LinkedList;
 import java.util.Objects;
 import java.util.List;
 import org.jboss.netty.buffer.ChannelBuffer;
@@ -78,12 +79,28 @@
      * Reads the channel buffer and returns object.
      *
      * @param cb channelBuffer
-     * @param type address type
      * @return object of flow spec TCP flags
      * @throws BgpParseException while parsing BgpFsTcpFlags
      */
-    public static BgpFsTcpFlags read(ChannelBuffer cb, short type) throws BgpParseException {
-        return null;
+    public static BgpFsTcpFlags read(ChannelBuffer cb) throws BgpParseException {
+        List<BgpFsOperatorValue> operatorValue = new LinkedList<>();
+        byte option;
+        short tcpFlag;
+
+        do {
+            option = (byte) cb.readByte();
+            int len = (option & Constants.BGP_FLOW_SPEC_LEN_MASK) >> 4;
+            if ((1 << len) == 1) {
+                tcpFlag = cb.readByte();
+                operatorValue.add(new BgpFsOperatorValue(option, new byte[] {(byte) tcpFlag}));
+            } else {
+                tcpFlag = cb.readShort();
+                operatorValue.add(new BgpFsOperatorValue(option, new byte[] {(byte) (tcpFlag >> 8), (byte) tcpFlag}));
+            }
+
+        } while ((option & Constants.BGP_FLOW_SPEC_END_OF_LIST_MASK) == 0);
+
+        return new BgpFsTcpFlags(operatorValue);
     }
 
     @Override
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/NextHop.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/NextHop.java
index 806efe5..7e65dc0 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/NextHop.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/types/NextHop.java
@@ -32,7 +32,7 @@
  */
 public class NextHop implements BgpValueType {
     public static final byte NEXTHOP_TYPE = 3;
-
+    public static final byte FLAGS = (byte) 0x40;
     private boolean isNextHop = false;
     private Ip4Address nextHop;
 
@@ -47,6 +47,14 @@
     }
 
     /**
+     * Constructor to initialize default parameters.
+     *
+     */
+    public NextHop() {
+        this.nextHop = null;
+    }
+
+    /**
      * Returns whether next hop is present.
      *
      * @return whether next hop is present
@@ -103,8 +111,16 @@
 
     @Override
     public int write(ChannelBuffer cb) {
-        //Not required to be implemented now
-        return 0;
+        int iLenStartIndex = cb.writerIndex();
+        cb.writeByte(FLAGS);
+        cb.writeByte(getType());
+        if (!isNextHopSet()) {
+            cb.writeByte(0);
+        } else {
+            cb.writeInt(nextHop.toInt());
+        }
+
+        return cb.writerIndex() - iLenStartIndex;
     }
 
     @Override
diff --git a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/util/Constants.java b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/util/Constants.java
index 8d68742..e904313 100644
--- a/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/util/Constants.java
+++ b/protocols/bgp/bgpio/src/main/java/org/onosproject/bgpio/util/Constants.java
@@ -68,4 +68,6 @@
     public static final short BGP_FLOWSPEC_ACTION_TRAFFIC_REDIRECT = (short) 0x8008;
     public static final short BGP_FLOWSPEC_ACTION_TRAFFIC_MARKING = (short) 0x8009;
 
+    public static final byte BGP_FLOW_SPEC_LEN_MASK = 0x30;
+    public static final byte BGP_FLOW_SPEC_END_OF_LIST_MASK = (byte) 0x80;
 }
\ No newline at end of file
