diff --git a/protocols/bgp/ctl/src/test/java/org/onosproject/bgp/BgpPeerChannelHandlerTest.java b/protocols/bgp/ctl/src/test/java/org/onosproject/bgp/BgpPeerChannelHandlerTest.java
old mode 100755
new mode 100644
index 26ed36d..ac8206f
--- a/protocols/bgp/ctl/src/test/java/org/onosproject/bgp/BgpPeerChannelHandlerTest.java
+++ b/protocols/bgp/ctl/src/test/java/org/onosproject/bgp/BgpPeerChannelHandlerTest.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.bgp;
 
+import java.net.InetSocketAddress;
 import java.util.LinkedList;
 import java.util.concurrent.TimeUnit;
 
@@ -27,8 +28,11 @@
 import org.onosproject.bgpio.protocol.ver4.BgpOpenMsgVer4;
 import org.onosproject.bgpio.types.BgpHeader;
 import org.onosproject.bgpio.types.BgpValueType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class BgpPeerChannelHandlerTest extends SimpleChannelHandler {
+    protected static final Logger log = LoggerFactory.getLogger(BgpPeerChannelHandlerTest.class);
     public static final int OPEN_MSG_MINIMUM_LENGTH = 29;
     public static final byte[] MARKER = new byte[] {(byte) 0xff, (byte) 0xff,
         (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
@@ -76,6 +80,306 @@
         savedCtx.getChannel().close();
     }
 
+    /**
+     * Select update message buffer with VPN.
+     *
+     * @param select number to select update message buffer
+     * @return packet dump in byte array
+     */
+    byte[] selectUpdateMessageVpn(int select) {
+        switch (select) {
+        case 5:
+            /**
+             * Node NLRI with VPN - MpReach.
+             */
+            byte[] updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, 0x5E, 0x02, 0x00, 0x00, //withdrawn len
+                    0x00, 0x47, //path attribute len
+                    0x04, 0x01, 0x01, 0x02, //origin
+                    0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
+                    (byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
+                    (byte) 0x80, 0x0e, 0x32, 0x40, 0x04, (byte) 0x80, //mpreach with safi = 80 vpn
+                    0x04, 0x04, 0x00, 0x00, 0x01, //nexthop
+                    0x00, //reserved
+                    0x00, 0x01, 0x00, 0x25, //type ND LEN
+                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
+                    0x02,
+                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                    0x01, 0x00, 0x00, 0x10,
+                    0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02}; //node nlri
+        return updateMsg;
+        case 6:
+            /**
+             * Node NLRI MpReach and MpUnReach different with same VPN.
+             */
+            updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, (byte) 0x8D, 0x02, 0x00, 0x00, //withdrawn len
+                    0x00, 0x76, //path attribute len
+                    0x04, 0x01, 0x01, 0x02, //origin
+                    0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
+                    (byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
+                    (byte) 0x80, 0x0e, 0x32, 0x40, 0x04, (byte) 0x80, //mpreach with safi = 80 vpn
+                    0x04, 0x04, 0x00, 0x00, 0x01, //nexthop
+                    0x00, //reserved
+                    0x00, 0x01, 0x00, 0x25, //type ND LEN
+                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
+                    0x02,
+                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                    0x01, 0x00, 0x00, 0x10,
+                    0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, (byte) 0xae,
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //node nlri
+                    (byte) 0x80, 0x0f, 0x2C,  0x40, 0x04, (byte) 0x80, //mpUnreach with safi = 80 VPN
+                    0x00, 0x01, 0x00, 0x25, //type n len
+                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
+                    0x02,
+                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                    0x01, 0x00, 0x00, 0x10,
+                    0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, (byte) 0xae, //AutonomousSystemTlv
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02}; //BGPLSIdentifierTlv
+            return updateMsg;
+        case 7:
+            /**
+             * Node NLRI with same MpReach and MpUnReach with VPN.
+             */
+            updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, (byte) 0x8D, 0x02, 0x00, 0x00, //withdrawn len
+                    0x00, 0x76, //path attribute len
+                    0x04, 0x01, 0x01, 0x02, //origin
+                    0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
+                    (byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
+                    (byte) 0x80, 0x0e, 0x32, 0x40, 0x04, (byte) 0x80, //mpreach with safi = 80 vpn
+                    0x04, 0x04, 0x00, 0x00, 0x01, //nexthop
+                    0x00, //reserved
+                    0x00, 0x01, 0x00, 0x25, //type ND LEN
+                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
+                    0x02,
+                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                    0x01, 0x00, 0x00, 0x10,
+                    0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //node nlri
+                    (byte) 0x80, 0x0f, 0x2C,  0x40, 0x04, (byte) 0x80, //mpUnreach with safi = 80 VPN
+                    0x00, 0x01, 0x00, 0x25, //type n len
+                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
+                    0x02,
+                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                    0x01, 0x00, 0x00, 0x10,
+                    0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae, //AutonomousSystemTlv
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02}; //BGPLSIdentifierTlv
+            return updateMsg;
+        case 17:
+            /**
+             * Node NLRI with VPN - MpReach.
+             */
+            updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, 0x5E, 0x02, 0x00, 0x00, //withdrawn len
+                    0x00, 0x47, //path attribute len
+                    0x04, 0x01, 0x01, 0x02, //origin
+                    0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
+                    (byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
+                    (byte) 0x80, 0x0e, 0x32, 0x40, 0x04, (byte) 0x80, //mpreach with safi = 80 vpn
+                    0x04, 0x04, 0x00, 0x00, 0x01, //nexthop
+                    0x00, //reserved
+                    0x00, 0x01, 0x00, 0x25, //type ND LEN
+                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A,
+                    0x02,
+                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                    0x01, 0x00, 0x00, 0x10,
+                    0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02}; //node nlri
+        return updateMsg;
+        default: return null;
+        }
+    }
+
+    /**
+     * Select update message buffer without VPN.
+     *
+     * @param select number to select update message buffer
+     * @return packet dump in byte array
+     */
+    byte[] selectUpdateMsg(int select) {
+        switch (select) {
+        case 1:
+            /**
+             * Node NLRI - MpReach.
+             */
+            byte[] updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, 0x56, 0x02, 0x00, 0x00, //withdrawn len
+                    0x00, 0x3F, 0x04, 0x01, 0x01, 0x02, //origin
+                    0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
+                    (byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
+                    (byte) 0x80, 0x0e, 0x2A, 0x40, 0x04, 0x47, //mpreach with safi = 71
+                    0x04, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x1D, 0x02,
+                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x10,
+                    0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02}; //node nlri
+            return updateMsg;
+        case 2:
+            /**
+             * Node NLRI with same MpReach and MpUnReach.
+             */
+            updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, (byte) 0x7D, 0x02, 0x00, 0x00, //withdrawn len
+                    0x00, 0x66, 0x04, 0x01, 0x01, 0x02, 0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9,
+                    (byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
+                    (byte) 0x80, 0x0e, 0x2A, 0x40, 0x04, 0x47, //mpreach with safi = 71
+                    0x04, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x1D, //type n len
+                    0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                    0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //BGPLSIdentifierTlv
+                    (byte) 0x80, 0x0f, 0x24,  0x40, 0x04, 0x47, //mpUnreach with safi = 71
+                    0x00, 0x01, 0x00, 0x1D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                    0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //BGPLSIdentifierTlv
+                    };
+            return updateMsg;
+        case 3:
+            /**
+             * Link NLRI - MpReach.
+             */
+            updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, (byte) 0x8B, 0x02, 0x00, 0x04,
+                    0x18, 0x0a, 0x01, 0x01, 0x00, 0x70, //path attribute len
+                    0x04, 0x01, 0x01, 0x00, 0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
+                    (byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x10, //med
+                    (byte) 0x80, 0x0e, 0x5B, 0x40, 0x04, 0x47, //mpreach safi 71
+                    0x04, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x4E, 0x02,
+                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1b, //local node
+                    0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, (byte) 0xae,
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02,
+                    0x02, 0x03, 0x00, 0x07, 0x19, 0x00, (byte) 0x95, 0x02, 0x50, 0x21, 0x03,
+                    0x01, 0x01, 0x00, 0x1a, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, (byte) 0xae,
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02,
+                    0x02, 0x03, 0x00, 0x06, 0x19, 0x00, (byte) 0x95, 0x02, 0x50, 0x21, //link nlri
+                    0x01, 0x03, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02
+            };
+            return updateMsg;
+        case 4:
+            /**
+             * Prefix NLRI - MpReach.
+             */
+            updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, (byte) 0xd6, 0x02, 0x00, 0x04,
+                    0x18, 0x0a, 0x01, 0x01, 0x00, (byte) 0xbb, //path attribute len
+                    0x04, 0x01, 0x01, 0x00, 0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
+                    (byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x12, //med
+                    (byte) 0x90, 0x0e, 0x00, (byte) 0xa5, 0x40, 0x04, 0x47, //mpreach
+                    0x04, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x00, 0x30,
+                    0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1a, //local node
+                    0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, (byte) 0xae,
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x00, 0x06, 0x19, 0x21, 0x68, 0x07,
+                    0x70, 0x01, 0x01, 0x09, 0x00, 0x05, 0x20, (byte) 0xc0, (byte) 0xa8, 0x4d, 0x01, //prefix des
+                    0x00, 0x03, 0x00, 0x30, 0x02,
+                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x1a,
+                    0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, (byte) 0xae,
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02,
+                    0x02, 0x03, 0x00, 0x06, 0x19, 0x00, (byte) 0x95, 0x02, 0x50, 0x21,
+                    0x01, 0x09, 0x00, 0x05, 0x20, 0x15, 0x15, 0x15, 0x15, 0x00, 0x03, 0x00, 0x30,
+                    0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                    0x01, 0x00, 0x00, 0x1a, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, (byte) 0xae,
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02,
+                    0x02, 0x03, 0x00, 0x06, 0x02, 0x20, 0x22, 0x02, 0x20, 0x22,
+                    0x01, 0x09, 0x00, 0x05, 0x20, 0x16, 0x16, 0x16, 0x16}; // prefix nlri
+        return updateMsg;
+        case 8:
+            /**
+             * Node NLRI with different MpReach and MpUnReach with IsIsPseudonode.
+             */
+                        updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                                (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                                (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00,
+                                (byte) 0x91, 0x02, 0x00, 0x00, 0x00, 0x7A, //path attribute len
+                                0x04, 0x01, 0x01, 0x02, 0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9,
+                                (byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
+                                (byte) 0x80, 0x0e, 0x34, 0x40, 0x04, 0x47, //mpreach with safi = 71
+                                0x04, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00,
+                                0x27, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                                0x01, 0x00, 0x00, 0x1a, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, (byte) 0xae,
+                                0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03,
+                                0x00, 0x06, 0x19, 0x00, (byte) 0x95, 0x01, (byte) 0x90, 0x58,
+                                (byte) 0x80, 0x0f, 0x2E,  0x40, 0x04, 0x47, 0x00, 0x01, 0x00, 0x27, //mpUnreach
+                                0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                                0x01, 0x00, 0x00, 0x1a, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
+                                0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //BGPLSIdentifierTlv
+                                0x02, 0x03, 0x00, 0x06, 0x19, 0x00, (byte) 0x99, 0x01, (byte) 0x99, 0x58};
+                        return updateMsg;
+        case 9:
+            /**
+             * Node NLRI with same MpReach and MpUnReach.
+             */
+            updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, (byte) 0x7D, 0x02, 0x00, 0x00, //withdrawn len
+                    0x00, 0x66, 0x04, 0x01, 0x01, 0x02, //origin
+                    0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
+                    (byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
+                    (byte) 0x80, 0x0e, 0x2A, 0x40, 0x04, 0x47, //mpreach with safi = 71
+                    0x04, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x1D, //type n len
+                    0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                    0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //BGPLSIdentifierTlv
+                    (byte) 0x80, 0x0f, 0x24,  0x40, 0x04, 0x47, //mpUnreach with safi = 71
+                    0x00, 0x01, 0x00, 0x1D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                    0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //BGPLSIdentifierTlv
+                    };
+            return updateMsg;
+        case 10:
+            /**
+             * Node NLRI with different MpReach and MpUnReach.
+             */
+            updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, (byte) 0x7D, 0x02, 0x00, 0x00, //withdrawn len
+                    0x00, 0x66, 0x04, 0x01, 0x01, 0x02, //origin
+                    0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
+                    (byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
+                    (byte) 0x80, 0x0e, 0x2A, 0x40, 0x04, 0x47, //mpreach with safi = 71
+                    0x04, 0x04, 0x00, 0x00, 0x01, 0x00, //reserved
+                    0x00, 0x01, 0x00, 0x1D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                    0x01, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //BGPLSIdentifierTlv
+                    (byte) 0x80, 0x0f, 0x24,  0x40, 0x04, 0x47, //mpUnreach with safi = 71
+                    0x00, 0x01, 0x00, 0x1D, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                    0x01, 0x00, 0x00, 0x10,  0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, (byte) 0xae,
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //BGPLSIdentifierTlv
+                    };
+            return updateMsg;
+        case 12:
+            /**
+             * Node NLRI with same MpReach and MpUnReach with IsIsPseudonode.
+             */
+          updateMsg = new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff,
+                    (byte) 0xff, (byte) 0xff, (byte) 0xff, 0x00, (byte) 0x91, 0x02, 0x00, 0x00, //withdrawn len
+                    0x00, 0x7A, 0x04, 0x01, 0x01, 0x02, //origin
+                    0x40, 0x02, 0x04, 0x02, 0x01, (byte) 0xfd, (byte) 0xe9, //as_path
+                    (byte) 0x80, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, //med
+                    (byte) 0x80, 0x0e, 0x34, 0x40, 0x04, 0x47, //mpreach with safi = 71
+                    0x04, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x27, //type n len
+                    0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                    0x01, 0x00, 0x00, 0x1a, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae,
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //BGPLSIdentifierTlv
+                    0x02, 0x03, 0x00, 0x06, 0x19, 0x00, (byte) 0x99, 0x01, (byte) 0x99, 0x58,
+                    (byte) 0x80, 0x0f, 0x2E,  0x40, 0x04, 0x47, //mpUnreach with safi = 71
+                    0x00, 0x01, 0x00, 0x27, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                    0x01, 0x00, 0x00, 0x1a, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x09, (byte) 0xae, //AutonomousSystemTlv
+                    0x02, 0x01, 0x00, 0x04, 0x02, 0x02, 0x02, 0x02, //BGPLSIdentifierTlv
+                    0x02, 0x03, 0x00, 0x06, 0x19, 0x00, (byte) 0x99, 0x01, (byte) 0x99, 0x58};
+          return updateMsg;
+      default:        return null;
+        }
+    }
+
     @Override
     public void channelConnected(ChannelHandlerContext ctx,
                                  ChannelStateEvent channelEvent) throws InterruptedException {
@@ -97,6 +401,116 @@
         ChannelBuffer buffer1 = ChannelBuffers.dynamicBuffer();
         keepaliveMsg.writeTo(buffer1);
         ctx.getChannel().write(buffer1);
+
+        if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.1", 0).getAddress())) {
+            return;
+        } else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.9", 0).getAddress())) {
+            ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
+            bufferUp.writeBytes(selectUpdateMsg(1));
+            ctx.getChannel().write(bufferUp);
+        } else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.33", 0).getAddress())) {
+            ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
+            bufferUp.writeBytes(selectUpdateMsg(2));
+            ctx.getChannel().write(bufferUp);
+        } else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.10", 0).getAddress())) {
+            ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
+            bufferUp.writeBytes(selectUpdateMsg(3));
+            ctx.getChannel().write(bufferUp);
+        } else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.20", 0).getAddress())) {
+
+            ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
+            bufferUp.writeBytes(selectUpdateMsg(4));
+            ctx.getChannel().write(bufferUp);
+        } else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.30", 0).getAddress())) {
+
+            ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
+            bufferUp.writeBytes(selectUpdateMessageVpn(5));
+            ctx.getChannel().write(bufferUp);
+        } else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.40", 0).getAddress())) {
+
+            ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
+            bufferUp.writeBytes(selectUpdateMessageVpn(6));
+            ctx.getChannel().write(bufferUp);
+        } else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.50", 0).getAddress())) {
+
+            ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
+            bufferUp.writeBytes(selectUpdateMessageVpn(7));
+            ctx.getChannel().write(bufferUp);
+        } else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.60", 0).getAddress())) {
+
+            ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
+            bufferUp.writeBytes(selectUpdateMsg(8));
+            ctx.getChannel().write(bufferUp);
+        } else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.70", 0).getAddress())) {
+
+            ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
+            bufferUp.writeBytes(selectUpdateMsg(9));
+            ctx.getChannel().write(bufferUp);
+        } else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.80", 0).getAddress())) {
+
+            ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
+            bufferUp.writeBytes(selectUpdateMsg(10));
+            ctx.getChannel().write(bufferUp);
+        } else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.90", 0).getAddress())) {
+
+            ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
+            bufferUp.writeBytes(selectUpdateMsg(8));
+            ctx.getChannel().write(bufferUp);
+        } else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.92", 0).getAddress())) {
+
+            ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
+            bufferUp.writeBytes(selectUpdateMsg(12));
+            ctx.getChannel().write(bufferUp);
+        } else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.91", 0).getAddress())) {
+
+            ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
+            bufferUp.writeBytes(selectUpdateMsg(1));
+            ctx.getChannel().write(bufferUp);
+        } else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.9", 0).getAddress())) {
+
+            ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
+            bufferUp.writeBytes(selectUpdateMsg(1));
+            ctx.getChannel().write(bufferUp);
+        } else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.99", 0).getAddress())) {
+
+            ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
+            bufferUp.writeBytes(selectUpdateMsg(1));
+            ctx.getChannel().write(bufferUp);
+        } else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.94", 0).getAddress())) {
+
+            ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
+            bufferUp.writeBytes(selectUpdateMsg(1));
+            ctx.getChannel().write(bufferUp);
+        } else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.35", 0).getAddress())) {
+
+            ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
+            bufferUp.writeBytes(selectUpdateMessageVpn(17));
+            ctx.getChannel().write(bufferUp);
+        } else if (((InetSocketAddress) ctx.getChannel().getLocalAddress()).getAddress().equals(
+                new InetSocketAddress("127.0.0.95", 0).getAddress())) {
+
+            ChannelBuffer bufferUp = ChannelBuffers.dynamicBuffer();
+            bufferUp.writeBytes(selectUpdateMsg(1));
+            ctx.getChannel().write(bufferUp);
+        }
     }
 
     @Override
