diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepCloseMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepCloseMsgTest.java
index 33c00dd..e51b0ce 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepCloseMsgTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepCloseMsgTest.java
@@ -18,6 +18,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -30,7 +31,7 @@
      * Common header, reason to close.
      */
     @Test
-    public void closeMessageTest1() throws PcepParseException {
+    public void closeMessageTest1() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] closeMsg = new byte[] {0x20, 0x07, 0x00, 0x0C, 0x0f, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02 };
 
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepErrorMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepErrorMsgTest.java
index 234cea6..71655b5 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepErrorMsgTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepErrorMsgTest.java
@@ -19,6 +19,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -33,11 +34,11 @@
     /**
      * This test case checks for
      * PCEP-ERROR Object, OPEN Object (STATEFUL-PCE-CAPABILITY, GMPLS-CAPABILITY-TLV,
-     * PCECC-CAPABILITY-TLV, TED Capability TLV)
+     * PCECC-CAPABILITY-TLV, LS Capability TLV)
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest1() throws PcepParseException {
+    public void errorMessageTest1() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x34, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
@@ -46,7 +47,7 @@
                 0x00, 0x10, 0x00, 0x04, // STATEFUL-PCE-CAPABILITY
                 0x00, 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x04, // GMPLS-CAPABILITY-TLV
                 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, // PCECC-CAPABILITY-TLV
-                0x00, 0x00, 0x00, 0x03, 0x00, (byte) 0x84, 0x00, 0x04, // TED Capability TLV
+                0x00, 0x00, 0x00, 0x03, (byte) 0xFF, (byte) 0x00, 0x00, 0x04, // LS Capability TLV
                 0x00, 0x00, 0x00, 0x00};
 
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
@@ -72,11 +73,11 @@
     /**
      * This test case checks for
      * PCEP-ERROR Object, PCEP-ERROR Object, OPEN Object (STATEFUL-PCE-CAPABILITY, GMPLS-CAPABILITY-TLV,
-     * PCECC-CAPABILITY-TLV, TED Capability TLV)
+     * PCECC-CAPABILITY-TLV, LS Capability TLV)
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest2() throws PcepParseException {
+    public void errorMessageTest2() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x3C, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
@@ -86,7 +87,7 @@
                 0x00, 0x10, 0x00, 0x04, // STATEFUL-PCE-CAPABILITY
                 0x00, 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x04, // GMPLS-CAPABILITY-TLV
                 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, // PCECC-CAPABILITY-TLV
-                0x00, 0x00, 0x00, 0x03, 0x00, (byte) 0x84, 0x00, 0x04, // TED Capability TLV
+                0x00, 0x00, 0x00, 0x03, (byte) 0xFF, (byte) 0x00, 0x00, 0x04, // LS Capability TLV
                 0x00, 0x00, 0x00, 0x00};
 
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
@@ -115,7 +116,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest3() throws PcepParseException {
+    public void errorMessageTest3() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x34, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
@@ -152,7 +153,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest4() throws PcepParseException {
+    public void errorMessageTest4() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x2c, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
@@ -188,7 +189,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest5() throws PcepParseException {
+    public void errorMessageTest5() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x24, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
@@ -223,7 +224,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest6() throws PcepParseException {
+    public void errorMessageTest6() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x1C, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
@@ -257,7 +258,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest7() throws PcepParseException {
+    public void errorMessageTest7() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x14, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
@@ -290,7 +291,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest8() throws PcepParseException {
+    public void errorMessageTest8() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x20, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
@@ -323,7 +324,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest9() throws PcepParseException {
+    public void errorMessageTest9() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x14, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
@@ -355,7 +356,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest10() throws PcepParseException {
+    public void errorMessageTest10() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x14, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
@@ -383,15 +384,16 @@
 
     /**
      * This test case checks for
-     * TE Object, PCEP-ERROR Object
+     * LS Object, PCEP-ERROR Object
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest11() throws PcepParseException {
+    public void errorMessageTest11() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x18, // common header
-                0x65, 0x13, 0x00, 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
+        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x1C, // common header
+                (byte) 0xE0, 0x13, 0x00, 0x10, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, // LS-ID
+                0x00, 0x00, 0x00, 0x10,
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
                 0x00, 0x00, 0x01, 0x01};
 
@@ -420,7 +422,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest12() throws PcepParseException {
+    public void errorMessageTest12() throws PcepParseException, PcepOutOfBoundMessageException {
 
         //RP Object, PCEP-ERROR Object
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x18, // common header
@@ -453,7 +455,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest13() throws PcepParseException {
+    public void errorMessageTest13() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x24, // common header
                 0x02, 0x10, 0x00, 0x0C, // RP Object Header
@@ -482,17 +484,21 @@
 
     /**
      * This test case checks for
-     * TE Object, TE Object, PCEP-ERROR Object
+     * LS Object, LS Object, PCEP-ERROR Object
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest14() throws PcepParseException {
+    public void errorMessageTest14() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x24, // common header
-                0x65, 0x10, 0x00, 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x65, 0x10, 0x00, 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x11, // TE-ID
+        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x2C, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x10, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, // LS-ID
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x10,
+                (byte) 0xE0, 0x10, 0x00, 0x10, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, // LS-ID
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x11,
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
                 0x00, 0x00, 0x01, 0x01};
 
@@ -517,16 +523,19 @@
 
     /**
      * This test case checks for
-     * PCEP-ERROR Object, TE Object, PCEP-ERROR Object
+     * PCEP-ERROR Object, LS Object, PCEP-ERROR Object
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest15() throws PcepParseException {
+    public void errorMessageTest15() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x20, // common header
+        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x24, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
-                0x00, 0x00, 0x01, 0x01, 0x65, 0x10, 0x00, 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
+                0x00, 0x00, 0x01, 0x01,
+                (byte) 0xE0, 0x10, 0x00, 0x10, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, // LS-ID
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x10,
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
                 0x00, 0x00, 0x01, 0x03};
 
@@ -555,7 +564,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest16() throws PcepParseException {
+    public void errorMessageTest16() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x2C, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
@@ -585,18 +594,23 @@
 
     /**
      * This test case checks for
-     * PCEP-ERROR Object, TE Object, TE Object, PCEP-ERROR Object
+     * PCEP-ERROR Object, LS Object, LS Object, PCEP-ERROR Object
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest17() throws PcepParseException {
+    public void errorMessageTest17() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x2C, // common header
+        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x34, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
-                0x00, 0x00, 0x01, 0x01, 0x65, 0x10, 0x00, 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x65, 0x10, 0x00, 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x11, // TE-ID
+                0x00, 0x00, 0x01, 0x01,
+                (byte) 0xE0, 0x10, 0x00, 0x10, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, // LS-ID
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x10,
+                (byte) 0xE0, 0x10, 0x00, 0x10, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, // LS-ID
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x11,
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
                 0x00, 0x00, 0x01, 0x03};
 
@@ -625,7 +639,7 @@
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest18() throws PcepParseException {
+    public void errorMessageTest18() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x3C, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
@@ -657,21 +671,28 @@
 
     /**
      * This test case checks for
-     * PCEP-ERROR Object, PCEP-ERROR Object, TE Object, TE Object, PCEP-ERROR Object, PCEP-ERROR Object
+     * PCEP-ERROR Object, PCEP-ERROR Object, LS Object, LS Object, PCEP-ERROR Object, PCEP-ERROR Object
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest19() throws PcepParseException {
+    public void errorMessageTest19() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x3C, // common header
+        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x44, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
-                0x00, 0x00, 0x01, 0x01, 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
-                0x00, 0x00, 0x01, 0x03, 0x65, 0x10, 0x00, 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x65, 0x10, 0x00, 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x11, // TE-ID
+                0x00, 0x00, 0x01, 0x01,
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
-                0x00, 0x00, 0x01, 0x04, 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
+                0x00, 0x00, 0x01, 0x03,
+                (byte) 0xE0, 0x10, 0x00, 0x10, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, // LS-ID
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x10,
+                (byte) 0xE0, 0x10, 0x00, 0x10, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, // LS-ID
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x11,
+                0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
+                0x00, 0x00, 0x01, 0x04, // PCERR Object Header
+                0x0D, 0x10, 0x00, 0x08,
                 0x00, 0x00, 0x01, 0x06};
 
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
@@ -696,20 +717,20 @@
     /**
      * This test case checks for
      * PCEP-ERROR Object, RP Object, RP Object, PCEP-ERROR Object, PCEP-ERROR Object,
-     * TE Object, PCEP-ERROR Object
+     * LS Object, PCEP-ERROR Object
      * in PcepErrorMsg message.
      */
     @Test
