diff --git a/pcep/pcepio/src/test/java/org/onosproject/pcepio/PcepInitiateMsgTest.java b/pcep/pcepio/src/test/java/org/onosproject/pcepio/PcepInitiateMsgTest.java
index 224afaa..8247dfb 100644
--- a/pcep/pcepio/src/test/java/org/onosproject/pcepio/PcepInitiateMsgTest.java
+++ b/pcep/pcepio/src/test/java/org/onosproject/pcepio/PcepInitiateMsgTest.java
@@ -17,30 +17,28 @@
 
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.jboss.netty.buffer.ChannelBuffers;
-import org.junit.Assert;
 import org.junit.Test;
 import org.onosproject.pcepio.exceptions.PcepParseException;
 import org.onosproject.pcepio.protocol.PcepFactories;
 import org.onosproject.pcepio.protocol.PcepInitiateMsg;
 import org.onosproject.pcepio.protocol.PcepMessage;
 import org.onosproject.pcepio.protocol.PcepMessageReader;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsSame.sameInstance;
 
 public class PcepInitiateMsgTest {
 
-    protected static final Logger log = LoggerFactory.getLogger(PcepInitiateMsgTest.class);
-
     /**
      * This test case checks for srp, lsp, end-point, ERO objects in PcInitiate message.
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest1() throws PcepParseException {
 
         /* srp, lsp, end-point, ERO.
          */
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, 0x54,
+        byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, 0x54,
                 0x21, 0x10, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, //SRP object
                 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x00, 0x08, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
@@ -59,39 +57,38 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PCInitiate messages are not equal ", initiateCreationMsg, testInitiateCreationMsg);
-
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
 
     /**
      * This test case checks for srp and lsp objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest2() throws PcepParseException {
         /* srp, lsp.
          */
-        byte[] initiateDeletionMsg = new byte[] {0x20, 0x0C, 0x00, 0x34,
+        byte[] initiateDeletionMsg = new byte[]{0x20, 0x0C, 0x00, 0x34,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x20, 0x10, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
                 0x01, 0x01, 0x01, 0x01, 0x00, 0x43, (byte) 0x83, 0x01,
                 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02,
-                0x00, 0x11, 0x00, 0x04, 0x54, 0x31, 0x32, 0x33 }; //SymbolicPathTlv
+                0x00, 0x11, 0x00, 0x04, 0x54, 0x31, 0x32, 0x33}; //SymbolicPathTlv
 
         byte[] testInitiateDeletionMsg = {0};
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
@@ -102,27 +99,24 @@
 
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
 
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
         testInitiateDeletionMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateDeletionMsg = new byte[iReadLen];
         buf.readBytes(testInitiateDeletionMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate(with R flag set) messages are not equal",
-                                 initiateDeletionMsg, testInitiateDeletionMsg);
+        assertThat(testInitiateDeletionMsg, is(initiateDeletionMsg));
     }
 
     /**
      * This test case checks for SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv,
      * StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO objects
      * in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest3() throws PcepParseException {
@@ -130,9 +124,9 @@
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv,
          * StatefulLspErrorCodeTlv, StatefulRsvpErrorSpecTlv), END-POINTS, ERO.
          */
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, (byte) 0x64,
+        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
+                0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
                 (byte) 0xb6, 0x02, 0x4e, 0x1f, 0x00, 0x01, (byte) 0x80, 0x01,
@@ -153,25 +147,23 @@
 
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal", initiateCreationMsg, testInitiateCreationMsg);
-
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
 
     /**
      * This test case checks for SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv,
      * StatefulLspErrorCodeTlv), END-POINT, ERO objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest4() throws PcepParseException {
@@ -179,14 +171,14 @@
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv,
          * StatefulLspErrorCodeTlv), END-POINT, ERO.
          */
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, (byte) 0x64,
+        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
+                0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
                 (byte) 0xb6, 0x02, 0x4e, 0x1f, 0x00, 0x01, (byte) 0x80, 0x01,
                 (byte) 0xb6, 0x02, 0x4e, 0x1f, (byte) 0xb6, 0x02, 0x4e, 0x20,
-                0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
+                0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
                 0x00, 0x14, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, //StatefulLspErrorCodeTlv
                 0x04, 0x12, 0x00, 0x0C, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, //Endpoints Object
                 0x07, 0x10, 0x00, 0x14, //ERO object