-    public void errorMessageTest20() throws PcepParseException {
+    public void errorMessageTest20() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x48, // common header
+        byte[] errorMsg = new byte[]{0x20, 0x06, 0x00, 0x4C, // common header
                 0x0D, 0x10, 0x00, 0x08, // PCEP-ERROR Object Header
                 0x00, 0x00, 0x01, 0x01, 0x02, 0x10, 0x00, 0x0C, // RP Object Header
                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x10, 0x00, 0x0C, // RP Object Header
                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
                 0x00, 0x00, 0x01, 0x04, 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
-                0x00, 0x00, 0x01, 0x06, 0x65, 0x10, 0x00, 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
+                0x00, 0x00, 0x01, 0x06, (byte) 0xE0, 0x10, 0x00, 0x10, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
                 0x0D, 0x10, 0x00, 0x08, // PCERR Object Header
                 0x00, 0x00, 0x01, 0x06};
 
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepInitiateMsgExtTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepInitiateMsgExtTest.java
index 9341f32..dad53ad 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepInitiateMsgExtTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepInitiateMsgExtTest.java
@@ -18,6 +18,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -32,11 +33,11 @@
      * END-POINTS, ERO, LSPA, BANDWIDTH, METRIC-LIST objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest1() throws PcepParseException {
+    public void initiateMessageTest1() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
-         * StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC-LIST.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
+        // StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC-LIST.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0xA4,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -88,11 +89,11 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest2() throws PcepParseException {
+    public void initiateMessageTest2() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
-         * StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
+        // StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0xA8,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -143,11 +144,11 @@
      * ERO, LSPA, BANDWIDTH objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest3() throws PcepParseException {
+    public void initiateMessageTest3() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
-         * StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO, LSPA, BANDWIDTH.
-         */
+        // SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
+        // StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO, LSPA, BANDWIDTH.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x8c,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -197,11 +198,11 @@
      * END-POINTS, ERO, LSPA objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest4() throws PcepParseException {
+    public void initiateMessageTest4() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
-         * StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO, LSPA.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
+        // StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO, LSPA.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x84,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -250,11 +251,11 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest5() throws PcepParseException {
+    public void initiateMessageTest5() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
-         * StatefulLspErrorCodeTlv), END-POINTS, ERO, LSPA.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
+        // StatefulLspErrorCodeTlv), END-POINTS, ERO, LSPA.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x84,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -301,11 +302,11 @@
      * BANDWIDTH OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest6() throws PcepParseException {
+    public void initiateMessageTest6() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
-         * StatefulLspErrorCodeTlv), END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
+        // StatefulLspErrorCodeTlv), END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x8c,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -353,11 +354,11 @@
      * LSPA, BANDWIDTH, METRIC OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest7() throws PcepParseException {
+    public void initiateMessageTest7() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
-         * StatefulLspErrorCodeTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv,
+        // StatefulLspErrorCodeTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x98,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -406,11 +407,11 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest8() throws PcepParseException {
+    public void initiateMessageTest8() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv),
-         * END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv),
+        // END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x90,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -458,11 +459,11 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest9() throws PcepParseException {
+    public void initiateMessageTest9() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv),
-         * END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv),
+        // END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x84,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -508,11 +509,11 @@
      * SymbolicPathNameTlv), END-POINTS, ERO, LSPA OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest10() throws PcepParseException {
+    public void initiateMessageTest10() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv),
-         * END-POINTS, ERO, LSPA OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv),
+        // END-POINTS, ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x70,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -556,11 +557,11 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest11() throws PcepParseException {
+    public void initiateMessageTest11() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv),
-         * END-POINTS, ERO, LSPA OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv),
+        // END-POINTS, ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x7C,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -604,11 +605,11 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest12() throws PcepParseException {
+    public void initiateMessageTest12() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv),
-         * END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv),
+        // END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x78,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -653,11 +654,11 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest13() throws PcepParseException {
+    public void initiateMessageTest13() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv),
-         * END-POINTS, ERO, LSPA, BANDWIDTH , METRIC OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv, StatefulLspDbVerTlv),
+        // END-POINTS, ERO, LSPA, BANDWIDTH , METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x84,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -702,11 +703,11 @@
      * END-POINTS, ERO, LSPA, BANDWIDTH , METRIC OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest14() throws PcepParseException {
+    public void initiateMessageTest14() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv),
-         * END-POINTS, ERO, LSPA, BANDWIDTH , METRIC OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv),
+        // END-POINTS, ERO, LSPA, BANDWIDTH , METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x7c,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -750,11 +751,11 @@
      * END-POINTS, ERO, LSPA, BANDWIDTH OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest15() throws PcepParseException {
+    public void initiateMessageTest15() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv),
-         * END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv),
+        // END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x70,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -797,11 +798,11 @@
      * END-POINTS, ERO, LSPA OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest16() throws PcepParseException {
+    public void initiateMessageTest16() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv),
-         * END-POINTS, ERO, LSPA OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv),
+        // END-POINTS, ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -843,10 +844,10 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest17() throws PcepParseException {
+    public void initiateMessageTest17() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA OBJECT.
-         */
+        // SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x60,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -887,10 +888,10 @@
      * BANDWIDTH OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest18() throws PcepParseException {
+    public void initiateMessageTest18() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
-         */
+        // SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03,
@@ -933,10 +934,10 @@
      * BANDWIDTH, METRIC OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest19() throws PcepParseException {
+    public void initiateMessageTest19() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
-         */
+        // SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x74,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -979,10 +980,10 @@
      * BANDWIDTH, METRIC OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest20() throws PcepParseException {
+    public void initiateMessageTest20() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
-         */
+        // SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x64,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -1024,10 +1025,10 @@
      * BANDWIDTH OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest21() throws PcepParseException {
+    public void initiateMessageTest21() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
-         */
+        // SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -1068,10 +1069,10 @@
      * LSPA OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest22() throws PcepParseException {
+    public void initiateMessageTest22() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA OBJECT.
-         */
+        // SRP, LSP (StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x50,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -1111,10 +1112,10 @@
      * END-POINTS, ERO, LSPA OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest23() throws PcepParseException {
+    public void initiateMessageTest23() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1155,10 +1156,10 @@
      * END-POINTS, ERO, LSPA BANDWIDTH OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest25() throws PcepParseException {
+    public void initiateMessageTest25() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA BANDWIDTH OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv), END-POINTS, ERO, LSPA BANDWIDTH OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x60,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1200,11 +1201,11 @@
      * ERO, LSPA, BANDWIDTH, METRIC OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest26() throws PcepParseException {
+    public void initiateMessageTest26() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv), END-POINTS,
-         * ERO, LSPA, BANDWIDTH, METRIC OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv), END-POINTS,
+        // ERO, LSPA, BANDWIDTH, METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x6C,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1247,10 +1248,10 @@
      * BANDWIDTH, METRIC OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest27() throws PcepParseException {
+    public void initiateMessageTest27() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, SymbolicPathNameTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, SymbolicPathNameTlv), END-POINTS, ERO, LSPA, BANDWIDTH, METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x60,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1291,10 +1292,10 @@
      * LSPA, BANDWIDTH OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest28() throws PcepParseException {
+    public void initiateMessageTest28() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, SymbolicPathNameTlv), END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, SymbolicPathNameTlv), END-POINTS, ERO, LSPA, BANDWIDTH OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1334,10 +1335,10 @@
      * END-POINTS, ERO, LSPA OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest29() throws PcepParseException {
+    public void initiateMessageTest29() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, SymbolicPathNameTlv), END-POINTS, ERO, LSPA OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, SymbolicPathNameTlv), END-POINTS, ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x4C,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1376,10 +1377,10 @@
      * END-POINTS, ERO, LSPA OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest30() throws PcepParseException {
+    public void initiateMessageTest30() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv, SymbolicPathNameTlv), END-POINTS, ERO, LSPA OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv, SymbolicPathNameTlv), END-POINTS, ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x5C,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1419,10 +1420,10 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest31() throws PcepParseException {
+    public void initiateMessageTest31() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP (SymbolicPathNameTlv), END-POINTS, ERO, LSPA OBJECT.
-         */
+        // SRP, LSP (SymbolicPathNameTlv), END-POINTS, ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -1461,11 +1462,11 @@
      * ERO, LSPA, BANDWIDTH, METRIC OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest32() throws PcepParseException {
+    public void initiateMessageTest32() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
-         * ERO, LSPA, BANDWIDTH, METRIC OBJECT.
-         */
+        // SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
+        // ERO, LSPA, BANDWIDTH, METRIC OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x64,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1507,11 +1508,11 @@
      * ERO, LSPA, BANDWIDTH OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest33() throws PcepParseException {
+    public void initiateMessageTest33() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
-         * ERO, LSPA, BANDWIDTH OBJECT.
-         */
+        // SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
+        // ERO, LSPA, BANDWIDTH OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1552,11 +1553,11 @@
      * ERO, LSPA OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest34() throws PcepParseException {
+    public void initiateMessageTest34() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
-         * ERO, LSPA OBJECT.
-         */
+        // SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
+        // ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x50,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1596,11 +1597,11 @@
      * ERO, LSPA OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest35() throws PcepParseException {
+    public void initiateMessageTest35() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
-         * ERO, LSPA OBJECT.
-         */
+        // SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
+        // ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x60,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1641,11 +1642,11 @@
      * ERO, LSPA OBJECT objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest36() throws PcepParseException {
+    public void initiateMessageTest36() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        /* SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
-         * ERO, LSPA OBJECT.
-         */
+        // SRP, LSP ( StatefulLspDbVerTlv), END-POINTS,
+        // ERO, LSPA OBJECT.
+        //
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x14, 0x00, 0x00, 0x10, 0x03, //LSP object
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepInitiateMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepInitiateMsgTest.java
index 0f8bb7b..cb5b0dd 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepInitiateMsgTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepInitiateMsgTest.java
@@ -18,6 +18,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -30,7 +31,7 @@
      * This test case checks for srp, lsp, end-point, ERO objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest1() throws PcepParseException {
+    public void initiateMessageTest1() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* srp, lsp, end-point, ERO.
          */
@@ -75,7 +76,7 @@
      * This test case checks for srp and lsp objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest2() throws PcepParseException {
+    public void initiateMessageTest2() throws PcepParseException, PcepOutOfBoundMessageException {
         /* srp, lsp.
          */
         byte[] initiateDeletionMsg = new byte[]{0x20, 0x0C, 0x00, 0x34,
@@ -115,7 +116,7 @@
      * in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest3() throws PcepParseException {
+    public void initiateMessageTest3() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv,
          * StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO.
@@ -162,7 +163,7 @@
      * StatefulLspErrorCodeTlv), END-POINT, ERO objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest4() throws PcepParseException {
+    public void initiateMessageTest4() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv,
          * StatefulLspErrorCodeTlv), END-POINT, ERO.
@@ -208,7 +209,7 @@
      * END-POINT, ERO objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest5() throws PcepParseException {
+    public void initiateMessageTest5() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv),
          * END-POINT, ERO.
@@ -255,7 +256,7 @@
      * END-POINT, ERO objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest6() throws PcepParseException {
+    public void initiateMessageTest6() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv),
          * END-POINT, ERO.
@@ -303,7 +304,7 @@
      * END-POINT, ERO objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest7() throws PcepParseException {
+    public void initiateMessageTest7() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv),
          * END-POINT, ERO.
@@ -350,7 +351,7 @@
      * END-POINT, ERO objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest8() throws PcepParseException {
+    public void initiateMessageTest8() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv),
          * END-POINT, ERO.
@@ -396,7 +397,7 @@
      * END-POINT, ERO objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest9() throws PcepParseException {
+    public void initiateMessageTest9() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv),
          * END-POINT, ERO.
@@ -440,7 +441,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest10() throws PcepParseException {
+    public void initiateMessageTest10() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, StatefulRsvpErrorSpecTlv).
          */
@@ -484,7 +485,7 @@
      * StatefulLspErrorCodeTlv) objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest11() throws PcepParseException {
+    public void initiateMessageTest11() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv,
            StatefulLspErrorCodeTlv).*/
@@ -528,7 +529,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest12() throws PcepParseException {
+    public void initiateMessageTest12() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv).
          */
@@ -571,7 +572,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest13() throws PcepParseException {
+    public void initiateMessageTest13() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv).
          */
@@ -613,7 +614,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest14() throws PcepParseException {
+    public void initiateMessageTest14() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv).
          */
@@ -655,7 +656,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest15() throws PcepParseException {
+    public void initiateMessageTest15() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv).
          */
@@ -696,7 +697,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest16() throws PcepParseException {
+    public void initiateMessageTest16() throws PcepParseException, PcepOutOfBoundMessageException {
 
         //srp,lsp (StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x50,
@@ -740,7 +741,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest17() throws PcepParseException {
+    public void initiateMessageTest17() throws PcepParseException, PcepOutOfBoundMessageException {
 
         //srp,lsp (StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x58,
@@ -784,7 +785,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest18() throws PcepParseException {
+    public void initiateMessageTest18() throws PcepParseException, PcepOutOfBoundMessageException {
         //srp,lsp (StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth,metric-list
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x64,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -829,7 +830,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest19() throws PcepParseException {
+    public void initiateMessageTest19() throws PcepParseException, PcepOutOfBoundMessageException {
         //srp,lsp(all tlvs),end-point,ero,lspa,bandwidth,metric-list
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x74,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -876,7 +877,7 @@
      * lsp(SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv) objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest20() throws PcepParseException {
+    public void initiateMessageTest20() throws PcepParseException, PcepOutOfBoundMessageException {
         /* srp,lsp (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, srp,
          *  lsp(SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv).
          */
@@ -924,7 +925,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest21() throws PcepParseException {
+    public void initiateMessageTest21() throws PcepParseException, PcepOutOfBoundMessageException {
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero
          */
@@ -978,7 +979,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest22() throws PcepParseException {
+    public void initiateMessageTest22() throws PcepParseException, PcepOutOfBoundMessageException {
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa
          */
@@ -1033,7 +1034,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest23() throws PcepParseException {
+    public void initiateMessageTest23() throws PcepParseException, PcepOutOfBoundMessageException {
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth
          */
@@ -1090,7 +1091,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest24() throws PcepParseException {
+    public void initiateMessageTest24() throws PcepParseException, PcepOutOfBoundMessageException {
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth*/
         byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0xBC,
@@ -1148,7 +1149,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest25() throws PcepParseException {
+    public void initiateMessageTest25() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,bandwidth,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),
@@ -1209,7 +1210,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest26() throws PcepParseException {
+    public void initiateMessageTest26() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,bandwidth,metric-list,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),
@@ -1271,7 +1272,7 @@
      * objects in PcInitiate message.
      */
     @Test
-    public void initiateMessageTest27() throws PcepParseException {
+    public void initiateMessageTest27() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth,metric-list,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepKeepaliveMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepKeepaliveMsgTest.java
index 56cf06b..0131860 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepKeepaliveMsgTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepKeepaliveMsgTest.java
@@ -19,6 +19,7 @@
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Assert;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -31,7 +32,7 @@
      * Common header for keep alive message.
      */
     @Test
-    public void keepaliveMessageTest1() throws PcepParseException {
+    public void keepaliveMessageTest1() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] keepaliveMsg = new byte[] {0x20, 0x02, 0x00, 0x04 };
 
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepLSReportMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepLSReportMsgTest.java
new file mode 100644
index 0000000..ea1009d
--- /dev/null
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepLSReportMsgTest.java
@@ -0,0 +1,1585 @@
+/*
+ * Copyright 2014-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.pcepio.protocol;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
+import org.onosproject.pcepio.exceptions.PcepParseException;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.core.Is.is;
+
+public class PcepLSReportMsgTest {
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV, Local Node Descriptors TLV(AutonomousSystemSubTlv)).
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest1() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x2C, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x28, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x08, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystem Tlv
+                0x00, 0x00, 0x00, 0x11};
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV, Local Node Descriptors TLV(AutonomousSystemSubTlv)) with different LS-ID.
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest2() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x2C, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x28, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x08, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11};
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for  LS Object (Routing Universe TLV)
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest3() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x20, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x1C, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv.
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv)).
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest4() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x48, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x44, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OspfAreaIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11};
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest5() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x40, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x3C, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x1C, // Local Node Descriptors TLV
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11};
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for LS Object (Routing Universe TLV,Local Node Descriptors TLV(OSPFareaIDsubTlv,
+     * IgpRouterIdSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest6() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x38, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x34, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x14, // Local Node Descriptors TLV
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11};
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for LS Object (Routing Universe TLV,Local Node Descriptors TLV(IgpRouterIdSubTlv)).
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest7() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x30, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x2C, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x0C, // Local Node Descriptors TLV
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11};
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for LS Object (Routing Universe TLV,Local Node Descriptors TLV)
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest8() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x24, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x20, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x00 // Local Node Descriptors TLV
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv.
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv.
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv)).
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest9() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x70, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x6C, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest10() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x68, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x64, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x1C, //RemoteNodeDescriptorsTLV
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(OSPFareaIDsubTlv, IgpRouterIdSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest11() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x60, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x5C, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x14, //RemoteNodeDescriptorsTLV
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(IgpRouterIdSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest12() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x58, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x54, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x0c, //RemoteNodeDescriptorsTLV
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV)
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest13() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, 0x4C, // common header
+                (byte) 0xE0, 0x10, 0x00, 0x48, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x00 //RemoteNodeDescriptorsTLV
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(LinkLocalRemoteIdentifiersSubTlv
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest14() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, (byte) 0x90, // common header
+                (byte) 0xE0, 0x10, 0x00, (byte) 0x8C, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x1C, //LinkDescriptorsTLV
+                0x00, 0x06, 0x00, 0x08, //LinkLocalRemoteIdentifiersSubTlv
+                0x01, 0x11, 0x00, 0x09,
+                0x01, 0x21, 0x00, 0x09,
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest15() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, (byte) 0x84, // common header
+                (byte) 0xE0, 0x10, 0x00, (byte) 0x80, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x10, //LinkDescriptorsTLV
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(IPv4NeighborAddressSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest16() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, (byte) 0x7C, // common header
+                (byte) 0xE0, 0x10, 0x00, (byte) 0x78, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x08, //LinkDescriptorsTLV
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV)
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest17() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, (byte) 0x74, // common header
+                (byte) 0xE0, 0x10, 0x00, (byte) 0x70, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x00, //LinkDescriptorsTLV
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(LinkLocalRemoteIdentifiersSubTlv
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest18() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, (byte) 0xC4, // common header
+                (byte) 0xE0, 0x10, 0x00, (byte) 0xC0, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x1C, //LinkDescriptorsTLV
+                0x00, 0x06, 0x00, 0x08, //LinkLocalRemoteIdentifiersSubTlv
+                0x01, 0x11, 0x00, 0x09,
+                0x01, 0x21, 0x00, 0x09,
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                (byte) 0xFF, 0x05, 0x00, 0x30, //NodeAttributesTlv
+                0x00, 0x0D, 0x00, 0x01, //NodeFlagBitsSubTlv
+                (byte) 0x90, 0x00, 0x00, 0x00,
+                0x00, 0x0E, 0x00, 0x04, //OpaqueNodePropertiesSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                0x00, 0x0F, 0x00, 0x08, //NodeNameSubTlv
+                0x08, 0x00, 0x01, 0x09,
+                0x08, 0x00, 0x01, 0x09,
+                0x00, 0x10, 0x00, 0x08, //ISISAreaIdentifierSubTlv
+                0x20, 0x01, 0x22, 0x01,
+                0x20, 0x01, 0x22, 0x01,
+                0x00, 0x11, 0x00, 0x04, //IPv4RouterIdOfLocalNodeSubTlv
+                0x00, 0x01, 0x01, 0x02
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(LinkLocalRemoteIdentifiersSubTlv
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv), NodeAttributesTlv(NodeFlagBitsSubTlv
+     * OpaqueNodePropertiesSubTlv, NodeNameSubTlv, ISISAreaIdentifierSubTlv, IPv4RouterIdOfLocalNodeSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest19() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, (byte) 0xC4, // common header
+                (byte) 0xE0, 0x10, 0x00, (byte) 0xC0, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x1C, //LinkDescriptorsTLV
+                0x00, 0x06, 0x00, 0x08, //LinkLocalRemoteIdentifiersSubTlv
+                0x01, 0x11, 0x00, 0x09,
+                0x01, 0x21, 0x00, 0x09,
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                (byte) 0xFF, 0x05, 0x00, 0x30, //NodeAttributesTlv
+                0x00, 0x0D, 0x00, 0x01, //NodeFlagBitsSubTlv
+                (byte) 0x90, 0x00, 0x00, 0x00,
+                0x00, 0x0E, 0x00, 0x04, //OpaqueNodePropertiesSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                0x00, 0x0F, 0x00, 0x08, //NodeNameSubTlv
+                0x08, 0x00, 0x01, 0x09,
+                0x08, 0x00, 0x01, 0x09,
+                0x00, 0x10, 0x00, 0x08, //ISISAreaIdentifierSubTlv
+                0x20, 0x01, 0x22, 0x01,
+                0x20, 0x01, 0x22, 0x01,
+                0x00, 0x11, 0x00, 0x04, //IPv4RouterIdOfLocalNodeSubTlv
+                0x00, 0x01, 0x01, 0x02
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(LinkLocalRemoteIdentifiersSubTlv
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv), NodeAttributesTlv(OpaqueNodePropertiesSubTlv
+     * NodeNameSubTlv, ISISAreaIdentifierSubTlv, IPv4RouterIdOfLocalNodeSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest20() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, (byte) 0xBC, // common header
+                (byte) 0xE0, 0x10, 0x00, (byte) 0xB8, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x1C, //LinkDescriptorsTLV
+                0x00, 0x06, 0x00, 0x08, //LinkLocalRemoteIdentifiersSubTlv
+                0x01, 0x11, 0x00, 0x09,
+                0x01, 0x21, 0x00, 0x09,
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                (byte) 0xFF, 0x05, 0x00, 0x28, //NodeAttributesTlv
+                0x00, 0x0E, 0x00, 0x04, //OpaqueNodePropertiesSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                0x00, 0x0F, 0x00, 0x08, //NodeNameSubTlv
+                0x08, 0x00, 0x01, 0x09,
+                0x08, 0x00, 0x01, 0x09,
+                0x00, 0x10, 0x00, 0x08, //ISISAreaIdentifierSubTlv
+                0x20, 0x01, 0x22, 0x01,
+                0x20, 0x01, 0x22, 0x01,
+                0x00, 0x11, 0x00, 0x04, //IPv4RouterIdOfLocalNodeSubTlv
+                0x00, 0x01, 0x01, 0x02
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(LinkLocalRemoteIdentifiersSubTlv.
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv), NodeAttributesTlv(OpaqueNodePropertiesSubTlv
+     * ISISAreaIdentifierSubTlv, IPv4RouterIdOfLocalNodeSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest21() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, (byte) 0xB0, // common header
+                (byte) 0xE0, 0x10, 0x00, (byte) 0xAC, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x1C, //LinkDescriptorsTLV
+                0x00, 0x06, 0x00, 0x08, //LinkLocalRemoteIdentifiersSubTlv
+                0x01, 0x11, 0x00, 0x09,
+                0x01, 0x21, 0x00, 0x09,
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                (byte) 0xFF, 0x05, 0x00, 0x1C, //NodeAttributesTlv
+                0x00, 0x0E, 0x00, 0x04, //OpaqueNodePropertiesSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                0x00, 0x10, 0x00, 0x08, //ISISAreaIdentifierSubTlv
+                0x20, 0x01, 0x22, 0x01,
+                0x20, 0x01, 0x22, 0x01,
+                0x00, 0x11, 0x00, 0x04, //IPv4RouterIdOfLocalNodeSubTlv
+                0x00, 0x01, 0x01, 0x02
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv,
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv,
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(LinkLocalRemoteIdentifiersSubTlv,
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv), NodeAttributesTlv(NodeFlagBitsSubTlv,
+     * OpaqueNodePropertiesSubTlv, NodeNameSubTlv, ISISAreaIdentifierSubTlv, IPv4RouterIdOfLocalNodeSubTlv),
+     * LinkAttributesTlv(IPv4RouterIdOfRemoteNodeSubTlv, IPv6LSRouterIdofRemoteNodeTlv, AdministrativeGroupSubTlv,
+     * TEDefaultMetricSubTlv, MaximumLinkBandwidthSubTlv, MaximumReservableLinkBandwidthSubTlv,
+     * UnreservedBandwidthSubTlv, LinkProtectionTypeSubTlv, MPLSProtocolMaskSubTlv, IgpMetricSubTlv,
+     * SharedRiskLinkGroupSubTlv, OpaqueLinkAttributeSubTlv, LinkNameAttributeSubTlv)).
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest22() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x01, 0x18, // common header
+                (byte) 0xE0, 0x10, 0x01, 0x14, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x1C, //LinkDescriptorsTLV
+                0x00, 0x06, 0x00, 0x08, //LinkLocalRemoteIdentifiersSubTlv
+                0x01, 0x11, 0x00, 0x09,
+                0x01, 0x21, 0x00, 0x09,
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                (byte) 0xFF, 0x05, 0x00, 0x1C, //NodeAttributesTlv
+                0x00, 0x0E, 0x00, 0x04, //OpaqueNodePropertiesSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                0x00, 0x10, 0x00, 0x08, //ISISAreaIdentifierSubTlv
+                0x20, 0x01, 0x22, 0x01,
+                0x20, 0x01, 0x22, 0x01,
+                0x00, 0x11, 0x00, 0x04, //IPv4RouterIdOfLocalNodeSubTlv
+                0x00, 0x01, 0x01, 0x02,
+                (byte) 0xFF, 0x06, 0x00, 0x64, //LinkAttributesTlv
+                0x00, 0x13, 0x00, 0x04, //IPv4RouterIdOfRemoteNodeSubTlv
+                0x00, 0x07, 0x08, 0x00,
+                0x00, 0x16, 0x00, 0x04, //AdministrativeGroupSubTlv
+                0x00, 0x09, 0x08, 0x00,
+                0x00, 0x17, 0x00, 0x04, //MaximumLinkBandwidthSubTlv
+                0x00, 0x09, 0x00, 0x00,
+                0x00, 0x18, 0x00, 0x04, //MaximumReservableLinkBandwidthSubTlv
+                0x00, 0x10, 0x00, 0x00,
+                0x00, 0x19, 0x00, 0x04, //UnreservedBandwidthSubTlv
+                0x00, 0x00, (byte) 0x90, 0x00,
+                0x00, 0x1A, 0x00, 0x04, //TEDefaultMetricSubTlv
+                0x00, (byte) 0x99, 0x09, 0x00,
+                0x00, 0x1B, 0x00, 0x02, //LinkProtectionTypeSubTlv
+                0x09, 0x00, 0x00, 0x00,
+                0x00, 0x1C, 0x00, 0x01, //MPLSProtocolMaskSubTlv
+                (byte) 0x80, 0x00, 0x00, 0x00,
+                0x00, 0x1D, 0x00, 0x04, //IgpMetricSubTlv
+                0x09, (byte) 0x89, 0x07, 0x00,
+                0x00, 0x1E, 0x00, 0x04, //SharedRiskLinkGroupSubTlv
+                0x04, 0x47, 0x00, 0x03,
+                0x00, 0x1F, 0x00, 0x08, //OpaqueLinkAttributeSubTlv
+                0x04, 0x49, 0x00, 0x04,
+                0x04, 0x47, 0x00, 0x03,
+                0x00, 0x20, 0x00, 0x04, //LinkNameAttributeSubTlv
+                0x04, 0x47, 0x00, 0x03
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv,
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv,
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(LinkLocalRemoteIdentifiersSubTlv,
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv), NodeAttributesTlv(NodeFlagBitsSubTlv,
+     * OpaqueNodePropertiesSubTlv, NodeNameSubTlv, ISISAreaIdentifierSubTlv, IPv4RouterIdOfLocalNodeSubTlv),
+     * LinkAttributesTlv(IPv4RouterIdOfRemoteNodeSubTlv, IPv6LSRouterIdofRemoteNodeTlv, AdministrativeGroupSubTlv,
+     * MaximumLinkBandwidthSubTlv, MaximumReservableLinkBandwidthSubTlv, UnreservedBandwidthSubTlv,
+     * TEDefaultMetricSubTlv, LinkProtectionTypeSubTlv, MPLSProtocolMaskSubTlv, IgpMetricSubTlv,
+     * SharedRiskLinkGroupSubTlv, OpaqueLinkAttributeSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest23() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x01, 0x10, // common header
+                (byte) 0xE0, 0x10, 0x01, 0x0C, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x1C, //LinkDescriptorsTLV
+                0x00, 0x06, 0x00, 0x08, //LinkLocalRemoteIdentifiersSubTlv
+                0x01, 0x11, 0x00, 0x09,
+                0x01, 0x21, 0x00, 0x09,
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                (byte) 0xFF, 0x05, 0x00, 0x1C, //NodeAttributesTlv
+                0x00, 0x0E, 0x00, 0x04, //OpaqueNodePropertiesSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                0x00, 0x10, 0x00, 0x08, //ISISAreaIdentifierSubTlv
+                0x20, 0x01, 0x22, 0x01,
+                0x20, 0x01, 0x22, 0x01,
+                0x00, 0x11, 0x00, 0x04, //IPv4RouterIdOfLocalNodeSubTlv
+                0x00, 0x01, 0x01, 0x02,
+                (byte) 0xFF, 0x06, 0x00, 0x5C, //LinkAttributesTlv
+                0x00, 0x13, 0x00, 0x04, //IPv4RouterIdOfRemoteNodeSubTlv
+                0x00, 0x07, 0x08, 0x00,
+                0x00, 0x16, 0x00, 0x04, //AdministrativeGroupSubTlv
+                0x00, 0x09, 0x08, 0x00,
+                0x00, 0x17, 0x00, 0x04, //MaximumLinkBandwidthSubTlv
+                0x00, 0x09, 0x00, 0x00,
+                0x00, 0x18, 0x00, 0x04, //MaximumReservableLinkBandwidthSubTlv
+                0x00, 0x10, 0x00, 0x00,
+                0x00, 0x19, 0x00, 0x04, //UnreservedBandwidthSubTlv
+                0x00, 0x00, (byte) 0x90, 0x00,
+                0x00, 0x1A, 0x00, 0x04, //TEDefaultMetricSubTlv
+                0x00, (byte) 0x99, 0x09, 0x00,
+                0x00, 0x1B, 0x00, 0x02, //LinkProtectionTypeSubTlv
+                0x09, 0x00, 0x00, 0x00,
+                0x00, 0x1C, 0x00, 0x01, //MPLSProtocolMaskSubTlv
+                (byte) 0x80, 0x00, 0x00, 0x00,
+                0x00, 0x1D, 0x00, 0x04, //IgpMetricSubTlv
+                0x09, (byte) 0x89, 0x07, 0x00,
+                0x00, 0x1E, 0x00, 0x04, //SharedRiskLinkGroupSubTlv
+                0x04, 0x47, 0x00, 0x03,
+                0x00, 0x1F, 0x00, 0x08, //OpaqueLinkAttributeSubTlv
+                0x04, 0x49, 0x00, 0x04,
+                0x04, 0x47, 0x00, 0x03
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv,
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv,
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(LinkLocalRemoteIdentifiersSubTlv,
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv), NodeAttributesTlv(NodeFlagBitsSubTlv,
+     * OpaqueNodePropertiesSubTlv, NodeNameSubTlv, ISISAreaIdentifierSubTlv, IPv4RouterIdOfLocalNodeSubTlv),
+     * LinkAttributesTlv(IPv4RouterIdOfRemoteNodeSubTlv, IPv6LSRouterIdofRemoteNodeTlv, AdministrativeGroupSubTlv,
+     * MaximumLinkBandwidthSubTlv, MaximumReservableLinkBandwidthSubTlv, UnreservedBandwidthSubTlv,
+     * TEDefaultMetricSubTlv, LinkProtectionTypeSubTlv, MPLSProtocolMaskSubTlv, IgpMetricSubTlv,
+     * SharedRiskLinkGroupSubTlv)) in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest24() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x01, 0x08, // common header
+                (byte) 0xE0, 0x10, 0x01, 0x04, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x1C, //LinkDescriptorsTLV
+                0x00, 0x06, 0x00, 0x08, //LinkLocalRemoteIdentifiersSubTlv
+                0x01, 0x11, 0x00, 0x09,
+                0x01, 0x21, 0x00, 0x09,
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                (byte) 0xFF, 0x05, 0x00, 0x1C, //NodeAttributesTlv
+                0x00, 0x0E, 0x00, 0x04, //OpaqueNodePropertiesSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                0x00, 0x10, 0x00, 0x08, //ISISAreaIdentifierSubTlv
+                0x20, 0x01, 0x22, 0x01,
+                0x20, 0x01, 0x22, 0x01,
+                0x00, 0x11, 0x00, 0x04, //IPv4RouterIdOfLocalNodeSubTlv
+                0x00, 0x01, 0x01, 0x02,
+                (byte) 0xFF, 0x06, 0x00, 0x54, //LinkAttributesTlv
+                0x00, 0x13, 0x00, 0x04, //IPv4RouterIdOfRemoteNodeSubTlv
+                0x00, 0x07, 0x08, 0x00,
+                0x00, 0x16, 0x00, 0x04, //AdministrativeGroupSubTlv
+                0x00, 0x09, 0x08, 0x00,
+                0x00, 0x17, 0x00, 0x04, //MaximumLinkBandwidthSubTlv
+                0x00, 0x09, 0x00, 0x00,
+                0x00, 0x18, 0x00, 0x04, //MaximumReservableLinkBandwidthSubTlv
+                0x00, 0x10, 0x00, 0x00,
+                0x00, 0x19, 0x00, 0x04, //UnreservedBandwidthSubTlv
+                0x00, 0x00, (byte) 0x90, 0x00,
+                0x00, 0x1A, 0x00, 0x04, //TEDefaultMetricSubTlv
+                0x00, (byte) 0x99, 0x09, 0x00,
+                0x00, 0x1B, 0x00, 0x02, //LinkProtectionTypeSubTlv
+                0x09, 0x00, 0x00, 0x00,
+                0x00, 0x1C, 0x00, 0x01, //MPLSProtocolMaskSubTlv
+                (byte) 0x80, 0x00, 0x00, 0x00,
+                0x00, 0x1D, 0x00, 0x04, //IgpMetricSubTlv
+                0x09, (byte) 0x89, 0x07, 0x00,
+                0x00, 0x1E, 0x00, 0x08, //SharedRiskLinkGroupSubTlv
+                0x04, 0x47, 0x00, 0x03,
+                0x04, 0x47, 0x00, 0x03
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+
+    /**
+     * This test case checks for
+     * LS Object (Routing Universe TLV,Local Node Descriptors TLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv,
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), RemoteNodeDescriptorsTLV(AutonomousSystemSubTlv, BGPLSidentifierSubTlv,
+     * OSPFareaIDsubTlv, IgpRouterIdSubTlv), LinkDescriptorsTLV(LinkLocalRemoteIdentifiersSubTlv,
+     * IPv4InterfaceAddressSubTlv, IPv4NeighborAddressSubTlv), NodeAttributesTlv(NodeFlagBitsSubTlv,
+     * OpaqueNodePropertiesSubTlv, NodeNameSubTlv, ISISAreaIdentifierSubTlv, IPv4RouterIdOfLocalNodeSubTlv),
+     * LinkAttributesTlv(IPv4RouterIdOfRemoteNodeSubTlv, IPv6LSRouterIdofRemoteNodeTlv, AdministrativeGroupSubTlv,
+     * MaximumLinkBandwidthSubTlv, MaximumReservableLinkBandwidthSubTlv, UnreservedBandwidthSubTlv,
+     * TEDefaultMetricSubTlv, LinkProtectionTypeSubTlv, MPLSProtocolMaskSubTlv, IgpMetricSubTlv))
+     * in PcLSRpt message.
+     */
+    @Test
+    public void lsReportMessageTest25() throws PcepParseException, PcepOutOfBoundMessageException {
+
+        byte[] lsReportMsg = new byte[]{0x20, (byte) 0xE0, 0x00, (byte) 0xFC, // common header
+                (byte) 0xE0, 0x10, 0x00, (byte) 0xF8, // LS Object Header
+                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, // LS-ID
+                (byte) 0xFF, 0x01, 0x00, 0x08, // Routing Universe TLV
+                0x00, 0x00, 0x00, 0x00,
+                0x00, 0x00, 0x00, 0x01,
+                (byte) 0xFF, 0x02, 0x00, 0x24, // Local Node Descriptors TLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x03, 0x00, 0x24, //RemoteNodeDescriptorsTLV
+                0x00, 0x01, 0x00, 0x04, //AutonomousSystemSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x02, 0x00, 0x04, //BGPLSidentifierSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x03, 0x00, 0x04, //OSPFareaIDsubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x04, 0x00, 0x08, //IgpRouterIdSubTlv
+                0x00, 0x00, 0x00, 0x11,
+                0x00, 0x00, 0x00, 0x11,
+                (byte) 0xFF, 0x04, 0x00, 0x1C, //LinkDescriptorsTLV
+                0x00, 0x06, 0x00, 0x08, //LinkLocalRemoteIdentifiersSubTlv
+                0x01, 0x11, 0x00, 0x09,
+                0x01, 0x21, 0x00, 0x09,
+                0x00, 0x07, 0x00, 0x04, //IPv4InterfaceAddressSubTlv
+                0x01, 0x01, 0x01, 0x01,
+                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                (byte) 0xFF, 0x05, 0x00, 0x1C, //NodeAttributesTlv
+                0x00, 0x0E, 0x00, 0x04, //OpaqueNodePropertiesSubTlv
+                0x01, 0x011, 0x01, 0x10,
+                0x00, 0x10, 0x00, 0x08, //ISISAreaIdentifierSubTlv
+                0x20, 0x01, 0x22, 0x01,
+                0x20, 0x01, 0x22, 0x01,
+                0x00, 0x11, 0x00, 0x04, //IPv4RouterIdOfLocalNodeSubTlv
+                0x00, 0x01, 0x01, 0x02,
+                (byte) 0xFF, 0x06, 0x00, 0x48, //LinkAttributesTlv
+                0x00, 0x13, 0x00, 0x04, //IPv4RouterIdOfRemoteNodeSubTlv
+                0x00, 0x07, 0x08, 0x00,
+                0x00, 0x16, 0x00, 0x04, //AdministrativeGroupSubTlv
+                0x00, 0x09, 0x08, 0x00,
+                0x00, 0x17, 0x00, 0x04, //MaximumLinkBandwidthSubTlv
+                0x00, 0x09, 0x00, 0x00,
+                0x00, 0x18, 0x00, 0x04, //MaximumReservableLinkBandwidthSubTlv
+                0x00, 0x10, 0x00, 0x00,
+                0x00, 0x19, 0x00, 0x04, //UnreservedBandwidthSubTlv
+                0x00, 0x00, (byte) 0x90, 0x00,
+                0x00, 0x1A, 0x00, 0x04, //TEDefaultMetricSubTlv
+                0x00, (byte) 0x99, 0x09, 0x00,
+                0x00, 0x1B, 0x00, 0x02, //LinkProtectionTypeSubTlv
+                0x09, 0x00, 0x00, 0x00,
+                0x00, 0x1C, 0x00, 0x01, //MPLSProtocolMaskSubTlv
+                (byte) 0x80, 0x00, 0x00, 0x00,
+                0x00, 0x1D, 0x00, 0x04, //IgpMetricSubTlv
+                0x09, (byte) 0x89, 0x07, 0x00
+        };
+
+        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
+        buffer.writeBytes(lsReportMsg);
+
+        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
+        PcepMessage message = null;
+
+        message = reader.readFrom(buffer);
+
+        byte[] testReportMsg = {0};
+
+        assertThat(message, instanceOf(PcepLSReportMsg.class));
+        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+        message.writeTo(buf);
+
+        int readLen = buf.writerIndex();
+        testReportMsg = new byte[readLen];
+        buf.readBytes(testReportMsg, 0, readLen);
+
+        assertThat(testReportMsg, is(lsReportMsg));
+    }
+}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepLabelUpdateMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepLabelUpdateMsgTest.java
index e1947bd..2256496 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepLabelUpdateMsgTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepLabelUpdateMsgTest.java
@@ -18,6 +18,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -32,15 +33,15 @@
      * in PcepLabelUpdate message.
      */
     @Test
-    public void labelUpdateMessageTest1() throws PcepParseException {
+    public void labelUpdateMessageTest1() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] labelUpdate = new byte[]{0x20, 0x0D, 0x00, 0x24, // common header
+        byte[] labelUpdate = new byte[]{0x20, (byte) 0xE2, 0x00, 0x24, // common header
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x10,
                 0x20, 0x10, 0x00, 0x08, // LSP Object Header
                 0x00, 0x01, 0x00, 0x00,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66};
 
@@ -72,18 +73,18 @@
      * in PcepLabelUpdate message.
      */
     @Test
-    public void labelUpdateMessageTest2() throws PcepParseException {
+    public void labelUpdateMessageTest2() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] labelUpdate = new byte[]{0x20, 0x0D, 0x00, 0x30, // common header
+        byte[] labelUpdate = new byte[]{0x20, (byte) 0xE2, 0x00, 0x30, // common header
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x10,
                 0x20, 0x10, 0x00, 0x08, // LSP Object Header
                 0x00, 0x01, 0x00, 0x00,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x77};
 
@@ -113,16 +114,16 @@
      * in PcepLabelUpdate message.
      */
     @Test
-    public void labelUpdateMessageTest3() throws PcepParseException {
+    public void labelUpdateMessageTest3() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] labelUpdate = new byte[]{0x20, 0x0D, 0x00, 0x24, // common header
+        byte[] labelUpdate = new byte[]{0x20, (byte) 0xE2, 0x00, 0x24, // common header
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x10,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x24, 0x10, 0x00, 0x08, // FEC Object Header
+                (byte) 0xE2, 0x10, 0x00, 0x08, // FEC Object Header
                 0x0A, 0x0A, 0x0B, 0x0B};
 
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
@@ -151,18 +152,18 @@
      * in PcepLabelUpdate message.
      */
     @Test
-    public void labelUpdateMessageTest4() throws PcepParseException {
+    public void labelUpdateMessageTest4() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] labelUpdate = new byte[]{0x20, 0x0D, 0x00, 0x50, // common header
+        byte[] labelUpdate = new byte[]{0x20, (byte) 0xE2, 0x00, 0x50, // common header
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x10,
                 0x20, 0x10, 0x00, 0x08, // LSP Object Header
                 0x00, 0x01, 0x00, 0x00,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x77,
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
@@ -170,7 +171,7 @@
                 0x00, 0x00, 0x00, 0x11,
                 0x20, 0x10, 0x00, 0x08, // LSP Object Header
                 0x00, 0x02, 0x00, 0x00,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x44};
 
@@ -200,24 +201,24 @@
      * in PcepLabelUpdate message.
      */
     @Test
-    public void labelUpdateMessageTest5() throws PcepParseException {
+    public void labelUpdateMessageTest5() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] labelUpdate = new byte[]{0x20, 0x0D, 0x00, 0x44, // common header
+        byte[] labelUpdate = new byte[]{0x20, (byte) 0xE2, 0x00, 0x44, // common header
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x10,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x01,
                 0x00, 0x00, 0x00, 0x66,
-                0x24, 0x10, 0x00, 0x08, // FEC Object Header
+                (byte) 0xE2, 0x10, 0x00, 0x08, // FEC Object Header
                 0x0A, 0x0A, 0x0B, 0x0B,
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x11,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x24, 0x10, 0x00, 0x08, // FEC Object Header
+                (byte) 0xE2, 0x10, 0x00, 0x08, // FEC Object Header
                 0x0A, 0x0A, 0x0C, 0x0C};
 
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
@@ -246,27 +247,27 @@
      * in PcepLabelUpdate message.
      */
     @Test
-    public void labelUpdateMessageTest6() throws PcepParseException {
+    public void labelUpdateMessageTest6() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] labelUpdate = new byte[]{0x20, 0x0D, 0x00, 0x50, // common header
+        byte[] labelUpdate = new byte[]{0x20, (byte) 0xE2, 0x00, 0x50, // common header
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x10,
                 0x20, 0x10, 0x00, 0x08, // LSP Object Header
                 0x00, 0x01, 0x00, 0x00,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x77,
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x12,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x24, 0x10, 0x00, 0x08, // FEC Object Header
+                (byte) 0xE2, 0x10, 0x00, 0x08, // FEC Object Header
                 0x0A, 0x0A, 0x0D, 0x0D};
 
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
@@ -295,26 +296,26 @@
      * in PcepLabelUpdate message.
      */
     @Test
-    public void labelUpdateMessageTest7() throws PcepParseException {
+    public void labelUpdateMessageTest7() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] labelUpdate = new byte[]{0x20, 0x0D, 0x00, 0x50, // common header
+        byte[] labelUpdate = new byte[]{0x20, (byte) 0xE2, 0x00, 0x50, // common header
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x12,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x24, 0x10, 0x00, 0x08, // FEC Object Header
+                (byte) 0xE2, 0x10, 0x00, 0x08, // FEC Object Header
                 0x0A, 0x0A, 0x0D, 0x0D,
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x10,
                 0x20, 0x10, 0x00, 0x08, // LSP Object Header
                 0x00, 0x01, 0x00, 0x00,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x77};
 
@@ -345,26 +346,26 @@
      * in PcepLabelUpdate message.
      */
     @Test
-    public void labelUpdateMessageTest8() throws PcepParseException {
+    public void labelUpdateMessageTest8() throws PcepParseException, PcepOutOfBoundMessageException {
 
-        byte[] labelUpdate = new byte[]{0x20, 0x0D, 0x00, 0x7C, // common header
+        byte[] labelUpdate = new byte[]{0x20, (byte) 0xE2, 0x00, 0x7C, // common header
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x12,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x24, 0x10, 0x00, 0x08, // FEC Object Header
+                (byte) 0xE2, 0x10, 0x00, 0x08, // FEC Object Header
                 0x0A, 0x0A, 0x0D, 0x0D,
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x10,
                 0x20, 0x10, 0x00, 0x08, // LSP Object Header
                 0x00, 0x01, 0x00, 0x00,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x77,
                 0x21, 0x10, 0x00, 0x0C, // SRP Object Header
@@ -372,10 +373,10 @@
                 0x00, 0x00, 0x00, 0x10,
                 0x20, 0x10, 0x00, 0x08, // LSP Object Header
                 0x00, 0x01, 0x00, 0x00,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x66,
-                0x23, 0x10, 0x00, 0x0C, // LABEL Object Header
+                (byte) 0xE1, 0x10, 0x00, 0x0C, // LABEL Object Header
                 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x77};
 
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepOpenMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepOpenMsgTest.java
index 6e0a059..eea8a26 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepOpenMsgTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepOpenMsgTest.java
@@ -18,6 +18,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -33,7 +34,7 @@
      * PCECC-CAPABILITY-TLV in Pcep Open message.
      */
     @Test
-    public void openMessageTest1() throws PcepParseException {
+    public void openMessageTest1() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x24, 0x01, 0x10, 0x00, 0x20, 0x20, 0x1e, 0x78, (byte) 0xbd,
                 0x00, 0x10, 0x00, 0x04, 0x00, 0x00, 0x00, 0x0f, //STATEFUL-PCE-CAPABILITY
@@ -67,7 +68,7 @@
      * This test case checks open object with STATEFUL-PCE-CAPABILITY-TLV in Pcep Open message.
      */
     @Test
-    public void openMessageTest2() throws PcepParseException {
+    public void openMessageTest2() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x14, // common header
                 0x01, 0x10, 0x00, 0x10, // common object header
@@ -99,7 +100,7 @@
      * This test case checks open object with GmplsCapability tlv in Pcep Open message.
      */
     @Test
-    public void openMessageTest3() throws PcepParseException {
+    public void openMessageTest3() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x14, // common header
                 0x01, 0x10, 0x00, 0x10, // common object header
@@ -133,7 +134,7 @@
      * This test case checks open object with StatefulLspDbVer Tlv in Pcep Open message.
      */
     @Test
-    public void openMessageTest4() throws PcepParseException {
+    public void openMessageTest4() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x18,
                 0x01, 0x10, 0x00, 0x14, 0x20, 0x1e, 0x78, 0x20,
@@ -165,7 +166,7 @@
      * This test case checks open object with no tlv's in Pcep Open message.
      */
     @Test
-    public void openMessageTest5() throws PcepParseException {
+    public void openMessageTest5() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x0C,
                 0x01, 0x10, 0x00, 0x08, 0x20, 0x1e, 0x78, (byte) 0xbd }; // no Tlvs in open messsage
@@ -197,7 +198,7 @@
      * with I bit set in Pcep Open message.
      */
     @Test
-    public void openMessageTest6() throws PcepParseException {
+    public void openMessageTest6() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x24, 0x01, 0x11, 0x00, 0x20, //p bit not set & i bit set
                 0x20, 0x1e, 0x78, (byte) 0xbd,
@@ -233,7 +234,7 @@
      * with P bit set in Pcep Open message.
      */
     @Test
-    public void openMessageTest7() throws PcepParseException {
+    public void openMessageTest7() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x24, 0x01, 0x12, 0x00, 0x20, //p bit set & i bit not set
                 0x20, 0x1e, 0x78, (byte) 0xbd,
@@ -269,7 +270,7 @@
      * with P & I bits set in Pcep Open message.
      */
     @Test
-    public void openMessageTest8() throws PcepParseException {
+    public void openMessageTest8() throws PcepParseException, PcepOutOfBoundMessageException {
 
         /* OPEN OBJECT (STATEFUL-PCE-CAPABILITY, GMPLS-CAPABILITY-TLV, PCECC-CAPABILITY-TLV)
         with p bit set & i bit set.
@@ -308,7 +309,7 @@
      * with P & I bits set and invalid session id in Pcep Open message.
      */
     @Test
-    public void openMessageTest9() throws PcepParseException {
+    public void openMessageTest9() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x24, 0x01, 0x13, 0x00, 0x20, //p bit set & i bit set
                 0x20, 0x1e, 0x78, 0x00, //invalid sessionID
@@ -345,7 +346,7 @@
      * in Pcep Open message.
      */
     @Test
-    public void openMessageTest10() throws PcepParseException {
+    public void openMessageTest10() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x1C, // common header
                 0x01, 0x10, 0x00, 0x18, // common object header
@@ -382,7 +383,7 @@
      * PCECC-CAPABILITY-TLV, TED Capability TLV in Pcep Open message.
      */
     @Test
-    public void openMessageTest11() throws PcepParseException {
+    public void openMessageTest11() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x2C, // common header
                 0x01, 0x10, 0x00, 0x28, // common object header
@@ -390,7 +391,7 @@
                 0x00, 0x10, 0x00, 0x04, // STATEFUL-PCE-CAPABILITY
                 0x00, 0x00, 0x00, 0x05, 0x00, 0x0E, 0x00, 0x04, // GMPLS-CAPABILITY-TLV
                 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, // PCECC-CAPABILITY-TLV
-                0x00, 0x00, 0x00, 0x03, 0x00, (byte) 0x84, 0x00, 0x04, // TED Capability TLV
+                0x00, 0x00, 0x00, 0x03, (byte) 0xFF, (byte) 0x00, 0x00, 0x04, // LS Capability TLV
                 0x00, 0x00, 0x00, 0x00 };
 
         byte[] testOpenMsg = {0};
@@ -412,7 +413,6 @@
         buf.readBytes(testOpenMsg, 0, readLen);
 
         assertThat(testOpenMsg, is(openMsg));
-
     }
 
     /**
@@ -420,7 +420,7 @@
      * PCECC-CAPABILITY-TLV in Pcep Open message.
      */
     @Test
-    public void openMessageTest12() throws PcepParseException {
+    public void openMessageTest12() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x24, // common header
                 0x01, 0x10, 0x00, 0x20, // common object header
@@ -457,7 +457,7 @@
      * in Pcep Open message.
      */
     @Test
-    public void openMessageTest13() throws PcepParseException {
+    public void openMessageTest13() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x1c, // common header
                 0x01, 0x10, 0x00, 0x18, // common object header
@@ -493,7 +493,7 @@
      * This test case checks open object with STATEFUL-PCE-CAPABILITY in Pcep Open message.
      */
     @Test
-    public void openMessageTest14() throws PcepParseException {
+    public void openMessageTest14() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x14, // common header
                 0x01, 0x10, 0x00, 0x10, // common object header
@@ -527,7 +527,7 @@
      * This test case checks open object with no tlv Pcep Open message.
      */
     @Test
-    public void openMessageTest15() throws PcepParseException {
+    public void openMessageTest15() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] openMsg = new byte[] {0x20, 0x01, 0x00, 0x0c, // common header
                 0x01, 0x10, 0x00, 0x08, // common object header
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepReportMsgExtTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepReportMsgExtTest.java
index f9921ef..8a78e04 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepReportMsgExtTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepReportMsgExtTest.java
@@ -18,6 +18,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -32,7 +33,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest39() throws PcepParseException {
+    public void reportMessageTest39() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[] {0x20, 0x0a, 0x00, (byte) 0x98,
                 0x21, 0x10, 0x00, 0x0C,  0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x01, //SRP object
@@ -79,7 +80,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest40() throws PcepParseException {
+    public void reportMessageTest40() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[] {0x20, 0x0a, 0x00, (byte) 0x64,
                 0x21, 0x10, 0x00, 0x0C,  0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x01, //SRP object
@@ -120,7 +121,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest41() throws PcepParseException {
+    public void reportMessageTest41() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[] {0x20, 0x0a, 0x00, (byte) 0x8c,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP object
@@ -166,7 +167,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest42() throws PcepParseException {
+    public void reportMessageTest42() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[] {0x20, 0x0a, 0x00, (byte) 0xE8,
                 0x21, 0x10, 0x00, 0x0C,  0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x01, //SRP object
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepReportMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepReportMsgTest.java
index c9e2bc8..ff10078 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepReportMsgTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepReportMsgTest.java
@@ -18,6 +18,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -31,7 +32,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest1() throws PcepParseException {
+    public void reportMessageTest1() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, 0x24,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -66,7 +67,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest2() throws PcepParseException {
+    public void reportMessageTest2() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x7c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -111,7 +112,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest3() throws PcepParseException {
+    public void reportMessageTest3() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x70,
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP Object //LSP Object
@@ -155,7 +156,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest4() throws PcepParseException {
+    public void reportMessageTest4() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x64,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -197,7 +198,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest5() throws PcepParseException {
+    public void reportMessageTest5() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x50,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -237,7 +238,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest6() throws PcepParseException {
+    public void reportMessageTest6() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x6c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -279,7 +280,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest7() throws PcepParseException {
+    public void reportMessageTest7() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -318,7 +319,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest8() throws PcepParseException {
+    public void reportMessageTest8() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x70,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -361,7 +362,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest9() throws PcepParseException {
+    public void reportMessageTest9() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x44,
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP Object //LSP Object
@@ -399,7 +400,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest10() throws PcepParseException {
+    public void reportMessageTest10() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x74,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -442,7 +443,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest11() throws PcepParseException {
+    public void reportMessageTest11() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -483,7 +484,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest12() throws PcepParseException {
+    public void reportMessageTest12() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x60,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -523,7 +524,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest13() throws PcepParseException {
+    public void reportMessageTest13() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -564,7 +565,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest14() throws PcepParseException {
+    public void reportMessageTest14() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x60,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -604,7 +605,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest15() throws PcepParseException {
+    public void reportMessageTest15() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x7C,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -647,7 +648,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest16() throws PcepParseException {
+    public void reportMessageTest16() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x70,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -689,7 +690,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest17() throws PcepParseException {
+    public void reportMessageTest17() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x74,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -731,7 +732,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest18() throws PcepParseException {
+    public void reportMessageTest18() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -772,7 +773,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest19() throws PcepParseException {
+    public void reportMessageTest19() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x6C,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -813,7 +814,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest20() throws PcepParseException {
+    public void reportMessageTest20() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x88,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -858,7 +859,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest21() throws PcepParseException {
+    public void reportMessageTest21() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0xac,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -908,7 +909,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest22() throws PcepParseException {
+    public void reportMessageTest22() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0xA0,
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP Object
@@ -957,7 +958,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest23() throws PcepParseException {
+    public void reportMessageTest23() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x8c,
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP Object
@@ -1004,7 +1005,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest24() throws PcepParseException {
+    public void reportMessageTest24() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x84,
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP Object
@@ -1050,7 +1051,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest25() throws PcepParseException {
+    public void reportMessageTest25() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x8c,
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP Object
@@ -1097,7 +1098,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest26() throws PcepParseException {
+    public void reportMessageTest26() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x58,
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP Object
@@ -1138,7 +1139,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest27() throws PcepParseException {
+    public void reportMessageTest27() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x44,
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP Object
@@ -1177,7 +1178,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest28() throws PcepParseException {
+    public void reportMessageTest28() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x6c,
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP Object
@@ -1219,7 +1220,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest29() throws PcepParseException {
+    public void reportMessageTest29() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x74,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -1262,7 +1263,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest30() throws PcepParseException {
+    public void reportMessageTest30() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0xE4,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -1319,7 +1320,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest31() throws PcepParseException {
+    public void reportMessageTest31() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x01, 0x00,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -1379,7 +1380,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest32() throws PcepParseException {
+    public void reportMessageTest32() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x01, (byte) 0x14,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -1441,7 +1442,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest33() throws PcepParseException {
+    public void reportMessageTest33() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x01, (byte) 0x1c,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -1504,7 +1505,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest34() throws PcepParseException {
+    public void reportMessageTest34() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0xB4,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
@@ -1554,7 +1555,7 @@
      * in PcRpt message.
      */
     @Test
-    public void reportMessageTest35() throws PcepParseException {
+    public void reportMessageTest35() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] reportMsg = new byte[]{0x20, 0x0a, 0x00, (byte) 0x8C,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP Object
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepTEReportMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepTEReportMsgTest.java
deleted file mode 100644
index e401c15..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepTEReportMsgTest.java
+++ /dev/null
@@ -1,1596 +0,0 @@
-/*
- * Copyright 2014-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.pcepio.protocol;
-
-import org.jboss.netty.buffer.ChannelBuffer;
-import org.jboss.netty.buffer.ChannelBuffers;
-import org.junit.Test;
-import org.onosproject.pcepio.exceptions.PcepParseException;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.instanceOf;
-import static org.hamcrest.core.Is.is;
-
-public class PcepTEReportMsgTest {
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV, Local TE Node Descriptors TLV(AutonomousSystemTlv)).
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest1() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x28, // common header
-                0x0E, 0x10, 0x00, 0x24, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x08, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystem Tlv
-                0x00, 0x00, 0x00, 0x11};
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * T E Object (Routing Universe TLV, Local TE Node Descriptors TLV(AutonomousSystemTlv)) with different TE-ID.
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest2() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x28, // common header
-                0x0E, 0x10, 0x00, 0x24, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x08, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11};
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for  TE Object (Routing Universe TLV)
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest3() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x1c, // common header
-                0x0E, 0x10, 0x00, 0x18, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv.
-     * OSPFareaIDsubTlv, RouterIDSubTlv)).
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest4() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x44, // common header
-                0x0E, 0x10, 0x00, 0x40, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11};
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest5() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x3C, // common header
-                0x0E, 0x10, 0x00, 0x38, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x1C, // Local TE Node Descriptors TLV
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11};
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(OSPFareaIDsubTlv,
-     * RouterIDSubTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest6() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x34, // common header
-                0x0E, 0x10, 0x00, 0x30, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x14, // Local TE Node Descriptors TLV
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11};
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(RouterIDSubTlv)).
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest7() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x2C, // common header
-                0x0E, 0x10, 0x00, 0x28, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x0C, // Local TE Node Descriptors TLV
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11};
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for TE Object (Routing Universe TLV,Local TE Node Descriptors TLV)
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest8() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x20, // common header
-                0x0E, 0x10, 0x00, 0x1C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x00 // Local TE Node Descriptors TLV
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv.
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv.
-     * OSPFareaIDsubTlv, RouterIDSubTlv)).
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest9() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x6C, // common header
-                0x0E, 0x10, 0x00, 0x68, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest10() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x64, // common header
-                0x0E, 0x10, 0x00, 0x60, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x1C, //RemoteTENodeDescriptorsTLV
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(OSPFareaIDsubTlv, RouterIDSubTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest11() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x5C, // common header
-                0x0E, 0x10, 0x00, 0x58, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x14, //RemoteTENodeDescriptorsTLV
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(RouterIDSubTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest12() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x54, // common header
-                0x0E, 0x10, 0x00, 0x50, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x0c, //RemoteTENodeDescriptorsTLV
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV)
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest13() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, 0x48, // common header
-                0x0E, 0x10, 0x00, 0x44, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x00, //RemoteTENodeDescriptorsTLV
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(LinkLocalRemoteIdentifiersTlv
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest14() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, (byte) 0x8C, // common header
-                0x0E, 0x10, 0x00, (byte) 0x88, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x1C, //TELinkDescriptorsTLV
-                0x00, 0x04, 0x00, 0x08, //LinkLocalRemoteIdentifiersTlv
-                0x01, 0x11, 0x00, 0x09,
-                0x01, 0x21, 0x00, 0x09,
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest15() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, (byte) 0x80, // common header
-                0x0E, 0x10, 0x00, (byte) 0x7C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x10, //TELinkDescriptorsTLV
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(IPv4NeighborAddressTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest16() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, (byte) 0x78, // common header
-                0x0E, 0x10, 0x00, (byte) 0x74, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x08, //TELinkDescriptorsTLV
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV)
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest17() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, (byte) 0x70, // common header
-                0x0E, 0x10, 0x00, (byte) 0x6C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x00, //TELinkDescriptorsTLV
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(LinkLocalRemoteIdentifiersTlv
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest18() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, (byte) 0xC0, // common header
-                0x0E, 0x10, 0x00, (byte) 0xbC, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x1C, //TELinkDescriptorsTLV
-                0x00, 0x04, 0x00, 0x08, //LinkLocalRemoteIdentifiersTlv
-                0x01, 0x11, 0x00, 0x09,
-                0x01, 0x21, 0x00, 0x09,
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x04, (byte) 0xF3, 0x00, 0x30, //TENodeAttributesTlv
-                0x00, 0x0E, 0x00, 0x01, //NodeFlagBitsTlv
-                (byte) 0x90, 0x00, 0x00, 0x00,
-                0x03, (byte) 0xE9, 0x00, 0x04, //OpaqueNodeAttributeTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x03, (byte) 0xEF, 0x00, 0x08, //NodeNameTlv
-                0x08, 0x00, 0x01, 0x09,
-                0x08, 0x00, 0x01, 0x09,
-                0x00, 0x6B, 0x00, 0x08, //ISISAreaIdentifierTlv
-                0x20, 0x01, 0x22, 0x01,
-                0x20, 0x01, 0x22, 0x01,
-                0x00, (byte) 0x86, 0x00, 0x04, //IPv4TERouterIdOfLocalNodeTlv
-                0x00, 0x01, 0x01, 0x02
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(LinkLocalRemoteIdentifiersTlv
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv), TENodeAttributesTlv(NodeFlagBitsTlv
-     * OpaqueNodeAttributeTlv, NodeNameTlv, ISISAreaIdentifierTlv, IPv4TERouterIdOfLocalNodeTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest19() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, (byte) 0xC0, // common header
-                0x0E, 0x10, 0x00, (byte) 0xBC, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x1C, //TELinkDescriptorsTLV
-                0x00, 0x04, 0x00, 0x08, //LinkLocalRemoteIdentifiersTlv
-                0x01, 0x11, 0x00, 0x09,
-                0x01, 0x21, 0x00, 0x09,
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x04, (byte) 0xF3, 0x00, 0x30, //TENodeAttributesTlv
-                0x00, 0x0E, 0x00, 0x01, //NodeFlagBitsTlv
-                (byte) 0x90, 0x00, 0x00, 0x00,
-                0x03, (byte) 0xE9, 0x00, 0x04, //OpaqueNodeAttributeTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x03, (byte) 0xEF, 0x00, 0x08, //NodeNameTlv
-                0x08, 0x00, 0x01, 0x09,
-                0x08, 0x00, 0x01, 0x09,
-                0x00, 0x6B, 0x00, 0x08, //ISISAreaIdentifierTlv
-                0x20, 0x01, 0x22, 0x01,
-                0x20, 0x01, 0x22, 0x01,
-                0x00, (byte) 0x86, 0x00, 0x04, //IPv4TERouterIdOfLocalNodeTlv
-                0x00, 0x01, 0x01, 0x02
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(LinkLocalRemoteIdentifiersTlv
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv), TENodeAttributesTlv(OpaqueNodeAttributeTlv
-     * NodeNameTlv, ISISAreaIdentifierTlv, IPv4TERouterIdOfLocalNodeTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest20() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, (byte) 0xB8, // common header
-                0x0E, 0x10, 0x00, (byte) 0xB4, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x1C, //TELinkDescriptorsTLV
-                0x00, 0x04, 0x00, 0x08, //LinkLocalRemoteIdentifiersTlv
-                0x01, 0x11, 0x00, 0x09,
-                0x01, 0x21, 0x00, 0x09,
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x04, (byte) 0xF3, 0x00, 0x28, //TENodeAttributesTlv
-                0x03, (byte) 0xE9, 0x00, 0x04, //OpaqueNodeAttributeTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x03, (byte) 0xEF, 0x00, 0x08, //NodeNameTlv
-                0x08, 0x00, 0x01, 0x09,
-                0x08, 0x00, 0x01, 0x09,
-                0x00, 0x6B, 0x00, 0x08, //ISISAreaIdentifierTlv
-                0x20, 0x01, 0x22, 0x01,
-                0x20, 0x01, 0x22, 0x01,
-                0x00, (byte) 0x86, 0x00, 0x04, //IPv4TERouterIdOfLocalNodeTlv
-                0x00, 0x01, 0x01, 0x02
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(LinkLocalRemoteIdentifiersTlv.
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv), TENodeAttributesTlv(OpaqueNodeAttributeTlv
-     * ISISAreaIdentifierTlv, IPv4TERouterIdOfLocalNodeTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest21() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x00, (byte) 0xAC, // common header
-                0x0E, 0x10, 0x00, (byte) 0xA8, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x1C, //TELinkDescriptorsTLV
-                0x00, 0x04, 0x00, 0x08, //LinkLocalRemoteIdentifiersTlv
-                0x01, 0x11, 0x00, 0x09,
-                0x01, 0x21, 0x00, 0x09,
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x04, (byte) 0xF3, 0x00, 0x1C, //TENodeAttributesTlv
-                0x03, (byte) 0xE9, 0x00, 0x04, //OpaqueNodeAttributeTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x00, 0x6B, 0x00, 0x08, //ISISAreaIdentifierTlv
-                0x20, 0x01, 0x22, 0x01,
-                0x20, 0x01, 0x22, 0x01,
-                0x00, (byte) 0x86, 0x00, 0x04, //IPv4TERouterIdOfLocalNodeTlv
-                0x00, 0x01, 0x01, 0x02
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv.
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv.
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(LinkLocalRemoteIdentifiersTlv.
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv), TENodeAttributesTlv(NodeFlagBitsTlv.
-     * OpaqueNodeAttributeTlv, NodeNameTlv, ISISAreaIdentifierTlv, IPv4TERouterIdOfLocalNodeTlv).
-     * TELinkAttributesTlv(IPv4TERouterIdOfRemoteNodeTlv, IPv6TERouterIdofRemoteNodeTlv, AdministrativeGroupTlv.
-     * MaximumLinkBandwidthTlv, MaximumReservableLinkBandwidthTlv, UnreservedBandwidthTlv, TEDefaultMetricTlv.
-     * LinkProtectionTypeTlv, MPLSProtocolMaskTlv, IGPMetricTlv:, SharedRiskLinkGroupTlv.
-     * OpaqueLinkAttributeTlv, LinkNameTlv)).
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest22() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x01, (byte) 0x120, // common header
-                0x0E, 0x10, 0x01, (byte) 0x1C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x1C, //TELinkDescriptorsTLV
-                0x00, 0x04, 0x00, 0x08, //LinkLocalRemoteIdentifiersTlv
-                0x01, 0x11, 0x00, 0x09,
-                0x01, 0x21, 0x00, 0x09,
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x04, (byte) 0xF3, 0x00, 0x28, //TENodeAttributesTlv
-                0x03, (byte) 0xE9, 0x00, 0x04, //OpaqueNodeAttributeTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x03, (byte) 0xEF, 0x00, 0x08, //NodeNameTlv
-                0x08, 0x00, 0x01, 0x09,
-                0x08, 0x00, 0x01, 0x09,
-                0x00, 0x6B, 0x00, 0x08, //ISISAreaIdentifierTlv
-                0x20, 0x01, 0x22, 0x01,
-                0x20, 0x01, 0x22, 0x01,
-                0x00, (byte) 0x86, 0x00, 0x04, //IPv4TERouterIdOfLocalNodeTlv
-                0x00, 0x01, 0x01, 0x02,
-                0x07, 0x69, 0x00, 0x64, //TELinkAttributesTlv
-                0x05, 0x3C, 0x00, 0x04, //IPv4TERouterIdOfRemoteNodeTlv
-                0x00, 0x07, 0x08, 0x00,
-                0x00, 0x03, 0x00, 0x04, //AdministrativeGroupTlv
-                0x00, 0x09, 0x08, 0x00,
-                0x00, 0x09, 0x00, 0x04, //MaximumLinkBandwidthTlv
-                0x00, 0x09, 0x00, 0x00,
-                0x00, 0x0a, 0x00, 0x04, //MaximumReservableLinkBandwidthTlv
-                0x00, 0x10, 0x00, 0x00,
-                0x00, 0x0b, 0x00, 0x04, //UnreservedBandwidthTlv
-                0x00, 0x00, (byte) 0x90, 0x00,
-                0x34, 0x58, 0x00, 0x04, //TEDefaultMetricTlv
-                0x00, (byte) 0x99, 0x09, 0x00,
-                0x00, 0x14, 0x00, 0x02, //LinkProtectionTypeTlv
-                0x09, 0x00, 0x00, 0x00,
-                0x04, 0x46, 0x00, 0x01, //MPLSProtocolMaskTlv
-                (byte) 0x80, 0x00, 0x00, 0x00,
-                0x04, 0x47, 0x00, 0x03, //IGPMetricTlv
-                0x09, (byte) 0x89, 0x07, 0x00,
-                0x04, 0x48, 0x00, 0x08, //SharedRiskLinkGroupTlv
-                0x04, 0x47, 0x00, 0x03,
-                0x04, 0x47, 0x00, 0x03, //OpaqueLinkAttributeTlv
-                0x04, 0x49, 0x00, 0x04,
-                0x04, 0x47, 0x00, 0x03,
-                0x04, 0x4A, 0x00, 0x04, //LinkNameTlv
-                0x04, 0x47, 0x00, 0x03
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(LinkLocalRemoteIdentifiersTlv
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv), TENodeAttributesTlv(NodeFlagBitsTlv
-     * OpaqueNodeAttributeTlv, NodeNameTlv, ISISAreaIdentifierTlv, IPv4TERouterIdOfLocalNodeTlv)
-     * TELinkAttributesTlv(IPv4TERouterIdOfRemoteNodeTlv, IPv6TERouterIdofRemoteNodeTlv, AdministrativeGroupTlv
-     * MaximumLinkBandwidthTlv, MaximumReservableLinkBandwidthTlv, UnreservedBandwidthTlv, TEDefaultMetricTlv
-     * LinkProtectionTypeTlv, MPLSProtocolMaskTlv, IGPMetricTlv:, SharedRiskLinkGroupTlv
-     * OpaqueLinkAttributeTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest23() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x01, (byte) 0x118, // common header
-                0x0E, 0x10, 0x01, (byte) 0x14, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x1C, //TELinkDescriptorsTLV
-                0x00, 0x04, 0x00, 0x08, //LinkLocalRemoteIdentifiersTlv
-                0x01, 0x11, 0x00, 0x09,
-                0x01, 0x21, 0x00, 0x09,
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x04, (byte) 0xF3, 0x00, 0x28, //TENodeAttributesTlv
-                0x03, (byte) 0xE9, 0x00, 0x04, //OpaqueNodeAttributeTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x03, (byte) 0xEF, 0x00, 0x08, //NodeNameTlv
-                0x08, 0x00, 0x01, 0x09,
-                0x08, 0x00, 0x01, 0x09,
-                0x00, 0x6B, 0x00, 0x08, //ISISAreaIdentifierTlv
-                0x20, 0x01, 0x22, 0x01,
-                0x20, 0x01, 0x22, 0x01,
-                0x00, (byte) 0x86, 0x00, 0x04, //IPv4TERouterIdOfLocalNodeTlv
-                0x00, 0x01, 0x01, 0x02,
-                0x07, 0x69, 0x00, 0x5C, //TELinkAttributesTlv
-                0x05, 0x3C, 0x00, 0x04, //IPv4TERouterIdOfRemoteNodeTlv
-                0x00, 0x07, 0x08, 0x00,
-                0x00, 0x03, 0x00, 0x04, //AdministrativeGroupTlv
-                0x00, 0x09, 0x08, 0x00,
-                0x00, 0x09, 0x00, 0x04, //MaximumLinkBandwidthTlv
-                0x00, 0x09, 0x00, 0x00,
-                0x00, 0x0a, 0x00, 0x04, //MaximumReservableLinkBandwidthTlv
-                0x00, 0x10, 0x00, 0x00,
-                0x00, 0x0b, 0x00, 0x04, //UnreservedBandwidthTlv
-                0x00, 0x00, (byte) 0x90, 0x00,
-                0x34, 0x58, 0x00, 0x04, //TEDefaultMetricTlv
-                0x00, (byte) 0x99, 0x09, 0x00,
-                0x00, 0x14, 0x00, 0x02, //LinkProtectionTypeTlv
-                0x09, 0x00, 0x00, 0x00,
-                0x04, 0x46, 0x00, 0x01, //MPLSProtocolMaskTlv
-                (byte) 0x80, 0x00, 0x00, 0x00,
-                0x04, 0x47, 0x00, 0x03, //IGPMetricTlv
-                0x09, (byte) 0x89, 0x07, 0x00,
-                0x04, 0x48, 0x00, 0x08, //SharedRiskLinkGroupTlv
-                0x04, 0x47, 0x00, 0x03,
-                0x04, 0x47, 0x00, 0x03, //OpaqueLinkAttributeTlv
-                0x04, 0x49, 0x00, 0x04,
-                0x04, 0x47, 0x00, 0x03
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(LinkLocalRemoteIdentifiersTlv
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv), TENodeAttributesTlv(NodeFlagBitsTlv
-     * OpaqueNodeAttributeTlv, NodeNameTlv, ISISAreaIdentifierTlv, IPv4TERouterIdOfLocalNodeTlv)
-     * TELinkAttributesTlv(IPv4TERouterIdOfRemoteNodeTlv, IPv6TERouterIdofRemoteNodeTlv, AdministrativeGroupTlv
-     * MaximumLinkBandwidthTlv, MaximumReservableLinkBandwidthTlv, UnreservedBandwidthTlv, TEDefaultMetricTlv
-     * LinkProtectionTypeTlv, MPLSProtocolMaskTlv, IGPMetricTlv:, SharedRiskLinkGroupTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest24() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x01, (byte) 0x110, // common header
-                0x0E, 0x10, 0x01, (byte) 0x0C, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x1C, //TELinkDescriptorsTLV
-                0x00, 0x04, 0x00, 0x08, //LinkLocalRemoteIdentifiersTlv
-                0x01, 0x11, 0x00, 0x09,
-                0x01, 0x21, 0x00, 0x09,
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x04, (byte) 0xF3, 0x00, 0x28, //TENodeAttributesTlv
-                0x03, (byte) 0xE9, 0x00, 0x04, //OpaqueNodeAttributeTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x03, (byte) 0xEF, 0x00, 0x08, //NodeNameTlv
-                0x08, 0x00, 0x01, 0x09,
-                0x08, 0x00, 0x01, 0x09,
-                0x00, 0x6B, 0x00, 0x08, //ISISAreaIdentifierTlv
-                0x20, 0x01, 0x22, 0x01,
-                0x20, 0x01, 0x22, 0x01,
-                0x00, (byte) 0x86, 0x00, 0x04, //IPv4TERouterIdOfLocalNodeTlv
-                0x00, 0x01, 0x01, 0x02,
-                0x07, 0x69, 0x00, 0x54, //TELinkAttributesTlv
-                0x05, 0x3C, 0x00, 0x04, //IPv4TERouterIdOfRemoteNodeTlv
-                0x00, 0x07, 0x08, 0x00,
-                0x00, 0x03, 0x00, 0x04, //AdministrativeGroupTlv
-                0x00, 0x09, 0x08, 0x00,
-                0x00, 0x09, 0x00, 0x04, //MaximumLinkBandwidthTlv
-                0x00, 0x09, 0x00, 0x00,
-                0x00, 0x0a, 0x00, 0x04, //MaximumReservableLinkBandwidthTlv
-                0x00, 0x10, 0x00, 0x00,
-                0x00, 0x0b, 0x00, 0x04, //UnreservedBandwidthTlv
-                0x00, 0x00, (byte) 0x90, 0x00,
-                0x34, 0x58, 0x00, 0x04, //TEDefaultMetricTlv
-                0x00, (byte) 0x99, 0x09, 0x00,
-                0x00, 0x14, 0x00, 0x02, //LinkProtectionTypeTlv
-                0x09, 0x00, 0x00, 0x00,
-                0x04, 0x46, 0x00, 0x01, //MPLSProtocolMaskTlv
-                (byte) 0x80, 0x00, 0x00, 0x00,
-                0x04, 0x47, 0x00, 0x03, //IGPMetricTlv
-                0x09, (byte) 0x89, 0x07, 0x00,
-                0x04, 0x48, 0x00, 0x08, //SharedRiskLinkGroupTlv
-                0x04, 0x47, 0x00, 0x03,
-                0x04, 0x47, 0x00, 0x03
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-
-    /**
-     * This test case checks for
-     * TE Object (Routing Universe TLV,Local TE Node Descriptors TLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), RemoteTENodeDescriptorsTLV(AutonomousSystemTlv, BGPLSidentifierTlv
-     * OSPFareaIDsubTlv, RouterIDSubTlv), TELinkDescriptorsTLV(LinkLocalRemoteIdentifiersTlv
-     * IPv4InterfaceAddressTlv, IPv4NeighborAddressTlv), TENodeAttributesTlv(NodeFlagBitsTlv
-     * OpaqueNodeAttributeTlv, NodeNameTlv, ISISAreaIdentifierTlv, IPv4TERouterIdOfLocalNodeTlv)
-     * TELinkAttributesTlv(IPv4TERouterIdOfRemoteNodeTlv, IPv6TERouterIdofRemoteNodeTlv, AdministrativeGroupTlv
-     * MaximumLinkBandwidthTlv, MaximumReservableLinkBandwidthTlv, UnreservedBandwidthTlv, TEDefaultMetricTlv
-     * LinkProtectionTypeTlv, MPLSProtocolMaskTlv, IGPMetricTlv))
-     * in PcTERpt message.
-     */
-    @Test
-    public void teReportMessageTest25() throws PcepParseException {
-
-        byte[] teReportMsg = new byte[]{0x20, 0x0E, 0x01, (byte) 0x104, // common header
-                0x0E, 0x10, 0x01, 0x00, // TE Object Header
-                0x01, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x10, // TE-ID
-                0x00, 0x0E, 0x00, 0x08, // Routing Universe TLV
-                0x00, 0x00, 0x00, 0x00,
-                0x00, 0x00, 0x00, 0x01,
-                0x06, 0x65, 0x00, 0x24, // Local TE Node Descriptors TLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xEB, 0x00, 0x24, //RemoteTENodeDescriptorsTLV
-                0x00, 0x64, 0x00, 0x04, //AutonomousSystemTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x11, 0x00, 0x04, //BGPLSidentifierTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x02, 0x58, 0x00, 0x04, //OSPFareaIDsubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x03, (byte) 0xE8, 0x00, 0x08, //RouterIDSubTlv
-                0x00, 0x00, 0x00, 0x11,
-                0x00, 0x00, 0x00, 0x11,
-                0x04, 0x2E, 0x00, 0x1C, //TELinkDescriptorsTLV
-                0x00, 0x04, 0x00, 0x08, //LinkLocalRemoteIdentifiersTlv
-                0x01, 0x11, 0x00, 0x09,
-                0x01, 0x21, 0x00, 0x09,
-                0x00, 0x06, 0x00, 0x04, //IPv4InterfaceAddressTlv
-                0x01, 0x01, 0x01, 0x01,
-                0x00, 0x08, 0x00, 0x04, //IPv4NeighborAddressTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x04, (byte) 0xF3, 0x00, 0x28, //TENodeAttributesTlv
-                0x03, (byte) 0xE9, 0x00, 0x04, //OpaqueNodeAttributeTlv
-                0x01, 0x011, 0x01, 0x10,
-                0x03, (byte) 0xEF, 0x00, 0x08, //NodeNameTlv
-                0x08, 0x00, 0x01, 0x09,
-                0x08, 0x00, 0x01, 0x09,
-                0x00, 0x6B, 0x00, 0x08, //ISISAreaIdentifierTlv
-                0x20, 0x01, 0x22, 0x01,
-                0x20, 0x01, 0x22, 0x01,
-                0x00, (byte) 0x86, 0x00, 0x04, //IPv4TERouterIdOfLocalNodeTlv
-                0x00, 0x01, 0x01, 0x02,
-                0x07, 0x69, 0x00, 0x48, //TELinkAttributesTlv
-                0x05, 0x3C, 0x00, 0x04, //IPv4TERouterIdOfRemoteNodeTlv
-                0x00, 0x07, 0x08, 0x00,
-                0x00, 0x03, 0x00, 0x04, //AdministrativeGroupTlv
-                0x00, 0x09, 0x08, 0x00,
-                0x00, 0x09, 0x00, 0x04, //MaximumLinkBandwidthTlv
-                0x00, 0x09, 0x00, 0x00,
-                0x00, 0x0a, 0x00, 0x04, //MaximumReservableLinkBandwidthTlv
-                0x00, 0x10, 0x00, 0x00,
-                0x00, 0x0b, 0x00, 0x04, //UnreservedBandwidthTlv
-                0x00, 0x00, (byte) 0x90, 0x00,
-                0x34, 0x58, 0x00, 0x04, //TEDefaultMetricTlv
-                0x00, (byte) 0x99, 0x09, 0x00,
-                0x00, 0x14, 0x00, 0x02, //LinkProtectionTypeTlv
-                0x09, 0x00, 0x00, 0x00,
-                0x04, 0x46, 0x00, 0x01, //MPLSProtocolMaskTlv
-                (byte) 0x80, 0x00, 0x00, 0x00,
-                0x04, 0x47, 0x00, 0x03, //IGPMetricTlv
-                0x09, (byte) 0x89, 0x07, 0x00
-        };
-
-        ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
-        buffer.writeBytes(teReportMsg);
-
-        PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
-        PcepMessage message = null;
-
-        message = reader.readFrom(buffer);
-
-        byte[] testReportMsg = {0};
-
-        assertThat(message, instanceOf(PcepTEReportMsg.class));
-        ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
-        message.writeTo(buf);
-
-        int readLen = buf.writerIndex();
-        testReportMsg = new byte[readLen];
-        buf.readBytes(testReportMsg, 0, readLen);
-
-        assertThat(testReportMsg, is(teReportMsg));
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepUpdateMsgExtTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepUpdateMsgExtTest.java
index 40234a6..fd21ba2 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepUpdateMsgExtTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepUpdateMsgExtTest.java
@@ -18,6 +18,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -34,7 +35,7 @@
      * Metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest1() throws PcepParseException {
+    public void pcepUpdateMsgTest1() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x8c,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -80,7 +81,7 @@
      * LSPA, Bandwidth object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest2() throws PcepParseException {
+    public void pcepUpdateMsgTest2() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -121,7 +122,7 @@
      * Metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest3() throws PcepParseException {
+    public void pcepUpdateMsgTest3() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x08, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -159,7 +160,7 @@
      * Metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest4() throws PcepParseException {
+    public void pcepUpdateMsgTest4() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x5c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -198,7 +199,7 @@
      * Metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest5() throws PcepParseException {
+    public void pcepUpdateMsgTest5() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x60,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x14, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -238,7 +239,7 @@
      * Metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest6() throws PcepParseException {
+    public void pcepUpdateMsgTest6() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x5c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -277,7 +278,7 @@
      * bandwidth object Metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest7() throws PcepParseException {
+    public void pcepUpdateMsgTest7() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x64,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -317,7 +318,7 @@
      * bandwidth object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest8() throws PcepParseException {
+    public void pcepUpdateMsgTest8() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x5c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -357,7 +358,7 @@
      * bandwidth object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest9() throws PcepParseException {
+    public void pcepUpdateMsgTest9() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x18, 0x00, 0x00, 0x10, 0x03,
@@ -396,7 +397,7 @@
      * bandwidth object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest10() throws PcepParseException {
+    public void pcepUpdateMsgTest10() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x50,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -434,7 +435,7 @@
      * bandwidth object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest11() throws PcepParseException {
+    public void pcepUpdateMsgTest11() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x14, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -473,7 +474,7 @@
      * bandwidth object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest12() throws PcepParseException {
+    public void pcepUpdateMsgTest12() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x50,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -511,7 +512,7 @@
      * bandwidth object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest13() throws PcepParseException {
+    public void pcepUpdateMsgTest13() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -550,7 +551,7 @@
      * metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest14() throws PcepParseException {
+    public void pcepUpdateMsgTest14() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x60,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -590,7 +591,7 @@
      * metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest15() throws PcepParseException {
+    public void pcepUpdateMsgTest15() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x4c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x08, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -627,7 +628,7 @@
      * metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest16() throws PcepParseException {
+    public void pcepUpdateMsgTest16() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -665,7 +666,7 @@
      * metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest17() throws PcepParseException {
+    public void pcepUpdateMsgTest17() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x14, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -704,7 +705,7 @@
      * metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest18() throws PcepParseException {
+    public void pcepUpdateMsgTest18() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -742,7 +743,7 @@
      * metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest19() throws PcepParseException {
+    public void pcepUpdateMsgTest19() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x5c,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -781,7 +782,7 @@
      * Bandwidth , metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest20() throws PcepParseException {
+    public void pcepUpdateMsgTest20() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -820,7 +821,7 @@
      * Bandwidth , metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest21() throws PcepParseException {
+    public void pcepUpdateMsgTest21() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x40,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x08, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -856,7 +857,7 @@
      * Bandwidth , metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest22() throws PcepParseException {
+    public void pcepUpdateMsgTest22() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x48,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -893,7 +894,7 @@
      * Bandwidth , metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest23() throws PcepParseException {
+    public void pcepUpdateMsgTest23() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x4c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x14, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -931,7 +932,7 @@
      * Bandwidth , metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest24() throws PcepParseException {
+    public void pcepUpdateMsgTest24() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x48,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -968,7 +969,7 @@
      * Bandwidth , metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest25() throws PcepParseException {
+    public void pcepUpdateMsgTest25() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x50,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1006,7 +1007,7 @@
      * LSPA object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest26() throws PcepParseException {
+    public void pcepUpdateMsgTest26() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1C, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -1045,7 +1046,7 @@
      * bandwidth object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest27() throws PcepParseException {
+    public void pcepUpdateMsgTest27() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x34,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x08, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -1080,7 +1081,7 @@
      * metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest28() throws PcepParseException {
+    public void pcepUpdateMsgTest28() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x40,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x10, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -1116,7 +1117,7 @@
      * lspa object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest29() throws PcepParseException {
+    public void pcepUpdateMsgTest29() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1155,7 +1156,7 @@
      * bandwidth object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest30() throws PcepParseException {
+    public void pcepUpdateMsgTest30() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x48,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1193,7 +1194,7 @@
      * metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest31() throws PcepParseException {
+    public void pcepUpdateMsgTest31() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x4c,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
@@ -1231,7 +1232,7 @@
      * Metric object in PcepUpdate message.
      */
     @Test
-    public void pcepUpdateMsgTest32() throws PcepParseException {
+    public void pcepUpdateMsgTest32() throws PcepParseException, PcepOutOfBoundMessageException {
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x64,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepUpdateMsgTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepUpdateMsgTest.java
index 1db3064..3d0ba27 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepUpdateMsgTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/protocol/PcepUpdateMsgTest.java
@@ -18,6 +18,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
 import org.junit.Test;
+import org.onosproject.pcepio.exceptions.PcepOutOfBoundMessageException;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -29,7 +30,7 @@
      * This test case checks for SRP, LSP (StatefulIPv4LspIdentidiersTlv), ERO in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest1() throws PcepParseException {
+    public void pcepUpdateMsgTest1() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x30,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -64,7 +65,7 @@
      * SymbolicPathNameTlv, StatefulLspErrorCodeTlv), ERO, LSPA, Metric-list in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest2() throws PcepParseException {
+    public void pcepUpdateMsgTest2() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x94,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -108,7 +109,7 @@
      * ERO objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest3() throws PcepParseException {
+    public void pcepUpdateMsgTest3() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x38,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -145,7 +146,7 @@
      * SymbolicPathNameTlv), ERO objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest4() throws PcepParseException {
+    public void pcepUpdateMsgTest4() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x40,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -183,7 +184,7 @@
      * SymbolicPathNameTlv), ERO objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest5() throws PcepParseException {
+    public void pcepUpdateMsgTest5() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x40,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -221,7 +222,7 @@
      * StatefulLspErrorCodeTlv), ERO objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest6() throws PcepParseException {
+    public void pcepUpdateMsgTest6() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x48,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -261,7 +262,7 @@
      * StatefulLspErrorCodeTlv), ERO objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest7() throws PcepParseException {
+    public void pcepUpdateMsgTest7() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x48,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -299,7 +300,7 @@
      * StatefulLspErrorCodeTlv), ERO (IPv4SubObject) objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest8() throws PcepParseException {
+    public void pcepUpdateMsgTest8() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x50,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -339,7 +340,7 @@
      * StatefulLspErrorCodeTlv), ERO (IPv4SubObject, IPv4SubObject) objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest9() throws PcepParseException {
+    public void pcepUpdateMsgTest9() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -380,7 +381,7 @@
      * StatefulLspErrorCodeTlv), ERO (IPv4SubObject, IPv4SubObject), LSPA objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest10() throws PcepParseException {
+    public void pcepUpdateMsgTest10() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x6c,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -423,7 +424,7 @@
      * StatefulLspErrorCodeTlv), ERO (IPv4SubObject, IPv4SubObject),LSPA, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest11() throws PcepParseException {
+    public void pcepUpdateMsgTest11() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x78,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -467,7 +468,7 @@
      * StatefulLspErrorCodeTlv), ERO (IPv4SubObject, IPv4SubObject),LSPA, metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest12() throws PcepParseException {
+    public void pcepUpdateMsgTest12() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x70,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -510,7 +511,7 @@
      * StatefulLspErrorCodeTlv), ERO (IPv4SubObject, IPv4SubObject),LSPA, metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest13() throws PcepParseException {
+    public void pcepUpdateMsgTest13() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x70,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -553,7 +554,7 @@
      * ERO (IPv4SubObject, IPv4SubObject),LSPA, metric Object objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest14() throws PcepParseException {
+    public void pcepUpdateMsgTest14() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -595,7 +596,7 @@
      * ERO (IPv4SubObject, IPv4SubObject),LSPA, metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest15() throws PcepParseException {
+    public void pcepUpdateMsgTest15() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -637,7 +638,7 @@
      * ERO (IPv4SubObject, IPv4SubObject),LSPA, metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest16() throws PcepParseException {
+    public void pcepUpdateMsgTest16() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x60,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -678,7 +679,7 @@
      * ERO (IPv4SubObject, IPv4SubObject),LSPA objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest17() throws PcepParseException {
+    public void pcepUpdateMsgTest17() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -718,7 +719,7 @@
      * ERO (IPv4SubObject, IPv4SubObject),Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest18() throws PcepParseException {
+    public void pcepUpdateMsgTest18() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x4c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -757,7 +758,7 @@
      * ERO (IPv4SubObject, IPv4SubObject),Metric-list objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest19() throws PcepParseException {
+    public void pcepUpdateMsgTest19() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x58,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -797,7 +798,7 @@
      * StatefulLspErrorCodeTlv),ERO (IPv4SubObject, IPv4SubObject),LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest20() throws PcepParseException {
+    public void pcepUpdateMsgTest20() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x80,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -842,7 +843,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), Bandwidth objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest21() throws PcepParseException {
+    public void pcepUpdateMsgTest21() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x48,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -881,7 +882,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest22() throws PcepParseException {
+    public void pcepUpdateMsgTest22() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x5C,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -922,7 +923,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest23() throws PcepParseException {
+    public void pcepUpdateMsgTest23() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -964,7 +965,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest24() throws PcepParseException {
+    public void pcepUpdateMsgTest24() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x70,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1007,7 +1008,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest25() throws PcepParseException {
+    public void pcepUpdateMsgTest25() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x70,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1051,7 +1052,7 @@
      * Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest26() throws PcepParseException {
+    public void pcepUpdateMsgTest26() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x78,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1095,7 +1096,7 @@
      * Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest27() throws PcepParseException {
+    public void pcepUpdateMsgTest27() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x78,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1140,7 +1141,7 @@
      * LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest28() throws PcepParseException {
+    public void pcepUpdateMsgTest28() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x80,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1185,7 +1186,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest29() throws PcepParseException {
+    public void pcepUpdateMsgTest29() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x68,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1227,7 +1228,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest30() throws PcepParseException {
+    public void pcepUpdateMsgTest30() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1266,7 +1267,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest31() throws PcepParseException {
+    public void pcepUpdateMsgTest31() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x5c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1306,7 +1307,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest32() throws PcepParseException {
+    public void pcepUpdateMsgTest32() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1345,7 +1346,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest33() throws PcepParseException {
+    public void pcepUpdateMsgTest33() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x5c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
@@ -1385,7 +1386,7 @@
      * ERO (IPv4SubObject, IPv4SubObject), LSPA, Bandwidth, Metric objects in PcUpd message.
      */
     @Test
-    public void pcepUpdateMsgTest34() throws PcepParseException {
+    public void pcepUpdateMsgTest34() throws PcepParseException, PcepOutOfBoundMessageException {
 
         byte[] updateMsg = new byte[] {0x20, 0x0b, 0x00, (byte) 0x64,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AdministrativeGroupSubTlvTest.java
similarity index 72%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AdministrativeGroupSubTlvTest.java
index 5f10b4c..2ec8b4a 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AdministrativeGroupSubTlvTest.java
@@ -19,13 +19,12 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv4NeighborAddressTlv.
+ * Test of the AdministrativeGroupSubTlv.
  */
-public class IPv4NeighborAddressTlvTest {
-
-    private final IPv4NeighborAddressTlv tlv1 = IPv4NeighborAddressTlv.of(2);
-    private final IPv4NeighborAddressTlv sameAsTlv1 = IPv4NeighborAddressTlv.of(2);
-    private final IPv4NeighborAddressTlv tlv2 = IPv4NeighborAddressTlv.of(3);
+public class AdministrativeGroupSubTlvTest {
+    private final AdministrativeGroupSubTlv tlv1 = AdministrativeGroupSubTlv.of(1);
+    private final AdministrativeGroupSubTlv sameAsTlv1 = AdministrativeGroupSubTlv.of(1);
+    private final AdministrativeGroupSubTlv tlv2 = AdministrativeGroupSubTlv.of(2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AdministrativeGroupTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AdministrativeGroupTlvTest.java
deleted file mode 100644
index 41e8844..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AdministrativeGroupTlvTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * Test of the AdministrativeGroupTlv.
- */
-public class AdministrativeGroupTlvTest {
-    private final AdministrativeGroupTlv tlv1 = AdministrativeGroupTlv.of(1);
-    private final AdministrativeGroupTlv sameAsTlv1 = AdministrativeGroupTlv.of(1);
-    private final AdministrativeGroupTlv tlv2 = AdministrativeGroupTlv.of(2);
-
-    @Test
-    public void basics() {
-        new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
-        .testEquals();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AutonomousSystemNumberSubObjectTest.java
similarity index 61%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AutonomousSystemNumberSubObjectTest.java
index 4e022b8..83bb86f 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AutonomousSystemNumberSubObjectTest.java
@@ -19,21 +19,19 @@
 import org.junit.Test;
 
 /**
- * Test of the MaximumLinkBandwidthTlv.
+ * Test of the AutonomousSystemNumberSubObject.
  */
-public class MaximumLinkBandwidthTlvTest {
-    private final int rawValue1 = 0x0A;
-    private final int rawValue2 = 0x0B;
+public class AutonomousSystemNumberSubObjectTest {
 
-    private final MaximumLinkBandwidthTlv tlv1 = new MaximumLinkBandwidthTlv(rawValue1);
-    private final MaximumLinkBandwidthTlv sameAsTlv1 = new MaximumLinkBandwidthTlv(rawValue1);
-    private final MaximumLinkBandwidthTlv tlv2 = MaximumLinkBandwidthTlv.of(rawValue2);
+    private final AutonomousSystemNumberSubObject subObj1 = AutonomousSystemNumberSubObject.of((short) 2);
+    private final AutonomousSystemNumberSubObject sameAsSubObj1 = AutonomousSystemNumberSubObject.of((short) 2);
+    private final AutonomousSystemNumberSubObject subObj2 = AutonomousSystemNumberSubObject.of((short) 3);
 
     @Test
     public void basics() {
         new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
+        .addEqualityGroup(subObj1, sameAsSubObj1)
+        .addEqualityGroup(subObj2)
         .testEquals();
     }
 }
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AutonomousSystemSubTlvTest.java
similarity index 73%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AutonomousSystemSubTlvTest.java
index 5f10b4c..a959af7 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AutonomousSystemSubTlvTest.java
@@ -19,13 +19,12 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv4NeighborAddressTlv.
+ * Test of the AutonomousSystemSubTlv.
  */
-public class IPv4NeighborAddressTlvTest {
-
-    private final IPv4NeighborAddressTlv tlv1 = IPv4NeighborAddressTlv.of(2);
-    private final IPv4NeighborAddressTlv sameAsTlv1 = IPv4NeighborAddressTlv.of(2);
-    private final IPv4NeighborAddressTlv tlv2 = IPv4NeighborAddressTlv.of(3);
+public class AutonomousSystemSubTlvTest {
+    private final AutonomousSystemSubTlv tlv1 = AutonomousSystemSubTlv.of(1);
+    private final AutonomousSystemSubTlv sameAsTlv1 = AutonomousSystemSubTlv.of(1);
+    private final AutonomousSystemSubTlv tlv2 = AutonomousSystemSubTlv.of(2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AutonomousSystemTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/BgpLsIdentifierSubTlvTest.java
similarity index 74%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AutonomousSystemTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/BgpLsIdentifierSubTlvTest.java
index 904a71e..222c468 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/AutonomousSystemTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/BgpLsIdentifierSubTlvTest.java
@@ -19,12 +19,12 @@
 import org.junit.Test;
 
 /**
- * Test of the AutonomousSystemTlv.
+ * Test of the BgpLsIdentifierSubTlv.
  */
-public class AutonomousSystemTlvTest {
-    private final AutonomousSystemTlv tlv1 = AutonomousSystemTlv.of(1);
-    private final AutonomousSystemTlv sameAsTlv1 = AutonomousSystemTlv.of(1);
-    private final AutonomousSystemTlv tlv2 = AutonomousSystemTlv.of(2);
+public class BgpLsIdentifierSubTlvTest {
+    private final BgpLsIdentifierSubTlv tlv1 = BgpLsIdentifierSubTlv.of(1);
+    private final BgpLsIdentifierSubTlv sameAsTlv1 = BgpLsIdentifierSubTlv.of(1);
+    private final BgpLsIdentifierSubTlv tlv2 = BgpLsIdentifierSubTlv.of(2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/BgpLsIdentifierTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/BgpLsIdentifierTlvTest.java
deleted file mode 100644
index 78137a7..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/BgpLsIdentifierTlvTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * Test of the BGPLSidentifierTlv.
- */
-public class BgpLsIdentifierTlvTest {
-    private final BgpLsIdentifierTlv tlv1 = BgpLsIdentifierTlv.of(1);
-    private final BgpLsIdentifierTlv sameAsTlv1 = BgpLsIdentifierTlv.of(1);
-    private final BgpLsIdentifierTlv tlv2 = BgpLsIdentifierTlv.of(2);
-
-    @Test
-    public void basics() {
-        new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
-        .testEquals();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressSubTlvTest.java
similarity index 71%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressSubTlvTest.java
index 5f10b4c..40574a9 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressSubTlvTest.java
@@ -19,13 +19,13 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv4NeighborAddressTlv.
+ * Test of the IPv4InterfaceAddressSubTlv.
  */
-public class IPv4NeighborAddressTlvTest {
+public class IPv4InterfaceAddressSubTlvTest {
 
-    private final IPv4NeighborAddressTlv tlv1 = IPv4NeighborAddressTlv.of(2);
-    private final IPv4NeighborAddressTlv sameAsTlv1 = IPv4NeighborAddressTlv.of(2);
-    private final IPv4NeighborAddressTlv tlv2 = IPv4NeighborAddressTlv.of(3);
+    private final IPv4InterfaceAddressSubTlv tlv1 = IPv4InterfaceAddressSubTlv.of(2);
+    private final IPv4InterfaceAddressSubTlv sameAsTlv1 = IPv4InterfaceAddressSubTlv.of(2);
+    private final IPv4InterfaceAddressSubTlv tlv2 = IPv4InterfaceAddressSubTlv.of(3);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressTlvTest.java
deleted file mode 100644
index eb3a16a..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4InterfaceAddressTlvTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * Test of the IPv4InterfaceAddressTlv.
- */
-public class IPv4InterfaceAddressTlvTest {
-
-    private final IPv4InterfaceAddressTlv tlv1 = IPv4InterfaceAddressTlv.of(2);
-    private final IPv4InterfaceAddressTlv sameAsTlv1 = IPv4InterfaceAddressTlv.of(2);
-    private final IPv4InterfaceAddressTlv tlv2 = IPv4InterfaceAddressTlv.of(3);
-
-    @Test
-    public void basics() {
-        new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
-        .testEquals();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressSubTlvTest.java
similarity index 72%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressSubTlvTest.java
index 5f10b4c..b0d8e2a 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4NeighborAddressSubTlvTest.java
@@ -19,13 +19,13 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv4NeighborAddressTlv.
+ * Test of the IPv4NeighborAddressSubTlv.
  */
-public class IPv4NeighborAddressTlvTest {
+public class IPv4NeighborAddressSubTlvTest {
 
-    private final IPv4NeighborAddressTlv tlv1 = IPv4NeighborAddressTlv.of(2);
-    private final IPv4NeighborAddressTlv sameAsTlv1 = IPv4NeighborAddressTlv.of(2);
-    private final IPv4NeighborAddressTlv tlv2 = IPv4NeighborAddressTlv.of(3);
+    private final IPv4NeighborAddressSubTlv tlv1 = IPv4NeighborAddressSubTlv.of(2);
+    private final IPv4NeighborAddressSubTlv sameAsTlv1 = IPv4NeighborAddressSubTlv.of(2);
+    private final IPv4NeighborAddressSubTlv tlv2 = IPv4NeighborAddressSubTlv.of(3);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4RouterIdOfLocalNodeSubTlvTest.java
similarity index 70%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4RouterIdOfLocalNodeSubTlvTest.java
index f40ede0..89e1878 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4RouterIdOfLocalNodeSubTlvTest.java
@@ -19,13 +19,13 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv4TERouterIdOfRemoteNodeTlv.
+ * Test of the IPv4RouterIdOfLocalNodeSubTlv.
  */
-public class IPv4TERouterIdOfRemoteNodeTlvTest {
+public class IPv4RouterIdOfLocalNodeSubTlvTest {
 
-    private final IPv4TERouterIdOfRemoteNodeTlv tlv1 = IPv4TERouterIdOfRemoteNodeTlv.of(2);
-    private final IPv4TERouterIdOfRemoteNodeTlv sameAsTlv1 = IPv4TERouterIdOfRemoteNodeTlv.of(2);
-    private final IPv4TERouterIdOfRemoteNodeTlv tlv2 = IPv4TERouterIdOfRemoteNodeTlv.of(3);
+    private final IPv4RouterIdOfLocalNodeSubTlv tlv1 = IPv4RouterIdOfLocalNodeSubTlv.of(2);
+    private final IPv4RouterIdOfLocalNodeSubTlv sameAsTlv1 = IPv4RouterIdOfLocalNodeSubTlv.of(2);
+    private final IPv4RouterIdOfLocalNodeSubTlv tlv2 = IPv4RouterIdOfLocalNodeSubTlv.of(3);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4RouterIdOfRemoteNodeSubTlvTest.java
similarity index 70%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4RouterIdOfRemoteNodeSubTlvTest.java
index f40ede0..778d227 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4RouterIdOfRemoteNodeSubTlvTest.java
@@ -19,13 +19,13 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv4TERouterIdOfRemoteNodeTlv.
+ * Test of the IPv4RouterIdOfRemoteNodeSubTlv.
  */
-public class IPv4TERouterIdOfRemoteNodeTlvTest {
+public class IPv4RouterIdOfRemoteNodeSubTlvTest {
 
-    private final IPv4TERouterIdOfRemoteNodeTlv tlv1 = IPv4TERouterIdOfRemoteNodeTlv.of(2);
-    private final IPv4TERouterIdOfRemoteNodeTlv sameAsTlv1 = IPv4TERouterIdOfRemoteNodeTlv.of(2);
-    private final IPv4TERouterIdOfRemoteNodeTlv tlv2 = IPv4TERouterIdOfRemoteNodeTlv.of(3);
+    private final IPv4RouterIdOfRemoteNodeSubTlv tlv1 = IPv4RouterIdOfRemoteNodeSubTlv.of(2);
+    private final IPv4RouterIdOfRemoteNodeSubTlv sameAsTlv1 = IPv4RouterIdOfRemoteNodeSubTlv.of(2);
+    private final IPv4RouterIdOfRemoteNodeSubTlv tlv2 = IPv4RouterIdOfRemoteNodeSubTlv.of(3);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfLocalNodeTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfLocalNodeTlvTest.java
deleted file mode 100644
index 3880ca7..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfLocalNodeTlvTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * Test of the IPv4TERouterIdOfLocalNodeTlv.
- */
-public class IPv4TERouterIdOfLocalNodeTlvTest {
-
-    private final IPv4TERouterIdOfLocalNodeTlv tlv1 = IPv4TERouterIdOfLocalNodeTlv.of(2);
-    private final IPv4TERouterIdOfLocalNodeTlv sameAsTlv1 = IPv4TERouterIdOfLocalNodeTlv.of(2);
-    private final IPv4TERouterIdOfLocalNodeTlv tlv2 = IPv4TERouterIdOfLocalNodeTlv.of(3);
-
-    @Test
-    public void basics() {
-        new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
-        .testEquals();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6InterfaceAddressTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6InterfaceAddressSubTlvTest.java
similarity index 78%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6InterfaceAddressTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6InterfaceAddressSubTlvTest.java
index 0f8e37c..79a3260 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6InterfaceAddressTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6InterfaceAddressSubTlvTest.java
@@ -19,18 +19,18 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv6InterfaceAddressTlv.
+ * Test of the IPv6InterfaceAddressSubTlv.
  */
-public class IPv6InterfaceAddressTlvTest {
+public class IPv6InterfaceAddressSubTlvTest {
 
     private final byte[] b1 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
             (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x29, 0x00, 0x02, 0x00, 0x00};
     private final byte[] b2 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
             (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x30, 0x00, 0x02, 0x00, 0x01};
 
-    private final IPv6InterfaceAddressTlv tlv1 = IPv6InterfaceAddressTlv.of(b1);
-    private final IPv6InterfaceAddressTlv sameAsTlv1 = IPv6InterfaceAddressTlv.of(b1);
-    private final IPv6InterfaceAddressTlv tlv2 = IPv6InterfaceAddressTlv.of(b2);
+    private final IPv6InterfaceAddressSubTlv tlv1 = IPv6InterfaceAddressSubTlv.of(b1);
+    private final IPv6InterfaceAddressSubTlv sameAsTlv1 = IPv6InterfaceAddressSubTlv.of(b1);
+    private final IPv6InterfaceAddressSubTlv tlv2 = IPv6InterfaceAddressSubTlv.of(b2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6NeighborAddressTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6NeighborAddressSubTlvTest.java
similarity index 79%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6NeighborAddressTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6NeighborAddressSubTlvTest.java
index 57ad769..375ce49 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6NeighborAddressTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6NeighborAddressSubTlvTest.java
@@ -19,18 +19,18 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv6NeighborAddressTlv.
+ * Test of the IPv6NeighborAddressSubTlv.
  */
-public class IPv6NeighborAddressTlvTest {
+public class IPv6NeighborAddressSubTlvTest {
 
     private final byte[] b1 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
             (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x29, 0x00, 0x02, 0x00, 0x00};
     private final byte[] b2 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
             (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x30, 0x00, 0x02, 0x00, 0x01};
 
-    private final IPv6NeighborAddressTlv tlv1 = IPv6NeighborAddressTlv.of(b1);
-    private final IPv6NeighborAddressTlv sameAsTlv1 = IPv6NeighborAddressTlv.of(b1);
-    private final IPv6NeighborAddressTlv tlv2 = IPv6NeighborAddressTlv.of(b2);
+    private final IPv6NeighborAddressSubTlv tlv1 = IPv6NeighborAddressSubTlv.of(b1);
+    private final IPv6NeighborAddressSubTlv sameAsTlv1 = IPv6NeighborAddressSubTlv.of(b1);
+    private final IPv6NeighborAddressSubTlv tlv2 = IPv6NeighborAddressSubTlv.of(b2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6TERouterIdofRemoteNodeTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6RouterIdofLocalNodeSubTlvTest.java
similarity index 77%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6TERouterIdofRemoteNodeTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6RouterIdofLocalNodeSubTlvTest.java
index f382860..6bd63a6 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6TERouterIdofRemoteNodeTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6RouterIdofLocalNodeSubTlvTest.java
@@ -19,18 +19,18 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv6TERouterIdofRemoteNodeTlv.
+ * Test of the IPv6RouterIdofLocalNodeSubTlv.
  */
-public class IPv6TERouterIdofRemoteNodeTlvTest {
+public class IPv6RouterIdofLocalNodeSubTlvTest {
 
     private final byte[] b1 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
             (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x29, 0x00, 0x02, 0x00, 0x00};
     private final byte[] b2 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
             (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x30, 0x00, 0x02, 0x00, 0x00 };
 
-    private final IPv6TERouterIdofRemoteNodeTlv tlv1 = IPv6TERouterIdofRemoteNodeTlv.of(b1);
-    private final IPv6TERouterIdofRemoteNodeTlv sameAsTlv1 = IPv6TERouterIdofRemoteNodeTlv.of(b1);
-    private final IPv6TERouterIdofRemoteNodeTlv tlv2 = IPv6TERouterIdofRemoteNodeTlv.of(b2);
+    private final IPv6RouterIdofLocalNodeSubTlv tlv1 = IPv6RouterIdofLocalNodeSubTlv.of(b1);
+    private final IPv6RouterIdofLocalNodeSubTlv sameAsTlv1 = IPv6RouterIdofLocalNodeSubTlv.of(b1);
+    private final IPv6RouterIdofLocalNodeSubTlv tlv2 = IPv6RouterIdofLocalNodeSubTlv.of(b2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6TERouterIdofRemoteNodeTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6RouterIdofRemoteNodeSubTlvTest.java
similarity index 77%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6TERouterIdofRemoteNodeTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6RouterIdofRemoteNodeSubTlvTest.java
index f382860..eb04558 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6TERouterIdofRemoteNodeTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6RouterIdofRemoteNodeSubTlvTest.java
@@ -19,18 +19,18 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv6TERouterIdofRemoteNodeTlv.
+ * Test of the IPv6RouterIdofRemoteNodeSubTlv.
  */
-public class IPv6TERouterIdofRemoteNodeTlvTest {
+public class IPv6RouterIdofRemoteNodeSubTlvTest {
 
     private final byte[] b1 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
             (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x29, 0x00, 0x02, 0x00, 0x00};
     private final byte[] b2 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
             (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x30, 0x00, 0x02, 0x00, 0x00 };
 
-    private final IPv6TERouterIdofRemoteNodeTlv tlv1 = IPv6TERouterIdofRemoteNodeTlv.of(b1);
-    private final IPv6TERouterIdofRemoteNodeTlv sameAsTlv1 = IPv6TERouterIdofRemoteNodeTlv.of(b1);
-    private final IPv6TERouterIdofRemoteNodeTlv tlv2 = IPv6TERouterIdofRemoteNodeTlv.of(b2);
+    private final IPv6RouterIdofRemoteNodeSubTlv tlv1 = IPv6RouterIdofRemoteNodeSubTlv.of(b1);
+    private final IPv6RouterIdofRemoteNodeSubTlv sameAsTlv1 = IPv6RouterIdofRemoteNodeSubTlv.of(b1);
+    private final IPv6RouterIdofRemoteNodeSubTlv tlv2 = IPv6RouterIdofRemoteNodeSubTlv.of(b2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6TERouterIdofLocalNodeTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6TERouterIdofLocalNodeTlvTest.java
deleted file mode 100644
index 6516ed3..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv6TERouterIdofLocalNodeTlvTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * Test of the IPv6TERouterIdofLocalNodeTlv.
- */
-public class IPv6TERouterIdofLocalNodeTlvTest {
-
-    private final byte[] b1 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
-            (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x29, 0x00, 0x02, 0x00, 0x00};
-    private final byte[] b2 = new byte[] {(byte) 0xFE, (byte) 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02,
-            (byte) 0xB3, (byte) 0xFF, (byte) 0xFE, 0x1E, (byte) 0x83, 0x30, 0x00, 0x02, 0x00, 0x00 };
-
-    private final IPv6TERouterIdofLocalNodeTlv tlv1 = IPv6TERouterIdofLocalNodeTlv.of(b1);
-    private final IPv6TERouterIdofLocalNodeTlv sameAsTlv1 = IPv6TERouterIdofLocalNodeTlv.of(b1);
-    private final IPv6TERouterIdofLocalNodeTlv tlv2 = IPv6TERouterIdofLocalNodeTlv.of(b2);
-
-    @Test
-    public void basics() {
-        new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
-        .testEquals();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IgpMetricTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IgpMetricSubTlvTest.java
similarity index 77%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IgpMetricTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IgpMetricSubTlvTest.java
index 20c9dc7..20945f2 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IgpMetricTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IgpMetricSubTlvTest.java
@@ -19,14 +19,14 @@
 import org.junit.Test;
 
 /**
- * Test of the IGPMetricTlv.
+ * Test of the IgpMetricSubTlv.
  */
-public class IgpMetricTlvTest {
+public class IgpMetricSubTlvTest {
     private final byte[] b1 = new byte[] {0x01, 0x02};
     private final byte[] b2 = new byte[] {0x01, 0x03};
-    private final IgpMetricTlv tlv1 = IgpMetricTlv.of(b1, (short) 2);
-    private final IgpMetricTlv sameAsTlv1 = IgpMetricTlv.of(b1, (short) 2);
-    private final IgpMetricTlv tlv2 = IgpMetricTlv.of(b2, (short) 2);
+    private final IgpMetricSubTlv tlv1 = IgpMetricSubTlv.of(b1, (short) 2);
+    private final IgpMetricSubTlv sameAsTlv1 = IgpMetricSubTlv.of(b1, (short) 2);
+    private final IgpMetricSubTlv tlv2 = IgpMetricSubTlv.of(b2, (short) 2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RouterIDSubTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IgpRouterIdSubTlvTest.java
similarity index 77%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RouterIDSubTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IgpRouterIdSubTlvTest.java
index 2f9e18a..5f36f90 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RouterIDSubTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IgpRouterIdSubTlvTest.java
@@ -19,20 +19,20 @@
 import org.junit.Test;
 
 /**
- * Test case for Router ID Sub tlv.
+ * Test case for IgpRouterIdSubTlv.
  */
-public class RouterIDSubTlvTest {
+public class IgpRouterIdSubTlvTest {
 
     private final byte[] value1 = {1, 2 };
     private final Short length1 = 2;
-    private final RouterIDSubTlv tlv1 = RouterIDSubTlv.of(value1, length1);
+    private final IgpRouterIdSubTlv tlv1 = IgpRouterIdSubTlv.of(value1, length1);
 
     private final Short length2 = 2;
-    private final RouterIDSubTlv tlv2 = RouterIDSubTlv.of(value1, length2);
+    private final IgpRouterIdSubTlv tlv2 = IgpRouterIdSubTlv.of(value1, length2);
 
     private final byte[] value3 = {1, 2, 3 };
     private final Short length3 = 3;
-    private final RouterIDSubTlv tlv3 = RouterIDSubTlv.of(value3, length3);
+    private final IgpRouterIdSubTlv tlv3 = IgpRouterIdSubTlv.of(value3, length3);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IsisAreaIdentifierTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IsisAreaIdentifierSubTlvTest.java
similarity index 74%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IsisAreaIdentifierTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IsisAreaIdentifierSubTlvTest.java
index a5a14c2..1b91fcd 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IsisAreaIdentifierTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IsisAreaIdentifierSubTlvTest.java
@@ -19,16 +19,16 @@
 import org.junit.Test;
 
 /**
- * Test of the ISISAreaIdentifierTlv.
+ * Test of the IsisAreaIdentifierSubTlv.
  */
-public class IsisAreaIdentifierTlvTest {
+public class IsisAreaIdentifierSubTlvTest {
 
     private final byte[] b1 = new byte[] {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
     private final byte[] b2 = new byte[] {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 };
 
-    private final IsisAreaIdentifierTlv tlv1 = IsisAreaIdentifierTlv.of(b1, (short) 20);
-    private final IsisAreaIdentifierTlv sameAsTlv1 = IsisAreaIdentifierTlv.of(b1, (short) 20);
-    private final IsisAreaIdentifierTlv tlv2 = IsisAreaIdentifierTlv.of(b2, (short) 20);
+    private final IsisAreaIdentifierSubTlv tlv1 = IsisAreaIdentifierSubTlv.of(b1, (short) 20);
+    private final IsisAreaIdentifierSubTlv sameAsTlv1 = IsisAreaIdentifierSubTlv.of(b1, (short) 20);
+    private final IsisAreaIdentifierSubTlv tlv2 = IsisAreaIdentifierSubTlv.of(b2, (short) 20);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkAttributesTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkAttributesTlvTest.java
new file mode 100644
index 0000000..8c0cb62
--- /dev/null
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkAttributesTlvTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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.pcepio.types;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Test case for TE Link Attribute Tlv.
+ */
+public class LinkAttributesTlvTest {
+
+    private final AdministrativeGroupSubTlv administrativeGroupTlv1 = new AdministrativeGroupSubTlv(10);
+    private final MaximumReservableLinkBandwidthSubTlv maximumReservableLinkBandwidthTlv1 =
+            new MaximumReservableLinkBandwidthSubTlv(20);
+
+    private final AdministrativeGroupSubTlv administrativeGroupTlv2 = new AdministrativeGroupSubTlv(20);
+    private final MaximumReservableLinkBandwidthSubTlv maximumReservableLinkBandwidthTlv2 =
+            new MaximumReservableLinkBandwidthSubTlv(30);
+
+    private final List<PcepValueType> llLinkAttributesSubTLV1 = new LinkedList<>();
+    private final boolean a = llLinkAttributesSubTLV1.add(administrativeGroupTlv1);
+    private final boolean b = llLinkAttributesSubTLV1.add(maximumReservableLinkBandwidthTlv1);
+
+    private final List<PcepValueType> llLinkAttributesSubTLV2 = new LinkedList<>();
+
+    private final boolean c = llLinkAttributesSubTLV2.add(administrativeGroupTlv2);
+    private final boolean d = llLinkAttributesSubTLV2.add(maximumReservableLinkBandwidthTlv2);
+
+    private final LinkAttributesTlv tlv1 = LinkAttributesTlv.of(llLinkAttributesSubTLV1);
+    private final LinkAttributesTlv sameAsTlv1 = LinkAttributesTlv.of(llLinkAttributesSubTLV1);
+    private final LinkAttributesTlv tlv2 = LinkAttributesTlv.of(llLinkAttributesSubTLV2);
+
+    @Test
+    public void basics() {
+        new EqualsTester().addEqualityGroup(tlv1, sameAsTlv1).addEqualityGroup(tlv2).testEquals();
+    }
+
+}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkDescriptorsTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkDescriptorsTlvTest.java
new file mode 100644
index 0000000..d271595
--- /dev/null
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkDescriptorsTlvTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.pcepio.types;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Test case for TE link descriptors Tlv.
+ */
+public class LinkDescriptorsTlvTest {
+    private final LinkLocalRemoteIdentifiersSubTlv linkLocalRemoteIdentifiersTlv1 = new
+            LinkLocalRemoteIdentifiersSubTlv(10, 10);
+    private final IPv4InterfaceAddressSubTlv iPv4InterfaceAddressTlv1 = new IPv4InterfaceAddressSubTlv(0x01010101);
+
+    private final LinkLocalRemoteIdentifiersSubTlv linkLocalRemoteIdentifiersTlv2 = new
+            LinkLocalRemoteIdentifiersSubTlv(20, 20);
+    private final IPv4InterfaceAddressSubTlv iPv4InterfaceAddressTlv2 = new IPv4InterfaceAddressSubTlv(0x02020202);
+
+    private final List<PcepValueType> llLinkDescriptorsSubTLVs1 = new LinkedList<>();
+    private final boolean a = llLinkDescriptorsSubTLVs1.add(linkLocalRemoteIdentifiersTlv1);
+    private final boolean b = llLinkDescriptorsSubTLVs1.add(iPv4InterfaceAddressTlv1);
+
+    private final List<PcepValueType> llLinkDescriptorsSubTLVs2 = new LinkedList<>();
+    private final boolean c = llLinkDescriptorsSubTLVs2.add(linkLocalRemoteIdentifiersTlv2);
+    private final boolean d = llLinkDescriptorsSubTLVs2.add(iPv4InterfaceAddressTlv2);
+
+    private final LinkDescriptorsTlv tlv1 = LinkDescriptorsTlv.of(llLinkDescriptorsSubTLVs1);
+    private final LinkDescriptorsTlv sameAstlv1 = LinkDescriptorsTlv.of(llLinkDescriptorsSubTLVs1);
+    private final LinkDescriptorsTlv tlv2 = LinkDescriptorsTlv.of(llLinkDescriptorsSubTLVs2);
+
+    @Test
+    public void basics() {
+        new EqualsTester().addEqualityGroup(tlv1, sameAstlv1).addEqualityGroup(tlv2).testEquals();
+    }
+
+}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkLocalRemoteIdentifiersSubTlvTest.java
similarity index 68%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkLocalRemoteIdentifiersSubTlvTest.java
index f40ede0..9752874 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/IPv4TERouterIdOfRemoteNodeTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkLocalRemoteIdentifiersSubTlvTest.java
@@ -19,13 +19,13 @@
 import org.junit.Test;
 
 /**
- * Test of the IPv4TERouterIdOfRemoteNodeTlv.
+ * Test of the LinkLocalRemoteIdentifiersSubTlv.
  */
-public class IPv4TERouterIdOfRemoteNodeTlvTest {
+public class LinkLocalRemoteIdentifiersSubTlvTest {
 
-    private final IPv4TERouterIdOfRemoteNodeTlv tlv1 = IPv4TERouterIdOfRemoteNodeTlv.of(2);
-    private final IPv4TERouterIdOfRemoteNodeTlv sameAsTlv1 = IPv4TERouterIdOfRemoteNodeTlv.of(2);
-    private final IPv4TERouterIdOfRemoteNodeTlv tlv2 = IPv4TERouterIdOfRemoteNodeTlv.of(3);
+    private final LinkLocalRemoteIdentifiersSubTlv tlv1 = LinkLocalRemoteIdentifiersSubTlv.of(10, 20);
+    private final LinkLocalRemoteIdentifiersSubTlv sameAsTlv1 = LinkLocalRemoteIdentifiersSubTlv.of(10, 20);
+    private final LinkLocalRemoteIdentifiersSubTlv tlv2 = LinkLocalRemoteIdentifiersSubTlv.of(20, 30);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkLocalRemoteIdentifiersTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkLocalRemoteIdentifiersTlvTest.java
deleted file mode 100644
index e25bda0..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkLocalRemoteIdentifiersTlvTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * 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.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * Test of the LinkLocalRemoteIdentifiersTlv.
- */
-public class LinkLocalRemoteIdentifiersTlvTest {
-
-    private final LinkLocalRemoteIdentifiersTlv tlv1 = LinkLocalRemoteIdentifiersTlv.of(10, 20);
-    private final LinkLocalRemoteIdentifiersTlv sameAsTlv1 = LinkLocalRemoteIdentifiersTlv.of(10, 20);
-    private final LinkLocalRemoteIdentifiersTlv tlv2 = LinkLocalRemoteIdentifiersTlv.of(20, 30);
-
-    @Test
-    public void basics() {
-        new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
-        .testEquals();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkNameTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkNameAttributeSubTlvTest.java
similarity index 70%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkNameTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkNameAttributeSubTlvTest.java
index 7d9dcb2..697f015 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkNameTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkNameAttributeSubTlvTest.java
@@ -19,15 +19,15 @@
 import org.junit.Test;
 
 /**
- * Equality test for LinkNameTlv.
+ * Equality test for LinkNameAttributeSubTlv.
  */
-public class LinkNameTlvTest {
+public class LinkNameAttributeSubTlvTest {
     private final byte[] rawValue1 = new byte[] {0x01, 0x00};
     private final byte[] rawValue2 = new byte[] {0x02, 0x00};
 
-    private final LinkNameTlv tlv1 = new LinkNameTlv(rawValue1, (short) rawValue1.length);
-    private final LinkNameTlv sameAsTlv1 = LinkNameTlv.of(tlv1.getValue(), tlv1.getLength());
-    private final LinkNameTlv tlv2 = new LinkNameTlv(rawValue2, (short) 0);
+    private final LinkNameAttributeSubTlv tlv1 = new LinkNameAttributeSubTlv(rawValue1, (short) rawValue1.length);
+    private final LinkNameAttributeSubTlv sameAsTlv1 = LinkNameAttributeSubTlv.of(tlv1.getValue(), tlv1.getLength());
+    private final LinkNameAttributeSubTlv tlv2 = new LinkNameAttributeSubTlv(rawValue2, (short) 0);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeFlagBitsTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkProtectionTypeSubTlvTest.java
similarity index 72%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeFlagBitsTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkProtectionTypeSubTlvTest.java
index fb90fed..412cfcc 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeFlagBitsTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkProtectionTypeSubTlvTest.java
@@ -19,15 +19,15 @@
 import org.junit.Test;
 
 /**
- * Test of the NodeFlagBitsTlv.
+ * Test of the LinkProtectionTypeSubTlv.
  */
-public class NodeFlagBitsTlvTest {
+public class LinkProtectionTypeSubTlvTest {
     private final byte rawValue1 = 0x0A;
     private final byte rawValue2 = 0x0B;
 
-    private final NodeFlagBitsTlv tlv1 = new NodeFlagBitsTlv(rawValue1);
-    private final NodeFlagBitsTlv sameAsTlv1 = new NodeFlagBitsTlv(rawValue1);
-    private final NodeFlagBitsTlv tlv2 = NodeFlagBitsTlv.of(rawValue2);
+    private final LinkProtectionTypeSubTlv tlv1 = new LinkProtectionTypeSubTlv(rawValue1);
+    private final LinkProtectionTypeSubTlv sameAsTlv1 = new LinkProtectionTypeSubTlv(rawValue1);
+    private final LinkProtectionTypeSubTlv tlv2 = new LinkProtectionTypeSubTlv(rawValue2, (byte) 0);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkProtectionTypeTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkProtectionTypeTlvTest.java
deleted file mode 100644
index 61928f2..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LinkProtectionTypeTlvTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * Test of the LinkProtectionTypeTlv.
- */
-public class LinkProtectionTypeTlvTest {
-    private final byte rawValue1 = 0x0A;
-    private final byte rawValue2 = 0x0B;
-
-    private final LinkProtectionTypeTlv tlv1 = new LinkProtectionTypeTlv(rawValue1);
-    private final LinkProtectionTypeTlv sameAsTlv1 = new LinkProtectionTypeTlv(rawValue1);
-    private final LinkProtectionTypeTlv tlv2 = new LinkProtectionTypeTlv(rawValue2, (byte) 0);
-
-    @Test
-    public void basics() {
-        new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
-        .testEquals();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LocalNodeDescriptorsTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LocalNodeDescriptorsTlvTest.java
new file mode 100644
index 0000000..2570e66
--- /dev/null
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LocalNodeDescriptorsTlvTest.java
@@ -0,0 +1,51 @@
+/*
+ * 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.pcepio.types;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Test of the LocalNodeDescriptorsTlv.
+ */
+public class LocalNodeDescriptorsTlvTest {
+
+    private final AutonomousSystemSubTlv baAutoSysTlvRawValue1 = new AutonomousSystemSubTlv(1);
+    private final BgpLsIdentifierSubTlv baBgplsIdRawValue1 = new BgpLsIdentifierSubTlv(1);
+
+    private final AutonomousSystemSubTlv baAutoSysTlvRawValue2 = new AutonomousSystemSubTlv(2);
+    private final BgpLsIdentifierSubTlv baBgplsIdRawValue2 = new BgpLsIdentifierSubTlv(2);
+
+    private final List<PcepValueType> llNodeDescriptorSubTLVs1 = new LinkedList<PcepValueType>();
+    private final boolean a = llNodeDescriptorSubTLVs1.add(baAutoSysTlvRawValue1);
+    private final boolean b = llNodeDescriptorSubTLVs1.add(baBgplsIdRawValue1);
+
+    private final List<PcepValueType> llNodeDescriptorSubTLVs2 = new LinkedList<PcepValueType>();
+    private final boolean c = llNodeDescriptorSubTLVs2.add(baAutoSysTlvRawValue2);
+    private final boolean d = llNodeDescriptorSubTLVs2.add(baBgplsIdRawValue2);
+
+    private final LocalNodeDescriptorsTlv tlv1 = LocalNodeDescriptorsTlv.of(llNodeDescriptorSubTLVs1);
+    private final LocalNodeDescriptorsTlv sameAstlv1 = LocalNodeDescriptorsTlv.of(llNodeDescriptorSubTLVs1);
+    private final LocalNodeDescriptorsTlv tlv2 = LocalNodeDescriptorsTlv.of(llNodeDescriptorSubTLVs2);
+
+    @Test
+    public void basics() {
+        new EqualsTester().addEqualityGroup(tlv1, sameAstlv1).addEqualityGroup(tlv2).testEquals();
+    }
+}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTlvTest.java
deleted file mode 100644
index 17daa75..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LocalTENodeDescriptorsTlvTest.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * 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.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-import java.util.LinkedList;
-
-/**
- * Test of the LocalTENodeDescriptorsTlv.
- */
-public class LocalTENodeDescriptorsTlvTest {
-
-    private final AutonomousSystemTlv baAutoSysTlvRawValue1 = new AutonomousSystemTlv(1);
-    private final BgpLsIdentifierTlv baBgplsIdRawValue1 = new BgpLsIdentifierTlv(1);
-
-    private final AutonomousSystemTlv baAutoSysTlvRawValue2 = new AutonomousSystemTlv(2);
-    private final BgpLsIdentifierTlv baBgplsIdRawValue2 = new BgpLsIdentifierTlv(2);
-
-    private final LinkedList<PcepValueType> llNodeDescriptorSubTLVs1 = new LinkedList<PcepValueType>();
-    private final boolean a = llNodeDescriptorSubTLVs1.add(baAutoSysTlvRawValue1);
-    private final boolean b = llNodeDescriptorSubTLVs1.add(baBgplsIdRawValue1);
-
-    private final LinkedList<PcepValueType> llNodeDescriptorSubTLVs2 = new LinkedList<PcepValueType>();
-    private final boolean c = llNodeDescriptorSubTLVs2.add(baAutoSysTlvRawValue2);
-    private final boolean d = llNodeDescriptorSubTLVs2.add(baBgplsIdRawValue2);
-
-    private final LocalTENodeDescriptorsTlv tlv1 = LocalTENodeDescriptorsTlv.of(llNodeDescriptorSubTLVs1);
-    private final LocalTENodeDescriptorsTlv sameAstlv1 = LocalTENodeDescriptorsTlv.of(llNodeDescriptorSubTLVs1);
-    private final LocalTENodeDescriptorsTlv tlv2 = LocalTENodeDescriptorsTlv.of(llNodeDescriptorSubTLVs2);
-
-    @Test
-    public void basics() {
-        new EqualsTester().addEqualityGroup(tlv1, sameAstlv1).addEqualityGroup(tlv2).testEquals();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TedCapabilityTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LsCapabilityTlvTest.java
similarity index 79%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TedCapabilityTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LsCapabilityTlvTest.java
index 18677ca..3766a4d 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TedCapabilityTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/LsCapabilityTlvTest.java
@@ -21,11 +21,11 @@
 /**
  * Test case for TED Capability tlv.
  */
-public class TedCapabilityTlvTest {
+public class LsCapabilityTlvTest {
 
-    private final TedCapabilityTlv tlv1 = TedCapabilityTlv.of(1);
-    private final TedCapabilityTlv tlv2 = TedCapabilityTlv.of(1);
-    private final TedCapabilityTlv tlv3 = TedCapabilityTlv.of(2);
+    private final LsCapabilityTlv tlv1 = LsCapabilityTlv.of(1);
+    private final LsCapabilityTlv tlv2 = LsCapabilityTlv.of(1);
+    private final LsCapabilityTlv tlv3 = LsCapabilityTlv.of(2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthSubTlvTest.java
similarity index 72%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthSubTlvTest.java
index 4e022b8..d4b9c6b 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthSubTlvTest.java
@@ -19,15 +19,15 @@
 import org.junit.Test;
 
 /**
- * Test of the MaximumLinkBandwidthTlv.
+ * Test of the MaximumLinkBandwidthSubTlv.
  */
-public class MaximumLinkBandwidthTlvTest {
+public class MaximumLinkBandwidthSubTlvTest {
     private final int rawValue1 = 0x0A;
     private final int rawValue2 = 0x0B;
 
-    private final MaximumLinkBandwidthTlv tlv1 = new MaximumLinkBandwidthTlv(rawValue1);
-    private final MaximumLinkBandwidthTlv sameAsTlv1 = new MaximumLinkBandwidthTlv(rawValue1);
-    private final MaximumLinkBandwidthTlv tlv2 = MaximumLinkBandwidthTlv.of(rawValue2);
+    private final MaximumLinkBandwidthSubTlv tlv1 = new MaximumLinkBandwidthSubTlv(rawValue1);
+    private final MaximumLinkBandwidthSubTlv sameAsTlv1 = new MaximumLinkBandwidthSubTlv(rawValue1);
+    private final MaximumLinkBandwidthSubTlv tlv2 = MaximumLinkBandwidthSubTlv.of(rawValue2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumReservableLinkBandwidthSubTlvTest.java
similarity index 68%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumReservableLinkBandwidthSubTlvTest.java
index 4e022b8..85e108d 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumLinkBandwidthTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumReservableLinkBandwidthSubTlvTest.java
@@ -19,15 +19,15 @@
 import org.junit.Test;
 
 /**
- * Test of the MaximumLinkBandwidthTlv.
+ * Test of the MaximumReservableLinkBandwidthSubTlv.
  */
-public class MaximumLinkBandwidthTlvTest {
+public class MaximumReservableLinkBandwidthSubTlvTest {
     private final int rawValue1 = 0x0A;
     private final int rawValue2 = 0x0B;
 
-    private final MaximumLinkBandwidthTlv tlv1 = new MaximumLinkBandwidthTlv(rawValue1);
-    private final MaximumLinkBandwidthTlv sameAsTlv1 = new MaximumLinkBandwidthTlv(rawValue1);
-    private final MaximumLinkBandwidthTlv tlv2 = MaximumLinkBandwidthTlv.of(rawValue2);
+    private final MaximumReservableLinkBandwidthSubTlv tlv1 = new MaximumReservableLinkBandwidthSubTlv(rawValue1);
+    private final MaximumReservableLinkBandwidthSubTlv sameAsTlv1 = new MaximumReservableLinkBandwidthSubTlv(rawValue1);
+    private final MaximumReservableLinkBandwidthSubTlv tlv2 = MaximumReservableLinkBandwidthSubTlv.of(rawValue2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumReservableLinkBandwidthTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumReservableLinkBandwidthTlvTest.java
deleted file mode 100644
index 7b37035..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MaximumReservableLinkBandwidthTlvTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * Test of the MaximumReservableLinkBandwidthTlv.
- */
-public class MaximumReservableLinkBandwidthTlvTest {
-    private final int rawValue1 = 0x0A;
-    private final int rawValue2 = 0x0B;
-
-    private final MaximumReservableLinkBandwidthTlv tlv1 = new MaximumReservableLinkBandwidthTlv(rawValue1);
-    private final MaximumReservableLinkBandwidthTlv sameAsTlv1 = new MaximumReservableLinkBandwidthTlv(rawValue1);
-    private final MaximumReservableLinkBandwidthTlv tlv2 = MaximumReservableLinkBandwidthTlv.of(rawValue2);
-
-    @Test
-    public void basics() {
-        new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
-        .testEquals();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeFlagBitsTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MplsProtocolMaskSubTlvTest.java
similarity index 73%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeFlagBitsTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MplsProtocolMaskSubTlvTest.java
index fb90fed..6e396b8 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeFlagBitsTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MplsProtocolMaskSubTlvTest.java
@@ -19,15 +19,15 @@
 import org.junit.Test;
 
 /**
- * Test of the NodeFlagBitsTlv.
+ * Test of the MplsProtocolMaskSubTlv.
  */
-public class NodeFlagBitsTlvTest {
+public class MplsProtocolMaskSubTlvTest {
     private final byte rawValue1 = 0x0A;
     private final byte rawValue2 = 0x0B;
 
-    private final NodeFlagBitsTlv tlv1 = new NodeFlagBitsTlv(rawValue1);
-    private final NodeFlagBitsTlv sameAsTlv1 = new NodeFlagBitsTlv(rawValue1);
-    private final NodeFlagBitsTlv tlv2 = NodeFlagBitsTlv.of(rawValue2);
+    private final MplsProtocolMaskSubTlv tlv1 = new MplsProtocolMaskSubTlv(rawValue1);
+    private final MplsProtocolMaskSubTlv sameAsTlv1 = new MplsProtocolMaskSubTlv(rawValue1);
+    private final MplsProtocolMaskSubTlv tlv2 = MplsProtocolMaskSubTlv.of(rawValue2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MplsProtocolMaskTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MplsProtocolMaskTlvTest.java
deleted file mode 100644
index ff87b7a..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/MplsProtocolMaskTlvTest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * Test of the MPLSProtocolMaskTlv.
- */
-public class MplsProtocolMaskTlvTest {
-    private final byte rawValue1 = 0x0A;
-    private final byte rawValue2 = 0x0B;
-
-    private final MplsProtocolMaskTlv tlv1 = new MplsProtocolMaskTlv(rawValue1);
-    private final MplsProtocolMaskTlv sameAsTlv1 = new MplsProtocolMaskTlv(rawValue1);
-    private final MplsProtocolMaskTlv tlv2 = MplsProtocolMaskTlv.of(rawValue2);
-
-    @Test
-    public void basics() {
-        new EqualsTester()
-        .addEqualityGroup(tlv1, sameAsTlv1)
-        .addEqualityGroup(tlv2)
-        .testEquals();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeAttributesTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeAttributesTlvTest.java
new file mode 100644
index 0000000..2c9664d
--- /dev/null
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeAttributesTlvTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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.pcepio.types;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Test case for TE Node Attribute tlv.
+ */
+public class NodeAttributesTlvTest {
+
+    private final NodeFlagBitsSubTlv nodeFlagBitsTlv1 = new NodeFlagBitsSubTlv((byte) 10);
+    private final IPv4RouterIdOfLocalNodeSubTlv iPv4TERouterIdOfLocalNodeTlv1 = new
+            IPv4RouterIdOfLocalNodeSubTlv(0x01010101);
+
+    private final NodeFlagBitsSubTlv nodeFlagBitsTlv2 = new NodeFlagBitsSubTlv((byte) 20);
+    private final IPv4RouterIdOfLocalNodeSubTlv iPv4TERouterIdOfLocalNodeTlv2 = new
+            IPv4RouterIdOfLocalNodeSubTlv(0x02020202);
+
+    private final List<PcepValueType> llNodeAttributesSubTLV1 = new LinkedList<>();
+    private final boolean a = llNodeAttributesSubTLV1.add(nodeFlagBitsTlv1);
+    private final boolean b = llNodeAttributesSubTLV1.add(iPv4TERouterIdOfLocalNodeTlv1);
+
+    private final List<PcepValueType> llNodeAttributesSubTLV2 = new LinkedList<>();
+
+    private final boolean c = llNodeAttributesSubTLV2.add(nodeFlagBitsTlv2);
+    private final boolean d = llNodeAttributesSubTLV2.add(iPv4TERouterIdOfLocalNodeTlv2);
+
+    private final NodeAttributesTlv tlv1 = NodeAttributesTlv.of(llNodeAttributesSubTLV1);
+    private final NodeAttributesTlv sameAsTlv1 = NodeAttributesTlv.of(llNodeAttributesSubTLV1);
+    private final NodeAttributesTlv tlv2 = NodeAttributesTlv.of(llNodeAttributesSubTLV2);
+
+    @Test
+    public void basics() {
+        new EqualsTester().addEqualityGroup(tlv1, sameAsTlv1).addEqualityGroup(tlv2).testEquals();
+    }
+
+}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeFlagBitsTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeFlagBitsSubTlvTest.java
similarity index 76%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeFlagBitsTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeFlagBitsSubTlvTest.java
index fb90fed..5179a2c 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeFlagBitsTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeFlagBitsSubTlvTest.java
@@ -19,15 +19,15 @@
 import org.junit.Test;
 
 /**
- * Test of the NodeFlagBitsTlv.
+ * Test of the NodeFlagBitsSubTlv.
  */
-public class NodeFlagBitsTlvTest {
+public class NodeFlagBitsSubTlvTest {
     private final byte rawValue1 = 0x0A;
     private final byte rawValue2 = 0x0B;
 
-    private final NodeFlagBitsTlv tlv1 = new NodeFlagBitsTlv(rawValue1);
-    private final NodeFlagBitsTlv sameAsTlv1 = new NodeFlagBitsTlv(rawValue1);
-    private final NodeFlagBitsTlv tlv2 = NodeFlagBitsTlv.of(rawValue2);
+    private final NodeFlagBitsSubTlv tlv1 = new NodeFlagBitsSubTlv(rawValue1);
+    private final NodeFlagBitsSubTlv sameAsTlv1 = new NodeFlagBitsSubTlv(rawValue1);
+    private final NodeFlagBitsSubTlv tlv2 = NodeFlagBitsSubTlv.of(rawValue2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeNameTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeNameSubTlvTest.java
similarity index 74%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeNameTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeNameSubTlvTest.java
index d6d53d6..c21c986 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeNameTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/NodeNameSubTlvTest.java
@@ -19,15 +19,15 @@
 import org.junit.Test;
 
 /**
- * Test of the NodeNameTlv.
+ * Test of the NodeNameSubTlv.
  */
-public class NodeNameTlvTest {
+public class NodeNameSubTlvTest {
     private final byte[] rawValue1 = new byte[] {0x01, 0x02};
     private final byte[] rawValue2 = new byte[] {0x14, 0x15};
 
-    private final NodeNameTlv tlv1 = new NodeNameTlv(rawValue1, (short) rawValue1.length);
-    private final NodeNameTlv sameAsTlv1 = NodeNameTlv.of(tlv1.getValue(), tlv1.getLength());
-    private final NodeNameTlv tlv2 = new NodeNameTlv(rawValue2, (short) 0);
+    private final NodeNameSubTlv tlv1 = new NodeNameSubTlv(rawValue1, (short) rawValue1.length);
+    private final NodeNameSubTlv sameAsTlv1 = NodeNameSubTlv.of(tlv1.getValue(), tlv1.getLength());
+    private final NodeNameSubTlv tlv2 = new NodeNameSubTlv(rawValue2, (short) 0);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OpaqueLinkAttributeTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OpaqueLinkAttributeSubTlvTest.java
similarity index 69%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OpaqueLinkAttributeTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OpaqueLinkAttributeSubTlvTest.java
index f437fb5..4a4c29e 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OpaqueLinkAttributeTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OpaqueLinkAttributeSubTlvTest.java
@@ -19,15 +19,17 @@
 import org.junit.Test;
 
 /**
- * Test of the OpaqueLinkAttributeTlv.
+ * Test of the OpaqueLinkAttributeSubTlv.
  */
-public class OpaqueLinkAttributeTlvTest {
+public class OpaqueLinkAttributeSubTlvTest {
     private final byte[] rawValue1 = new byte[] {0x01, 0x02};
     private final byte[] rawValue2 = new byte[] {0x14, 0x15};
 
-    private final OpaqueLinkAttributeTlv tlv1 = new OpaqueLinkAttributeTlv(rawValue1, (short) rawValue1.length);
-    private final OpaqueLinkAttributeTlv sameAsTlv1 = OpaqueLinkAttributeTlv.of(tlv1.getValue(), tlv1.getLength());
-    private final OpaqueLinkAttributeTlv tlv2 = new OpaqueLinkAttributeTlv(rawValue2, (short) 0);
+    private final OpaqueLinkAttributeSubTlv tlv1 =
+            new OpaqueLinkAttributeSubTlv(rawValue1, (short) rawValue1.length);
+    private final OpaqueLinkAttributeSubTlv sameAsTlv1 =
+            OpaqueLinkAttributeSubTlv.of(tlv1.getValue(), tlv1.getLength());
+    private final OpaqueLinkAttributeSubTlv tlv2 = new OpaqueLinkAttributeSubTlv(rawValue2, (short) 0);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OspfAreaIdSubTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OspfAreaIdSubTlvTest.java
index 2ea3511..4dc4fdd 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OspfAreaIdSubTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/OspfAreaIdSubTlvTest.java
@@ -19,7 +19,7 @@
 import org.junit.Test;
 
 /**
- * Test of the OSPFareaIDsubTlv.
+ * Test of the OspfAreaIdSubTlv.
  */
 public class OspfAreaIdSubTlvTest {
     private final int rawValue1 = 0x0A;
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RemoteNodeDescriptorsTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RemoteNodeDescriptorsTlvTest.java
new file mode 100644
index 0000000..ee78b57
--- /dev/null
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RemoteNodeDescriptorsTlvTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.pcepio.types;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Test;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Test case for Remote TE Node Descriptors tlv.
+ */
+public class RemoteNodeDescriptorsTlvTest {
+
+    private final AutonomousSystemSubTlv autonomousSystemTlv1 = new AutonomousSystemSubTlv(10);
+    private final BgpLsIdentifierSubTlv bGPLSidentifierTlv1 = new BgpLsIdentifierSubTlv(20);
+
+    private final AutonomousSystemSubTlv autonomousSystemTlv2 = new AutonomousSystemSubTlv(20);
+    private final BgpLsIdentifierSubTlv bGPLSidentifierTlv2 = new BgpLsIdentifierSubTlv(30);
+
+    private final List<PcepValueType> llRemoteTENodeDescriptorSubTLV1 = new LinkedList<>();
+    private final boolean a = llRemoteTENodeDescriptorSubTLV1.add(autonomousSystemTlv1);
+    private final boolean b = llRemoteTENodeDescriptorSubTLV1.add(bGPLSidentifierTlv1);
+
+    private final List<PcepValueType> llRemoteTENodeDescriptorSubTLV2 = new LinkedList<>();
+    private final boolean c = llRemoteTENodeDescriptorSubTLV2.add(autonomousSystemTlv2);
+    private final boolean d = llRemoteTENodeDescriptorSubTLV2.add(bGPLSidentifierTlv2);
+
+    private final RemoteNodeDescriptorsTlv tlv1 = RemoteNodeDescriptorsTlv.of(llRemoteTENodeDescriptorSubTLV1);
+    private final RemoteNodeDescriptorsTlv sameAsTlv1 =
+            RemoteNodeDescriptorsTlv.of(llRemoteTENodeDescriptorSubTLV1);
+    private final RemoteNodeDescriptorsTlv tlv2 = RemoteNodeDescriptorsTlv.of(llRemoteTENodeDescriptorSubTLV2);
+
+    @Test
+    public void basics() {
+        new EqualsTester().addEqualityGroup(tlv1, sameAsTlv1).addEqualityGroup(tlv2).testEquals();
+    }
+
+}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTlvTest.java
deleted file mode 100644
index 8e74921..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/RemoteTENodeDescriptorsTlvTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-import java.util.LinkedList;
-
-/**
- * Test case for Remote TE Node Descriptors tlv.
- */
-public class RemoteTENodeDescriptorsTlvTest {
-
-    private final AutonomousSystemTlv autonomousSystemTlv1 = new AutonomousSystemTlv(10);
-    private final BgpLsIdentifierTlv bGPLSidentifierTlv1 = new BgpLsIdentifierTlv(20);
-
-    private final AutonomousSystemTlv autonomousSystemTlv2 = new AutonomousSystemTlv(20);
-    private final BgpLsIdentifierTlv bGPLSidentifierTlv2 = new BgpLsIdentifierTlv(30);
-
-    private final LinkedList<PcepValueType> llRemoteTENodeDescriptorSubTLV1 = new LinkedList<>();
-    private final boolean a = llRemoteTENodeDescriptorSubTLV1.add(autonomousSystemTlv1);
-    private final boolean b = llRemoteTENodeDescriptorSubTLV1.add(bGPLSidentifierTlv1);
-
-    private final LinkedList<PcepValueType> llRemoteTENodeDescriptorSubTLV2 = new LinkedList<>();
-    private final boolean c = llRemoteTENodeDescriptorSubTLV2.add(autonomousSystemTlv2);
-    private final boolean d = llRemoteTENodeDescriptorSubTLV2.add(bGPLSidentifierTlv2);
-
-    private final RemoteTENodeDescriptorsTlv tlv1 = RemoteTENodeDescriptorsTlv.of(llRemoteTENodeDescriptorSubTLV1);
-    private final RemoteTENodeDescriptorsTlv sameAsTlv1 =
-            RemoteTENodeDescriptorsTlv.of(llRemoteTENodeDescriptorSubTLV1);
-    private final RemoteTENodeDescriptorsTlv tlv2 = RemoteTENodeDescriptorsTlv.of(llRemoteTENodeDescriptorSubTLV2);
-
-    @Test
-    public void basics() {
-        new EqualsTester().addEqualityGroup(tlv1, sameAsTlv1).addEqualityGroup(tlv2).testEquals();
-    }
-
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/SharedRiskLinkGroupTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/SharedRiskLinkGroupSubTlvTest.java
similarity index 72%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/SharedRiskLinkGroupTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/SharedRiskLinkGroupSubTlvTest.java
index 7c8ec57..777ff9c 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/SharedRiskLinkGroupTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/SharedRiskLinkGroupSubTlvTest.java
@@ -19,19 +19,19 @@
 import org.junit.Test;
 
 /**
- * Test case for Shared Risk Link Group tlv.
+ * Test case for SharedRiskLinkGroupSubTlv.
  */
-public class SharedRiskLinkGroupTlvTest {
+public class SharedRiskLinkGroupSubTlvTest {
 
     private final int[] raw = {1 };
     private final Short hLength = 2;
-    private final SharedRiskLinkGroupTlv tlv1 = SharedRiskLinkGroupTlv.of(raw, hLength);
+    private final SharedRiskLinkGroupSubTlv tlv1 = SharedRiskLinkGroupSubTlv.of(raw, hLength);
 
-    private final SharedRiskLinkGroupTlv sameAsTlv1 = SharedRiskLinkGroupTlv.of(raw, hLength);
+    private final SharedRiskLinkGroupSubTlv sameAsTlv1 = SharedRiskLinkGroupSubTlv.of(raw, hLength);
 
     private final int[] raw2 = {2 };
     private final Short hLength2 = 3;
-    private final SharedRiskLinkGroupTlv tlv2 = SharedRiskLinkGroupTlv.of(raw2, hLength2);
+    private final SharedRiskLinkGroupSubTlv tlv2 = SharedRiskLinkGroupSubTlv.of(raw2, hLength2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TedCapabilityTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TEDefaultMetricSubTlvTest.java
similarity index 73%
copy from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TedCapabilityTlvTest.java
copy to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TEDefaultMetricSubTlvTest.java
index 18677ca..ee63621 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TedCapabilityTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TEDefaultMetricSubTlvTest.java
@@ -19,13 +19,13 @@
 import org.junit.Test;
 
 /**
- * Test case for TED Capability tlv.
+ * Test case for TEDefaultMetricSubTlv.
  */
-public class TedCapabilityTlvTest {
+public class TEDefaultMetricSubTlvTest {
 
-    private final TedCapabilityTlv tlv1 = TedCapabilityTlv.of(1);
-    private final TedCapabilityTlv tlv2 = TedCapabilityTlv.of(1);
-    private final TedCapabilityTlv tlv3 = TedCapabilityTlv.of(2);
+    private final TEDefaultMetricSubTlv tlv1 = TEDefaultMetricSubTlv.of(1);
+    private final TEDefaultMetricSubTlv tlv2 = TEDefaultMetricSubTlv.of(1);
+    private final TEDefaultMetricSubTlv tlv3 = TEDefaultMetricSubTlv.of(2);
 
     @Test
     public void basics() {
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TEDefaultMetricTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TEDefaultMetricTlvTest.java
deleted file mode 100644
index c46b0af..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TEDefaultMetricTlvTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-/**
- * Test case for TE Default Metric tlv.
- */
-public class TEDefaultMetricTlvTest {
-
-    private final TEDefaultMetricTlv tlv1 = TEDefaultMetricTlv.of(1);
-    private final TEDefaultMetricTlv tlv2 = TEDefaultMetricTlv.of(1);
-    private final TEDefaultMetricTlv tlv3 = TEDefaultMetricTlv.of(2);
-
-    @Test
-    public void basics() {
-        new EqualsTester().addEqualityGroup(tlv1, tlv2).addEqualityGroup(tlv3).testEquals();
-    }
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TELinkAttributesTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TELinkAttributesTlvTest.java
deleted file mode 100644
index 8504a87..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TELinkAttributesTlvTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-import java.util.LinkedList;
-
-/**
- * Test case for TE Link Attribute Tlv.
- */
-public class TELinkAttributesTlvTest {
-
-    private final AdministrativeGroupTlv administrativeGroupTlv1 = new AdministrativeGroupTlv(10);
-    private final MaximumReservableLinkBandwidthTlv maximumReservableLinkBandwidthTlv1 =
-            new MaximumReservableLinkBandwidthTlv(20);
-
-    private final AdministrativeGroupTlv administrativeGroupTlv2 = new AdministrativeGroupTlv(20);
-    private final MaximumReservableLinkBandwidthTlv maximumReservableLinkBandwidthTlv2 =
-            new MaximumReservableLinkBandwidthTlv(30);
-
-    private final LinkedList<PcepValueType> llLinkAttributesSubTLV1 = new LinkedList<>();
-    private final boolean a = llLinkAttributesSubTLV1.add(administrativeGroupTlv1);
-    private final boolean b = llLinkAttributesSubTLV1.add(maximumReservableLinkBandwidthTlv1);
-
-    private final LinkedList<PcepValueType> llLinkAttributesSubTLV2 = new LinkedList<>();
-
-    private final boolean c = llLinkAttributesSubTLV2.add(administrativeGroupTlv2);
-    private final boolean d = llLinkAttributesSubTLV2.add(maximumReservableLinkBandwidthTlv2);
-
-    private final TELinkAttributesTlv tlv1 = TELinkAttributesTlv.of(llLinkAttributesSubTLV1);
-    private final TELinkAttributesTlv sameAsTlv1 = TELinkAttributesTlv.of(llLinkAttributesSubTLV1);
-    private final TELinkAttributesTlv tlv2 = TELinkAttributesTlv.of(llLinkAttributesSubTLV2);
-
-    @Test
-    public void basics() {
-        new EqualsTester().addEqualityGroup(tlv1, sameAsTlv1).addEqualityGroup(tlv2).testEquals();
-    }
-
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TELinkDescriptorsTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TELinkDescriptorsTlvTest.java
deleted file mode 100644
index 4e94209..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TELinkDescriptorsTlvTest.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-import java.util.LinkedList;
-
-/**
- * Test case for TE link descriptors Tlv.
- */
-public class TELinkDescriptorsTlvTest {
-    private final LinkLocalRemoteIdentifiersTlv linkLocalRemoteIdentifiersTlv1 = new
-            LinkLocalRemoteIdentifiersTlv(10, 10);
-    private final IPv4InterfaceAddressTlv iPv4InterfaceAddressTlv1 = new IPv4InterfaceAddressTlv(0x01010101);
-
-    private final LinkLocalRemoteIdentifiersTlv linkLocalRemoteIdentifiersTlv2 = new
-            LinkLocalRemoteIdentifiersTlv(20, 20);
-    private final IPv4InterfaceAddressTlv iPv4InterfaceAddressTlv2 = new IPv4InterfaceAddressTlv(0x02020202);
-
-    private final LinkedList<PcepValueType> llLinkDescriptorsSubTLVs1 = new LinkedList<>();
-    private final boolean a = llLinkDescriptorsSubTLVs1.add(linkLocalRemoteIdentifiersTlv1);
-    private final boolean b = llLinkDescriptorsSubTLVs1.add(iPv4InterfaceAddressTlv1);
-
-    private final LinkedList<PcepValueType> llLinkDescriptorsSubTLVs2 = new LinkedList<>();
-    private final boolean c = llLinkDescriptorsSubTLVs2.add(linkLocalRemoteIdentifiersTlv2);
-    private final boolean d = llLinkDescriptorsSubTLVs2.add(iPv4InterfaceAddressTlv2);
-
-    private final TELinkDescriptorsTlv tlv1 = TELinkDescriptorsTlv.of(llLinkDescriptorsSubTLVs1);
-    private final TELinkDescriptorsTlv sameAstlv1 = TELinkDescriptorsTlv.of(llLinkDescriptorsSubTLVs1);
-    private final TELinkDescriptorsTlv tlv2 = TELinkDescriptorsTlv.of(llLinkDescriptorsSubTLVs2);
-
-    @Test
-    public void basics() {
-        new EqualsTester().addEqualityGroup(tlv1, sameAstlv1).addEqualityGroup(tlv2).testEquals();
-    }
-
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TENodeAttributesTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TENodeAttributesTlvTest.java
deleted file mode 100644
index 28cf27d..0000000
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/TENodeAttributesTlvTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.pcepio.types;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-
-import java.util.LinkedList;
-
-/**
- * Test case for TE Node Attribute tlv.
- */
-public class TENodeAttributesTlvTest {
-
-    private final NodeFlagBitsTlv nodeFlagBitsTlv1 = new NodeFlagBitsTlv((byte) 10);
-    private final IPv4TERouterIdOfLocalNodeTlv iPv4TERouterIdOfLocalNodeTlv1 = new
-            IPv4TERouterIdOfLocalNodeTlv(0x01010101);
-
-    private final NodeFlagBitsTlv nodeFlagBitsTlv2 = new NodeFlagBitsTlv((byte) 20);
-    private final IPv4TERouterIdOfLocalNodeTlv iPv4TERouterIdOfLocalNodeTlv2 = new
-            IPv4TERouterIdOfLocalNodeTlv(0x02020202);
-
-    private final LinkedList<PcepValueType> llNodeAttributesSubTLV1 = new LinkedList<>();
-    private final boolean a = llNodeAttributesSubTLV1.add(nodeFlagBitsTlv1);
-    private final boolean b = llNodeAttributesSubTLV1.add(iPv4TERouterIdOfLocalNodeTlv1);
-
-    private final LinkedList<PcepValueType> llNodeAttributesSubTLV2 = new LinkedList<>();
-
-    private final boolean c = llNodeAttributesSubTLV2.add(nodeFlagBitsTlv2);
-    private final boolean d = llNodeAttributesSubTLV2.add(iPv4TERouterIdOfLocalNodeTlv2);
-
-    private final TENodeAttributesTlv tlv1 = TENodeAttributesTlv.of(llNodeAttributesSubTLV1);
-    private final TENodeAttributesTlv sameAsTlv1 = TENodeAttributesTlv.of(llNodeAttributesSubTLV1);
-    private final TENodeAttributesTlv tlv2 = TENodeAttributesTlv.of(llNodeAttributesSubTLV2);
-
-    @Test
-    public void basics() {
-        new EqualsTester().addEqualityGroup(tlv1, sameAsTlv1).addEqualityGroup(tlv2).testEquals();
-    }
-
-}
diff --git a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/UnreservedBandwidthTlvTest.java b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/UnreservedBandwidthSubTlvTest.java
similarity index 72%
rename from protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/UnreservedBandwidthTlvTest.java
rename to protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/UnreservedBandwidthSubTlvTest.java
index a50fd9f..f33018f 100644
--- a/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/UnreservedBandwidthTlvTest.java
+++ b/protocols/pcep/pcepio/src/test/java/org/onosproject/pcepio/types/UnreservedBandwidthSubTlvTest.java
@@ -19,14 +19,14 @@
 import org.junit.Test;
 
 /**
- * Unit Test case for Unreserved Bandwidth Tlv.
+ * Unit Test case for UnreservedBandwidthSubTlv.
  */
-public class UnreservedBandwidthTlvTest {
+public class UnreservedBandwidthSubTlvTest {
 
     // Objects of unreserved bandwidth tlv
-    private final UnreservedBandwidthTlv tlv1 = UnreservedBandwidthTlv.of(100);
-    private final UnreservedBandwidthTlv tlv2 = UnreservedBandwidthTlv.of(100);
-    private final UnreservedBandwidthTlv tlv3 = UnreservedBandwidthTlv.of(200);
+    private final UnreservedBandwidthSubTlv tlv1 = UnreservedBandwidthSubTlv.of(100);
+    private final UnreservedBandwidthSubTlv tlv2 = UnreservedBandwidthSubTlv.of(100);
+    private final UnreservedBandwidthSubTlv tlv3 = UnreservedBandwidthSubTlv.of(200);
 
     @Test
     public void basics() {