@@ -202,25 +194,22 @@
 
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
         message.writeTo(buf);
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal",
-                                 initiateCreationMsg, testInitiateCreationMsg);
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
 
     /**
      * This test case checks for SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv),
      * END-POINT, ERO objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest5() throws PcepParseException {
@@ -228,18 +217,18 @@
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv),
          * END-POINT, ERO.
          */
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, (byte) 0x5c,
+        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
+                0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
                 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x10, 0x03, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
                 (byte) 0xb6, 0x02, 0x4e, 0x1f, 0x00, 0x01, (byte) 0x80, 0x01,
                 (byte) 0xb6, 0x02, 0x4e, 0x1f, (byte) 0xb6, 0x02, 0x4e, 0x20,
-                0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
+                0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
                 0x04, 0x12, 0x00, 0x0C, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, //Endpoints Object
                 0x07, 0x10, 0x00, 0x14, //ERO object
                 0x01, 0x08, 0x0C, 0x01, 0x01, 0x01, 0x00, 0x00,
-                0x01, 0x08, 0x0C, 0x01, 0x01, 0x02, 0x00, 0x00 };
+                0x01, 0x08, 0x0C, 0x01, 0x01, 0x02, 0x00, 0x00};
 
         byte[] testInitiateCreationMsg = {0};
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
@@ -250,25 +239,24 @@
 
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal",
-                                 initiateCreationMsg, testInitiateCreationMsg);
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
 
     /**
      * This test case checks for SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv),
      * END-POINT, ERO objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest6() throws PcepParseException {
@@ -276,18 +264,18 @@
         /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv),
          * END-POINT, ERO.
          */
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, (byte) 0x5c,
+        byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x5c,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
-                0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
+                0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
                 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x10, 0x03,
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
                 (byte) 0xb6, 0x02, 0x4e, 0x1f, 0x00, 0x01, (byte) 0x80, 0x01,
                 (byte) 0xb6, 0x02, 0x4e, 0x1f, (byte) 0xb6, 0x02, 0x4e, 0x20,
-                0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
+                0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
                 0x04, 0x12, 0x00, 0x0C, 0x01, 0x01, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, //Endpoints Object
                 0x07, 0x10, 0x00, 0x14, //ERO object
                 0x01, 0x08, 0x0C, 0x01, 0x01, 0x01, 0x00, 0x00,
-                0x01, 0x08, 0x0C, 0x01, 0x01, 0x02, 0x00, 0x00 };
+                0x01, 0x08, 0x0C, 0x01, 0x01, 0x02, 0x00, 0x00};
 
         byte[] testInitiateCreationMsg = {0};
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
@@ -296,27 +284,27 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal",
-                                 initiateCreationMsg, testInitiateCreationMsg);
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
 
     /**
      * This test case checks for SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv),
      * END-POINT, ERO objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest7() throws PcepParseException {
@@ -324,9 +312,9 @@
         /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv),
          * END-POINT, ERO.
          */
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, (byte) 0x54,
+        byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x54,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
-                0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
+                0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
                 (byte) 0xb6, 0x02, 0x4e, 0x1f, 0x00, 0x01, (byte) 0x80, 0x01,
@@ -343,27 +331,27 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal",
-                                 initiateCreationMsg, testInitiateCreationMsg);
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
 
     /**
      * This test case checks for SRP, LSP (StatefulIPv4LspIdentidiersTlv),
      * END-POINT, ERO objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest8() throws PcepParseException {
@@ -371,7 +359,7 @@
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv),
          * END-POINT, ERO.
          */
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, (byte) 0x4c,
+        byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x4c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
@@ -389,27 +377,27 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal",
-                                 initiateCreationMsg, testInitiateCreationMsg);
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
 
     /**
      * This test case checks for SRP, LSP (StatefulIPv4LspIdentidiersTlv),
      * END-POINT, ERO objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest9() throws PcepParseException {
@@ -417,7 +405,7 @@
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv),
          * END-POINT, ERO.
          */
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, (byte) 0x3c,
+        byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x3c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
@@ -433,34 +421,34 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal",
-                                 initiateCreationMsg, testInitiateCreationMsg);
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
 
     /**
      * This test case checks for SRP, LSP (StatefulIPv4LspIdentidiersTlv, StatefulRsvpErrorSpecTlv)
      * objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest10() throws PcepParseException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, StatefulRsvpErrorSpecTlv).
          */
-        byte[] initiateDeletionMsg = new byte[] {0x20, 0x0C, 0x00, 0x44,
+        byte[] initiateDeletionMsg = new byte[]{0x20, 0x0C, 0x00, 0x44,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathTlv
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -477,34 +465,34 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateDeletionMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateDeletionMsg = new byte[iReadLen];
         buf.readBytes(testInitiateDeletionMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal",
-                                 initiateDeletionMsg, testInitiateDeletionMsg);
+        assertThat(testInitiateDeletionMsg, is(initiateDeletionMsg));
     }
 
     /**
      * This test case checks for SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv,
      * StatefulLspErrorCodeTlv) objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest11() throws PcepParseException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv,
            StatefulLspErrorCodeTlv).*/
-        byte[] initiateDeletionMsg = new byte[] {0x20, 0x0C, 0x00, 0x44,
+        byte[] initiateDeletionMsg = new byte[]{0x20, 0x0C, 0x00, 0x44,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathTlv
                 0x20, 0x10, 0x00, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP object
@@ -521,35 +509,34 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateDeletionMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateDeletionMsg = new byte[iReadLen];
         buf.readBytes(testInitiateDeletionMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate(with R flag set) messages are not equal",
-                                 initiateDeletionMsg, testInitiateDeletionMsg);
-
+        assertThat(testInitiateDeletionMsg, is(initiateDeletionMsg));
     }
 
     /**
      * This test case checks for SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv)
      * objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest12() throws PcepParseException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv).
          */
-        byte[] initiateDeletionMsg = new byte[] {0x20, 0x0C, 0x00, 0x3c,
+        byte[] initiateDeletionMsg = new byte[]{0x20, 0x0C, 0x00, 0x3c,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathTlv
                 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x10, 0x03, 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
@@ -565,40 +552,40 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateDeletionMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateDeletionMsg = new byte[iReadLen];
         buf.readBytes(testInitiateDeletionMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate(with R flag set) messages are not equal",
-                                 initiateDeletionMsg, testInitiateDeletionMsg);
+        assertThat(testInitiateDeletionMsg, is(initiateDeletionMsg));
     }
 
     /**
      * This test case checks for SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv)
      * objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest13() throws PcepParseException {
 
         /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, SymbolicPathNameTlv).
          */
-        byte[] initiateDeletionMsg = new byte[] {0x20, 0x0C, 0x00, 0x3c,
+        byte[] initiateDeletionMsg = new byte[]{0x20, 0x0C, 0x00, 0x3c,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathTlv
                 0x20, 0x10, 0x00, 0x24, 0x00, 0x00, 0x10, 0x03, 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
                 (byte) 0xb6, 0x02, 0x4e, 0x1f, 0x00, 0x01, (byte) 0x80, 0x01,
                 (byte) 0xb6, 0x02, 0x4e, 0x1f, (byte) 0xb6, 0x02, 0x4e, 0x20,
-                0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00 }; //SymbolicPathNameTlv
+                0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00}; //SymbolicPathNameTlv
 
         byte[] testInitiateDeletionMsg = {0};
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
@@ -607,40 +594,40 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateDeletionMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateDeletionMsg = new byte[iReadLen];
         buf.readBytes(testInitiateDeletionMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate(with R flag set) messages are not equal",
-                                 initiateDeletionMsg, testInitiateDeletionMsg);
+        assertThat(testInitiateDeletionMsg, is(initiateDeletionMsg));
     }
 
     /**
      * This test case checks for SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv)
      * objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest14() throws PcepParseException {
 
         /* SRP, LSP (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv).
          */
-        byte[] initiateDeletionMsg = new byte[] {0x20, 0x0C, 0x00, 0x34,
+        byte[] initiateDeletionMsg = new byte[]{0x20, 0x0C, 0x00, 0x34,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathTlv
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
                 (byte) 0xb6, 0x02, 0x4e, 0x1f, 0x00, 0x01, (byte) 0x80, 0x01,
-                (byte) 0xb6, 0x02, 0x4e, 0x1f, (byte) 0xb6, 0x02, 0x4e, 0x20 };
+                (byte) 0xb6, 0x02, 0x4e, 0x1f, (byte) 0xb6, 0x02, 0x4e, 0x20};
 
         byte[] testInitiateDeletionMsg = {0};
         ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
@@ -649,35 +636,34 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateDeletionMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateDeletionMsg = new byte[iReadLen];
         buf.readBytes(testInitiateDeletionMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate(with R flag set) messages are not equal",
-                                 initiateDeletionMsg, testInitiateDeletionMsg);
-
+        assertThat(testInitiateDeletionMsg, is(initiateDeletionMsg));
     }
 
     /**
      * This test case checks for SRP, LSP (StatefulIPv4LspIdentidiersTlv)
      * objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest15() throws PcepParseException {
 
         /* SRP, LSP (StatefulIPv4LspIdentidiersTlv).
          */
-        byte[] initiateDeletionMsg = new byte[] {0x20, 0x0C, 0x00, 0x2c,
+        byte[] initiateDeletionMsg = new byte[]{0x20, 0x0C, 0x00, 0x2c,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
@@ -691,33 +677,33 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateDeletionMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateDeletionMsg = new byte[iReadLen];
         buf.readBytes(testInitiateDeletionMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal", initiateDeletionMsg, testInitiateDeletionMsg);
-
+        assertThat(testInitiateDeletionMsg, is(initiateDeletionMsg));
     }
 
     /**
      * This test case checks for srp,lsp (StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa
      * objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest16() throws PcepParseException {
 
         //srp,lsp (StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, (byte) 0x50,
+        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
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
@@ -735,33 +721,33 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal",
-                                 initiateCreationMsg, testInitiateCreationMsg);
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
 
     /**
      * This test case checks for srp,lsp (StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth
      * objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest17() throws PcepParseException {
 
         //srp,lsp (StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, (byte) 0x58,
+        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
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
@@ -780,32 +766,31 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal", initiateCreationMsg, testInitiateCreationMsg);
-
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
 
     /**
      * This test case checks for srp,lsp (StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth,metric-list
      * objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest18() throws PcepParseException {
         //srp,lsp (StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth,metric-list
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, (byte) 0x64,
+        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
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
@@ -825,33 +810,32 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal",
-                                 initiateCreationMsg, testInitiateCreationMsg);
-
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
 
     /**
      * This test case checks for srp,lsp(all tlvs),end-point,ero,lspa,bandwidth,metric-list
      * objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest19() throws PcepParseException {
         //srp,lsp(all tlvs),end-point,ero,lspa,bandwidth,metric-list
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, (byte) 0x74,
+        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, 0x2c, 0x00, 0x00, 0x10, 0x03, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
@@ -873,42 +857,42 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal",
-                                 initiateCreationMsg, testInitiateCreationMsg);
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
 
     /**
      * This test case checks for srp,lsp (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, srp,
      * lsp(SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv) objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest20() throws PcepParseException {
         /* srp,lsp (SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv, srp,
          *  lsp(SymbolicPathNameTlv, StatefulIPv4LspIdentidiersTlv).
          */
-        byte[] initiateDeletionMsg = new byte[] {0x20, 0x0C, 0x00, 0x64,
+        byte[] initiateDeletionMsg = new byte[]{0x20, 0x0C, 0x00, 0x64,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, //SRP object
-                0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
+                0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
                 (byte) 0xb6, 0x02, 0x4e, 0x1f, 0x00, 0x01, (byte) 0x80, 0x01,
                 (byte) 0xb6, 0x02, 0x4e, 0x1f, (byte) 0xb6, 0x02, 0x4e, 0x20,
                 0x21, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, //SRP object
-                0x00, 0x11, 0x00, 0x02,  0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
+                0x00, 0x11, 0x00, 0x02, 0x54, 0x31, 0x00, 0x00, //SymbolicPathNameTlv
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
                 (byte) 0xb6, 0x02, 0x4e, 0x1f, 0x00, 0x01, (byte) 0x80, 0x01,
@@ -921,35 +905,34 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateDeletionMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateDeletionMsg = new byte[iReadLen];
         buf.readBytes(testInitiateDeletionMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal",
-                                 initiateDeletionMsg, testInitiateDeletionMsg);
-
+        assertThat(testInitiateDeletionMsg, is(initiateDeletionMsg));
     }
 
     /**
      * This test case checks for srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero
      * objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest21() throws PcepParseException {
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero
          */
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, (byte) 0x94,
+        byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0x94,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
@@ -976,35 +959,34 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal",
-                                 initiateCreationMsg, testInitiateCreationMsg);
-
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
 
     /**
      * This test case checks for srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa
      * objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest22() throws PcepParseException {
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa
          */
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, (byte) 0xA8,
+        byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0xA8,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
@@ -1032,34 +1014,34 @@
 
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal", initiateCreationMsg, testInitiateCreationMsg);
-
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
 
     /**
      * This test case checks for srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth
      * objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest23() throws PcepParseException {
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth
          */
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, (byte) 0xB0,
+        byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0xB0,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
@@ -1089,33 +1071,33 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal",
-                                 initiateCreationMsg, testInitiateCreationMsg);
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
 
     /**
      * This test case checks for srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth
      * objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest24() throws PcepParseException {
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth*/
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, (byte) 0xBC,
+        byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0xBC,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
@@ -1146,27 +1128,28 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal", initiateCreationMsg, testInitiateCreationMsg);
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
 
     /**
      * This test case checks for srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,bandwidth,
      * srp,lsp(StatefulIPv4LspIdentidiersTlv), end-point,ero,lspa,bandwidth,metric-list
      * objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest25() throws PcepParseException {
@@ -1174,7 +1157,7 @@
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,bandwidth,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),
          * end-point,ero,lspa,bandwidth,metric-list */
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, (byte) 0xC4,
+        byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0xC4,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
@@ -1206,29 +1189,28 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal",
-                                 initiateCreationMsg, testInitiateCreationMsg);
-
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
 
     /**
      * This test case checks for srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,bandwidth,metric-list,
      * srp,lsp(StatefulIPv4LspIdentidiersTlv), end-point,ero,lspa,bandwidth,metric-list
      * objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest26() throws PcepParseException {
@@ -1236,7 +1218,7 @@
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,bandwidth,metric-list,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),
          * end-point,ero,lspa,bandwidth,metric-list */
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, (byte) 0xD0,
+        byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0xD0,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
@@ -1269,29 +1251,28 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal",
-                                 initiateCreationMsg, testInitiateCreationMsg);
-
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
 
     /**
      * This test case checks for srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth,metric-list,
      * srp,lsp(StatefulIPv4LspIdentidiersTlv), end-point,ero,lspa,bandwidth,metric-list
      * objects in PcInitiate message.
-     *
-     * @throws PcepParseException when message paring fails
      */
     @Test
     public void initiateMessageTest27() throws PcepParseException {
@@ -1299,7 +1280,7 @@
         /*srp,lsp(StatefulIPv4LspIdentidiersTlv),end-point,ero,lspa,bandwidth,metric-list,
          * srp,lsp(StatefulIPv4LspIdentidiersTlv),
          * end-point,ero,lspa,bandwidth,metric-list */
-        byte[] initiateCreationMsg = new byte[] {0x20, 0x0C, 0x00, (byte) 0xE4,
+        byte[] initiateCreationMsg = new byte[]{0x20, 0x0C, 0x00, (byte) 0xE4,
                 0x21, 0x10, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, //SRP object
                 0x20, 0x10, 0x00, 0x1c, 0x00, 0x00, 0x10, 0x03, //LSP object
                 0x00, 0x12, 0x00, 0x10, //StatefulIPv4LspIdentidiersTlv
@@ -1334,19 +1315,21 @@
         PcepMessageReader<PcepMessage> reader = PcepFactories.getGenericReader();
         PcepMessage message = null;
 
+
         message = reader.readFrom(buffer);
 
-        Assert.assertTrue("PcepMessage is not instance of PcInitiate",
-                          (message instanceof PcepInitiateMsg));
+        assertThat(message, sameInstance((PcepInitiateMsg) message));
+
         ChannelBuffer buf = ChannelBuffers.dynamicBuffer();
+
         message.writeTo(buf);
+
         testInitiateCreationMsg = buf.array();
 
-        int iReadLen = buf.writerIndex() - 0;
+        int iReadLen = buf.writerIndex();
         testInitiateCreationMsg = new byte[iReadLen];
         buf.readBytes(testInitiateCreationMsg, 0, iReadLen);
 
-        Assert.assertArrayEquals("PcInitiate messages are not equal",
-                                 initiateCreationMsg, testInitiateCreationMsg);
+        assertThat(testInitiateCreationMsg, is(initiateCreationMsg));
     }
-}
\ No newline at end of file
+}
