diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/Psnp.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/Psnp.java
old mode 100644
new mode 100755
index 6ed6a4c..1585819
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/Psnp.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/Psnp.java
@@ -79,11 +79,25 @@
         populateHeader(isisHeader);
     }
 
+    /**
+     * Adds the TLV to list.
+     *
+     * @param isisTlv ISIS TLV instance
+     */
     public void addTlv(IsisTlv isisTlv) {
         variableLengths.add(isisTlv);
     }
 
     /**
+     * Returns the list of all tlvs.
+     *
+     * @return variableLengths list of tlvs
+     */
+    public List<IsisTlv> getAllTlv() {
+        return variableLengths;
+    }
+
+    /**
      * Returns the source ID of csnp.
      *
      * @return sourceId source ID
@@ -136,7 +150,9 @@
             TlvType tlvValue = TlvType.get(tlvHeader.tlvType());
             if (tlvValue != null) {
                 IsisTlv tlv = TlvFinder.findTlv(tlvHeader, channelBuffer.readBytes(tlvHeader.tlvLength()));
-                this.variableLengths.add(tlv);
+                if (tlv != null) {
+                    this.variableLengths.add(tlv);
+                }
             } else {
                 channelBuffer.readBytes(tlvHeader.tlvLength());
             }
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisUtil.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisUtil.java
old mode 100644
new mode 100755
index c21a93b..6b665ac
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisUtil.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisUtil.java
@@ -654,7 +654,7 @@
      * @return given number as bytes
      */
     public static byte[] convertToThreeBytes(int numberToConvert) {
-        byte[] numInBytes = new byte[4];
+        byte[] numInBytes = new byte[3];
         String s1 = Integer.toHexString(numberToConvert);
         if (s1.length() % 2 != 0) {
             s1 = "0" + s1;
@@ -708,4 +708,4 @@
         }
         return Bytes.toArray(byteList);
     }
-}
\ No newline at end of file
+}
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/IsisHeaderTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/IsisHeaderTest.java
new file mode 100644
index 0000000..9baddb6
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/IsisHeaderTest.java
@@ -0,0 +1,310 @@
+/*
+ * Copyright 2016-present 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.isis.io.isispacket;
+
+import org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.MacAddress;
+import org.onosproject.isis.controller.IsisPduType;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+/**
+ * Unit test class for IsisHeader.
+ */
+public class IsisHeaderTest {
+
+    private IsisHeader isisHeader;
+    private MacAddress macAddress = MacAddress.valueOf("a4:23:05:00:00:00");
+    private int result;
+    private MacAddress result1;
+    private byte result2;
+    private IsisPduType result3;
+    private ChannelBuffer channelBuffer;
+
+    @Before
+    public void setUp() throws Exception {
+        isisHeader = new IsisHeader();
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        isisHeader = null;
+    }
+
+    /**
+     * Tests interfaceIndex() getter method.
+     */
+    @Test
+    public void testInterfaceIndex() throws Exception {
+        isisHeader.setInterfaceIndex(1);
+        result = isisHeader.interfaceIndex();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests interfaceIndex() setter method.
+     */
+    @Test
+    public void testSetInterfaceIndex() throws Exception {
+        isisHeader.setInterfaceIndex(1);
+        result = isisHeader.interfaceIndex();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests interfaceMac() getter method.
+     */
+    @Test
+    public void testInterfaceMac() throws Exception {
+        isisHeader.setInterfaceMac(macAddress);
+        result1 = isisHeader.interfaceMac();
+        assertThat(result1, is(macAddress));
+    }
+
+    /**
+     * Tests sourceMac() getter method.
+     */
+    @Test
+    public void testSourceMac() throws Exception {
+        isisHeader.setSourceMac(macAddress);
+        result1 = isisHeader.sourceMac();
+        assertThat(result1, is(macAddress));
+    }
+
+    /**
+     * Tests sourceMac() setter method.
+     */
+    @Test
+    public void testSetSourceMac() throws Exception {
+        isisHeader.setSourceMac(macAddress);
+        result1 = isisHeader.sourceMac();
+        assertThat(result1, is(macAddress));
+    }
+
+    /**
+     * Tests interfaceMac() setter method.
+     */
+    @Test
+    public void testSetInterfaceMac() throws Exception {
+        isisHeader.setSourceMac(macAddress);
+        result1 = isisHeader.sourceMac();
+        assertThat(result1, is(macAddress));
+    }
+
+    /**
+     * Tests version2() getter method.
+     */
+    @Test
+    public void testVersion2() throws Exception {
+        isisHeader.setVersion2((byte) 1);
+        result2 = isisHeader.version2();
+        assertThat(result2, is((byte) 1));
+    }
+
+    /**
+     * Tests version2() setter method.
+     */
+    @Test
+    public void testSetVersion2() throws Exception {
+        isisHeader.setVersion2((byte) 1);
+        result2 = isisHeader.version2();
+        assertThat(result2, is((byte) 1));
+    }
+
+    /**
+     * Tests maximumAreaAddresses() getter method.
+     */
+    @Test
+    public void testMaximumAreaAddresses() throws Exception {
+        isisHeader.setMaximumAreaAddresses((byte) 1);
+        result2 = isisHeader.maximumAreaAddresses();
+        assertThat(result2, is((byte) 1));
+    }
+
+    /**
+     * Tests maximumAreaAddresses() setter method.
+     */
+    @Test
+    public void testSetMaximumAreaAddresses() throws Exception {
+        isisHeader.setMaximumAreaAddresses((byte) 1);
+        result2 = isisHeader.maximumAreaAddresses();
+        assertThat(result2, is((byte) 1));
+    }
+
+    /**
+     * Tests reserved() getter method.
+     */
+    @Test
+    public void testReserved() throws Exception {
+        isisHeader.setReserved((byte) 1);
+        result2 = isisHeader.reserved();
+        assertThat(result2, is((byte) 1));
+    }
+
+    /**
+     * Tests reserved() setter method.
+     */
+    @Test
+    public void testSetReserved() throws Exception {
+        isisHeader.setReserved((byte) 1);
+        result2 = isisHeader.reserved();
+        assertThat(result2, is((byte) 1));
+    }
+
+    /**
+     * Tests version() getter method.
+     */
+    @Test
+    public void testVersion() throws Exception {
+        isisHeader.setVersion((byte) 1);
+        result2 = isisHeader.version();
+        assertThat(result2, is((byte) 1));
+    }
+
+    /**
+     * Tests version() setter method.
+     */
+    @Test
+    public void testSetVersion() throws Exception {
+        isisHeader.setVersion((byte) 1);
+        result2 = isisHeader.version();
+        assertThat(result2, is((byte) 1));
+    }
+
+    /**
+     * Tests idLength() getter method.
+     */
+    @Test
+    public void testIdLength() throws Exception {
+        isisHeader.setIdLength((byte) 1);
+        result2 = isisHeader.idLength();
+        assertThat(result2, is((byte) 1));
+    }
+
+    /**
+     * Tests idLength() setter method.
+     */
+    @Test
+    public void testSetIdLength() throws Exception {
+        isisHeader.setIdLength((byte) 1);
+        result2 = isisHeader.idLength();
+        assertThat(result2, is((byte) 1));
+    }
+
+    /**
+     * Tests pduType() getter method.
+     */
+    @Test
+    public void testPduType() throws Exception {
+        isisHeader.setIsisPduType(1);
+        result = isisHeader.pduType();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests pduType() setter method.
+     */
+    @Test
+    public void testSetIsisPduType() throws Exception {
+        isisHeader.setIsisPduType(1);
+        result = isisHeader.pduType();
+        assertThat(result, is(1));
+    }
+
+    /**
+     * Tests pduHeaderLength() getter method.
+     */
+    @Test
+    public void testPduHeaderLength() throws Exception {
+        isisHeader.setPduHeaderLength((byte) 1);
+        result2 = isisHeader.pduHeaderLength();
+        assertThat(result2, is((byte) 1));
+    }
+
+    /**
+     * Tests pduHeaderLength() setter method.
+     */
+    @Test
+    public void testSetPduHeaderLength() throws Exception {
+        isisHeader.setPduHeaderLength((byte) 1);
+        result2 = isisHeader.pduHeaderLength();
+        assertThat(result2, is((byte) 1));
+    }
+
+    /**
+     * Tests irpDiscriminator() getter method.
+     */
+    @Test
+    public void testIrpDiscriminator() throws Exception {
+        isisHeader.setIrpDiscriminator((byte) 1);
+        result2 = isisHeader.irpDiscriminator();
+        assertThat(result2, is((byte) 1));
+    }
+
+    /**
+     * Tests irpDiscriminator() setter method.
+     */
+    @Test
+    public void testSetIrpDiscriminator() throws Exception {
+        isisHeader.setIrpDiscriminator((byte) 1);
+        result2 = isisHeader.irpDiscriminator();
+        assertThat(result2, is((byte) 1));
+    }
+
+    /**
+     * Tests irpDiscriminator() setter method.
+     */
+    @Test
+    public void testIsisPduType() throws Exception {
+        isisHeader.setIsisPduType(IsisPduType.L1HELLOPDU.value());
+        result3 = isisHeader.isisPduType();
+        assertThat(result3, is(IsisPduType.L1HELLOPDU));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        isisHeader.readFrom(channelBuffer);
+        assertThat(isisHeader, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        isisHeader.asBytes();
+        assertThat(isisHeader, is(notNullValue()));
+    }
+
+    /**
+     * Tests populateHeader() method.
+     */
+    @Test
+    public void testPopulateHeader() throws Exception {
+        isisHeader.populateHeader(new IsisHeader());
+        assertThat(isisHeader, is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/IsisMessageReaderTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/IsisMessageReaderTest.java
new file mode 100644
index 0000000..a8523d2
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/IsisMessageReaderTest.java
@@ -0,0 +1,264 @@
+/*
+ * Copyright 2016-present 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.isis.io.isispacket;
+
+import com.google.common.primitives.Bytes;
+import org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.controller.IsisMessage;
+import org.onosproject.isis.io.isispacket.pdu.Csnp;
+import org.onosproject.isis.io.isispacket.pdu.L1L2HelloPdu;
+import org.onosproject.isis.io.isispacket.pdu.LsPdu;
+import org.onosproject.isis.io.isispacket.pdu.P2PHelloPdu;
+import org.onosproject.isis.io.isispacket.pdu.Psnp;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for IsisMessageReader.
+ */
+public class IsisMessageReaderTest {
+
+    private final byte[] helloP2P = {
+            -125, 20, 1, 0, 17, 1, 0, 0,
+            2, 51, 51, 51, 51, 51, 51, 0, 100, 5, -39, -126, 1, 4, 3,
+            73, 0, 0, -127, 1, -52, -124, 4, -64, -88, 56, 102, 8, -1,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 8, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, -1, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, -1, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 8, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 8, -81, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+    };
+    private final byte[] helloL1L2 = {
+            -125, 27, 1, 0, 15, 1, 0, 0, 1, 34, 34, 34, 34, 34, 34, 0,
+            30, 5, -39, 64, 34, 34, 34, 34, 34, 34, 1, -127, 1, -52, 1,
+            4, 3, 73, 0, 10, -124, 4, 10, 0, 10, 2, -45, 3, 0, 0, 0,
+            8, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, -1, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,
+            -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 8, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 8, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, -93, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+    };
+    private final byte[] l1Lsp = {
+            -125, 27, 1, 0, 18, 1, 0, 0, 0, 86, 4, -81, 34, 34, 34,
+            34, 34, 34, 0, 0, 0, 0, 0, 9, 99, 11, 1, 1, 4, 3, 73,
+            0, 10, -127, 1, -52, -119, 2, 82, 50, -124, 4, -64, -88, 10, 1, -128,
+            24, 10, -128, -128, -128, 10, 0, 10, 0, -1, -1, -1, -4, 10, -128, -128,
+            -128, -64, -88, 10, 0, -1, -1, -1, 0, 2, 12, 0, 10, -128, -128, -128,
+            51, 51, 51, 51, 51, 51, 2
+    };
+    private final byte[] csnp = {
+            -125, 33, 1, 6, 25, 1, 0, 3, 0, 67, 18, 52, 18, 52, 0,
+            18, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1,
+            -1, -1, 9, 32, 4, -81, 18, 52, 18, 52, 0, 18, 0, 0, 0,
+            0, 0, 41, -92, -30, 4, -81, 41, 41, 41, 41, 41, 41, 0,
+            0, 0, 0, 0, 1, 91, 126
+    };
+    private final byte[] psnp = {
+            -125, 17, 1, 0, 27, 1, 0, 0, 0, 35, 41, 41,
+            41, 41, 41, 41, 0, 9, 16, 4, -81, 18, 52, 18,
+            52, 0, 18, 0, 0, 0, 0, 0, 42, -94, -29
+
+    };
+    private IsisMessageReader reader;
+    private ChannelBuffer channelBuffer;
+    private IsisMessage message;
+
+    @Before
+    public void setUp() throws Exception {
+        reader = new IsisMessageReader();
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        reader = null;
+        channelBuffer = null;
+        message = null;
+    }
+
+    /**
+     * Tests readFromBuffer() method.
+     */
+    @Test
+    public void testReadFromBuffer() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(helloP2P);
+        message = reader.readFromBuffer(channelBuffer);
+        assertThat(message, is(instanceOf(P2PHelloPdu.class)));
+
+        channelBuffer = ChannelBuffers.copiedBuffer(helloL1L2);
+        message = reader.readFromBuffer(channelBuffer);
+        assertThat(message, is(instanceOf(L1L2HelloPdu.class)));
+
+        byte[] tlv1 = Bytes.concat(l1Lsp, (IsisUtil.getPaddingTlvs(l1Lsp.length)));
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv1);
+        message = reader.readFromBuffer(channelBuffer);
+        assertThat(message, is(instanceOf(LsPdu.class)));
+
+        tlv1 = Bytes.concat(csnp, (IsisUtil.getPaddingTlvs(csnp.length)));
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv1);
+        message = reader.readFromBuffer(channelBuffer);
+        assertThat(message, is(instanceOf(Csnp.class)));
+
+        tlv1 = Bytes.concat(psnp, (IsisUtil.getPaddingTlvs(psnp.length)));
+        channelBuffer = ChannelBuffers.copiedBuffer(tlv1);
+        message = reader.readFromBuffer(channelBuffer);
+        assertThat(message, is(instanceOf(Psnp.class)));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/CsnpTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/CsnpTest.java
new file mode 100644
index 0000000..ad4125c
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/CsnpTest.java
@@ -0,0 +1,246 @@
+/*
+ * Copyright 2016-present 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.isis.io.isispacket.pdu;
+
+import org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.controller.IsisPduType;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+import org.onosproject.isis.io.isispacket.tlv.AdjacencyStateTlv;
+import org.onosproject.isis.io.isispacket.tlv.IsisTlv;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * Unit test class for Csnp.
+ */
+public class CsnpTest {
+
+    private final String srcId = "1111.1111.1111";
+    private final byte[] csnpBytes = {
+            0, 67, 18, 52, 18, 52, 0, 0, 67, 18, 52, 18, 52, 0,
+            18, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1,
+            -1, -1, 9, 32, 4, -81, 18, 52, 18, 52, 0, 18, 0, 0, 0,
+            0, 0, 41, -92, -30, 4, -81, 41, 41, 41, 41, 41, 41, 0,
+            0, 0, 0, 0, 1, 91, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0
+    };
+    private Csnp csnp;
+    private IsisHeader isisHeader;
+    private IsisTlv isisTlv;
+    private TlvHeader tlvHeader;
+    private List<IsisTlv> resultList;
+    private String resultStr;
+    private int resultInt;
+    private ChannelBuffer channelBuffer;
+    private byte[] result;
+
+    @Before
+    public void setUp() throws Exception {
+        isisHeader = new IsisHeader();
+        isisHeader.setIsisPduType(IsisPduType.L1CSNP.value());
+        csnp = new Csnp(isisHeader);
+        tlvHeader = new TlvHeader();
+        isisTlv = new AdjacencyStateTlv(tlvHeader);
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        isisHeader = null;
+        csnp = null;
+        tlvHeader = null;
+        isisTlv = null;
+    }
+
+    /**
+     * Tests getAllTlv()  method.
+     */
+    @Test
+    public void testGetAllTlv() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(csnpBytes);
+        csnp.readFrom(channelBuffer);
+        resultList = csnp.getAllTlv();
+        assertThat(resultList.size(), is(0));
+    }
+
+    /**
+     * Tests sourceId() getter method.
+     */
+    @Test
+    public void testSourceId() throws Exception {
+        csnp.setSourceId(srcId);
+        resultStr = csnp.sourceId();
+        assertThat(resultStr, is(srcId));
+    }
+
+    /**
+     * Tests sourceId() setter method.
+     */
+    @Test
+    public void testSetSourceId() throws Exception {
+        csnp.setSourceId(srcId);
+        resultStr = csnp.sourceId();
+        assertThat(resultStr, is(srcId));
+    }
+
+
+    /**
+     * Tests startLspId() getter method.
+     */
+    @Test
+    public void testStartLspId() throws Exception {
+        csnp.setStartLspId(srcId);
+        resultStr = csnp.startLspId();
+        assertThat(resultStr, is(srcId));
+    }
+
+    /**
+     * Tests startLspId() setter method.
+     */
+    @Test
+    public void testSetStartLspId() throws Exception {
+        csnp.setStartLspId(srcId);
+        resultStr = csnp.startLspId();
+        assertThat(resultStr, is(srcId));
+    }
+
+    /**
+     * Tests endLspId()  getter method.
+     */
+    @Test
+    public void testEndLspId() throws Exception {
+        csnp.setEndLspId(srcId);
+        resultStr = csnp.endLspId();
+        assertThat(resultStr, is(srcId));
+    }
+
+    /**
+     * Tests endLspId() setter method.
+     */
+    @Test
+    public void testSetEndLspId() throws Exception {
+        csnp.setEndLspId(srcId);
+        resultStr = csnp.endLspId();
+        assertThat(resultStr, is(srcId));
+    }
+
+    /**
+     * Tests pduLength() getter method.
+     */
+    @Test
+    public void testPduLength() throws Exception {
+        csnp.setPduLength(10);
+        resultInt = csnp.pduLength();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests pduLength() setter method.
+     */
+    @Test
+    public void testSetPduLength() throws Exception {
+        csnp.setPduLength(10);
+        resultInt = csnp.pduLength();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(csnpBytes);
+        csnp.readFrom(channelBuffer);
+        assertThat(csnp, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(csnpBytes);
+        csnp.readFrom(channelBuffer);
+        result = csnp.asBytes();
+        assertThat(csnp, is(notNullValue()));
+    }
+
+    /**
+     * Tests isisPduHeader() method.
+     */
+    @Test
+    public void testIsisPduHeader() throws Exception {
+        result = csnp.isisPduHeader();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests completeSequenceNumberPduBody() method.
+     */
+    @Test
+    public void testCompleteSequenceNumberPduBody() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(csnpBytes);
+        csnp.readFrom(channelBuffer);
+        result = csnp.completeSequenceNumberPduBody();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString() method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat((csnp.toString()), is(notNullValue()));
+    }
+
+    /**
+     * Tests equals() method.
+     */
+    @Test
+    public void testEquals() throws Exception {
+        assertThat(csnp.equals(new Csnp(new IsisHeader())), is(true));
+    }
+
+    /**
+     * Tests hashCode() method.
+     */
+    @Test
+    public void testHashCode() throws Exception {
+        int hashCode = csnp.hashCode();
+        assertThat(hashCode, is(notNullValue()));
+    }
+}
+
+
+
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/HelloPduTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/HelloPduTest.java
new file mode 100644
index 0000000..624c649
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/HelloPduTest.java
@@ -0,0 +1,324 @@
+/*
+ * Copyright 2016-present 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.isis.io.isispacket.pdu;
+
+import org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.MacAddress;
+import org.onosproject.isis.controller.IsisInterfaceState;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+import org.onosproject.isis.io.isispacket.tlv.AdjacencyStateTlv;
+import org.onosproject.isis.io.isispacket.tlv.IsisTlv;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.*;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * Unit test class for HelloPdu.
+ */
+public class HelloPduTest {
+
+    private final byte[] macAddr = new byte[]{
+            (byte) 0xa4, (byte) 0x22, (byte) 0xc2, 0x00, 0x00, 0x00
+    };
+    private final String srcId = "1111.1111.1111";
+    private final byte[] helloL1L2 = {
+            1, 34, 34, 34, 34, 34, 34, 0,
+            30, 5, -39, 64, 34, 34, 34, 34, 34, 34, 1, -127, 1, -52, 1,
+            4, 3, 73, 0, 10, -124, 4, 10, 0, 10, 2, -45, 3, 0, 0, 0,
+            8, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, -1, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,
+            -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 8, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 8, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, -93, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+    };
+
+    private HelloPdu helloPdu;
+    private IsisHeader isisHeader;
+    private IsisTlv isisTlv;
+    private TlvHeader tlvHeader;
+    private MacAddress macAddress;
+    private List<IsisTlv> resultList;
+    private List<String> resultListStr;
+    private List<Ip4Address> resultListIPv4;
+    private List<MacAddress> resultListMac;
+    private IsisInterfaceState resultAdjState;
+    private String resultStr;
+    private int resultInt;
+    private byte resultByte;
+    private ChannelBuffer channelBuffer;
+    private HelloPdu pdu;
+
+    @Before
+    public void setUp() throws Exception {
+        isisHeader = new IsisHeader();
+        helloPdu = new L1L2HelloPdu(isisHeader);
+        tlvHeader = new TlvHeader();
+        isisTlv = new AdjacencyStateTlv(tlvHeader);
+        macAddress = new MacAddress(macAddr);
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+        pdu = helloPdu;
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        isisHeader = null;
+        helloPdu = null;
+        isisTlv = null;
+        tlvHeader = null;
+        macAddress = null;
+    }
+
+    /**
+     * Tests addTlv() getter method.
+     */
+    @Test
+    public void testAddTlv() throws Exception {
+        helloPdu.addTlv(isisTlv);
+        resultList = helloPdu.tlvs();
+        assertThat(resultList.size(), is(1));
+    }
+
+    /**
+     * Tests tlvs()  method.
+     */
+    @Test
+    public void testTlvs() throws Exception {
+        helloPdu.addTlv(isisTlv);
+        resultList = helloPdu.tlvs();
+        assertThat(resultList.size(), is(1));
+    }
+
+    /**
+     * Tests areaAddres()  method.
+     */
+    @Test
+    public void testAreaAddress() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(helloL1L2);
+        helloPdu.readFrom(channelBuffer);
+        resultListStr = helloPdu.areaAddress();
+        assertThat(resultListStr.size(), is(1));
+    }
+
+    /**
+     * Tests interfaceIpAddresse() method.
+     */
+    @Test
+    public void testInterfaceIpAddresses() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(helloL1L2);
+        helloPdu.readFrom(channelBuffer);
+        resultListIPv4 = helloPdu.interfaceIpAddresses();
+        assertThat(resultListIPv4.size(), is(1));
+    }
+
+    /**
+     * Tests neighborList() method.
+     */
+    @Test
+    public void testNeighborList() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(helloL1L2);
+        helloPdu.readFrom(channelBuffer);
+        resultListMac = helloPdu.neighborList();
+        assertThat(resultListMac, is(nullValue()));
+    }
+
+    /**
+     * Tests adjacencyState() method.
+     */
+    @Test
+    public void testAdjacencyState() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(helloL1L2);
+        helloPdu.readFrom(channelBuffer);
+        resultAdjState = helloPdu.adjacencyState();
+        assertThat(resultAdjState, is(nullValue()));
+    }
+
+    /**
+     * Tests sourceId() getter method.
+     */
+    @Test
+    public void testSourceId() throws Exception {
+        helloPdu.setSourceId(srcId);
+        resultStr = helloPdu.sourceId();
+        assertThat(resultStr, is(srcId));
+    }
+
+    /**
+     * Tests sourceId() setter method.
+     */
+    @Test
+    public void testSetSourceId() throws Exception {
+        helloPdu.setSourceId(srcId);
+        resultStr = helloPdu.sourceId();
+        assertThat(resultStr, is(srcId));
+    }
+
+    /**
+     * Tests pduLength() getter method.
+     */
+    @Test
+    public void testPduLength() throws Exception {
+        helloPdu.setPduLength(10);
+        resultInt = helloPdu.pduLength();
+        assertThat(resultInt, is(10));
+
+    }
+
+    /**
+     * Tests pduLength() setter method.
+     */
+    @Test
+    public void testSetPduLength() throws Exception {
+        helloPdu.setPduLength(10);
+        resultInt = helloPdu.pduLength();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests holdingTime() getter method.
+     */
+    @Test
+    public void testHoldingTime() throws Exception {
+        helloPdu.setHoldingTime(10);
+        resultInt = helloPdu.holdingTime();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests holdingTime() setter method.
+     */
+    @Test
+    public void testSetHoldingTime() throws Exception {
+        helloPdu.setHoldingTime(10);
+        resultInt = helloPdu.holdingTime();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests circuitType() getter method.
+     */
+    @Test
+    public void testCircuitType() throws Exception {
+        helloPdu.setCircuitType((byte) 1);
+        resultByte = helloPdu.circuitType();
+        assertThat(resultByte, is((byte) 1));
+    }
+
+    /**
+     * Tests circuitType() setter method.
+     */
+    @Test
+    public void testSetCircuitType() throws Exception {
+        helloPdu.setCircuitType((byte) 1);
+        resultByte = helloPdu.circuitType();
+        assertThat(resultByte, is((byte) 1));
+    }
+
+    /**
+     * Tests toString() getter method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        pdu = helloPdu;
+        assertThat(pdu.toString(), is(notNullValue()));
+    }
+
+    /**
+     * Tests equals() method.
+     */
+    @Test
+    public void testEquals() throws Exception {
+        pdu = helloPdu;
+        assertThat(pdu.equals(new L1L2HelloPdu(new IsisHeader())), is(true));
+    }
+
+    /**
+     * Tests hashCode()  method.
+     */
+    @Test
+    public void testHashCode() throws Exception {
+        pdu = helloPdu;
+        resultInt = pdu.hashCode();
+        assertThat(resultInt, is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/L1L2HelloPduTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/L1L2HelloPduTest.java
new file mode 100644
index 0000000..127e872
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/L1L2HelloPduTest.java
@@ -0,0 +1,231 @@
+/*
+ * Copyright 2016-present 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.isis.io.isispacket.pdu;
+
+import org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * Unit test class for L1L2HelloPdu.
+ */
+public class L1L2HelloPduTest {
+    private final String lanId = "1111.1111.1111";
+    private final byte[] helloL1L2 = {
+            1, 34, 34, 34, 34, 34, 34, 0,
+            30, 5, -39, 64, 34, 34, 34, 34, 34, 34, 1, -127, 1, -52, 1,
+            4, 3, 73, 0, 10, -124, 4, 10, 0, 10, 2, -45, 3, 0, 0, 0,
+            8, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, -1, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8,
+            -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 8, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 8, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, -93, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+    };
+    private L1L2HelloPdu l1L2HelloPdu;
+    private IsisHeader isisHeader;
+    private String resultStr;
+    private byte resultByte;
+    private int resultInt;
+    private ChannelBuffer channelBuffer;
+    private byte[] result;
+
+    @Before
+    public void setUp() throws Exception {
+        isisHeader = new IsisHeader();
+        isisHeader.setIsisPduType(15);
+        l1L2HelloPdu = new L1L2HelloPdu(isisHeader);
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        isisHeader = null;
+        l1L2HelloPdu = null;
+    }
+
+    /**
+     * Tests setLanId() getter method.
+     */
+    @Test
+    public void testLanId() throws Exception {
+        l1L2HelloPdu.setLanId(lanId);
+        resultStr = l1L2HelloPdu.lanId();
+        assertThat(resultStr, is(lanId));
+    }
+
+    /**
+     * Tests setLanId() setter method.
+     */
+    @Test
+    public void testSetLanId() throws Exception {
+        l1L2HelloPdu.setLanId(lanId);
+        resultStr = l1L2HelloPdu.lanId();
+        assertThat(resultStr, is(lanId));
+    }
+
+    /**
+     * Tests priority() getter method.
+     */
+    @Test
+    public void testPriority() throws Exception {
+        l1L2HelloPdu.setPriority((byte) 1);
+        resultByte = l1L2HelloPdu.priority();
+        assertThat(resultByte, is((byte) 1));
+    }
+
+    /**
+     * Tests priority() setter method.
+     */
+    @Test
+    public void testSetPriority() throws Exception {
+        l1L2HelloPdu.setPriority((byte) 1);
+        resultByte = l1L2HelloPdu.priority();
+        assertThat(resultByte, is((byte) 1));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(helloL1L2);
+        l1L2HelloPdu.readFrom(channelBuffer);
+        assertThat(l1L2HelloPdu, is(notNullValue()));
+    }
+
+    /**
+     * Tests asByte() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(helloL1L2);
+        l1L2HelloPdu.readFrom(channelBuffer);
+        result = l1L2HelloPdu.asBytes();
+        assertThat(l1L2HelloPdu, is(notNullValue()));
+    }
+
+    /**
+     * Tests l1l2IsisPduHeader() method.
+     */
+    @Test
+    public void testL1l2IsisPduHeader() throws Exception {
+        result = l1L2HelloPdu.l1l2IsisPduHeader();
+        assertThat(l1L2HelloPdu, is(notNullValue()));
+    }
+
+    /**
+     * Tests l1l2HelloPduBody() method.
+     */
+    @Test
+    public void testL1l2HelloPduBody() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(helloL1L2);
+        l1L2HelloPdu.readFrom(channelBuffer);
+        result = l1L2HelloPdu.l1l2HelloPduBody();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString()  method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(l1L2HelloPdu.toString(), is(notNullValue()));
+    }
+
+    /**
+     * Tests equals() method.
+     */
+    @Test
+    public void testEquals() throws Exception {
+        assertThat(l1L2HelloPdu.equals(new L1L2HelloPdu(new IsisHeader())), is(true));
+    }
+
+    /**
+     * Tests hashCode() method.
+     */
+    @Test
+    public void testHashCode() throws Exception {
+        resultInt = l1L2HelloPdu.hashCode();
+        assertThat(resultInt, is(notNullValue()));
+    }
+}
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/LsPduTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/LsPduTest.java
new file mode 100644
index 0000000..5689950
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/LsPduTest.java
@@ -0,0 +1,347 @@
+/*
+ * Copyright 2016-present 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.isis.io.isispacket.pdu;
+
+import org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.controller.IsisPduType;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+import org.onosproject.isis.io.isispacket.tlv.HostNameTlv;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * Unit test class for LsPdu.
+ */
+public class LsPduTest {
+    private final String lspId = "1111.1111.1111";
+    private final byte[] l1Lsp = {
+            0, 86, 4, -81, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, 9, 99, 11, 1, 1, 4, 3, 73,
+            0, 10, -127, 1, -52, -119, 2, 82, 50, -124, 4, -64, -88, 10, 1, -128, 24, 10,
+            -128, -128, -128, 10, 0, 10, 0, -1, -1, -1, -4, 10, -128, -128, -128, -64, -88,
+            10, 0, -1, -1, -1, 0, 2, 12, 0, 10, -128, -128, -128, 51, 51, 51, 51, 51, 51, 2
+    };
+    private LsPdu lsPdu;
+    private IsisHeader isisHeader;
+    private TlvHeader tlvHeader;
+    private int resultInt;
+    private boolean resultBool;
+    private byte resultByte;
+    private AttachedToOtherAreas resultObj;
+    private String resultStr;
+    private ChannelBuffer channelBuffer;
+    private byte[] result;
+
+    @Before
+    public void setUp() throws Exception {
+        isisHeader = new IsisHeader();
+        tlvHeader = new TlvHeader();
+        isisHeader.setIsisPduType(IsisPduType.L1LSPDU.value());
+        lsPdu = new LsPdu(isisHeader);
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        isisHeader = null;
+        lsPdu = null;
+        tlvHeader = null;
+        channelBuffer = null;
+    }
+
+    /**
+     * Tests addTlv()  method.
+     */
+    @Test
+    public void testAddTlv() throws Exception {
+        lsPdu.addTlv(new HostNameTlv(tlvHeader));
+        assertThat(lsPdu, is(notNullValue()));
+    }
+
+    /**
+     * Tests remainingLifeTime() getter method.
+     */
+    @Test
+    public void testRemainingLifeTime() throws Exception {
+        lsPdu.setRemainingLifeTime(10);
+        resultInt = lsPdu.remainingLifeTime();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests remainingLifeTime() setter method.
+     */
+    @Test
+    public void testSetRemainingLifeTime() throws Exception {
+        lsPdu.setRemainingLifeTime(10);
+        resultInt = lsPdu.remainingLifeTime();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests lspDbol() getter method.
+     */
+    @Test
+    public void testLspDbol() throws Exception {
+        lsPdu.setLspDbol(true);
+        resultBool = lsPdu.lspDbol();
+        assertThat(resultBool, is(true));
+    }
+
+    /**
+     * Tests lspDbol() setter method.
+     */
+    @Test
+    public void testSetLspDbol() throws Exception {
+        lsPdu.setLspDbol(true);
+        resultBool = lsPdu.lspDbol();
+        assertThat(resultBool, is(true));
+    }
+
+    /**
+     * Tests typeBlock() getter method.
+     */
+    @Test
+    public void testTypeBlock() throws Exception {
+        lsPdu.setTypeBlock((byte) 1);
+        resultByte = lsPdu.typeBlock();
+        assertThat(resultByte, is((byte) 1));
+    }
+
+    /**
+     * Tests typeBlock() setter method.
+     */
+    @Test
+    public void testSetTypeBlock() throws Exception {
+        lsPdu.setTypeBlock((byte) 1);
+        resultByte = lsPdu.typeBlock();
+        assertThat(resultByte, is((byte) 1));
+    }
+
+    /**
+     * Tests sequenceNumber() getter method.
+     */
+    @Test
+    public void testSequenceNumber() throws Exception {
+        lsPdu.setSequenceNumber(1);
+        resultInt = lsPdu.sequenceNumber();
+        assertThat(resultInt, is(1));
+    }
+
+    /**
+     * Tests sequenceNumber() setter method.
+     */
+    @Test
+    public void testSetSequenceNumber() throws Exception {
+        lsPdu.setSequenceNumber(1);
+        resultInt = lsPdu.sequenceNumber();
+        assertThat(resultInt, is(1));
+    }
+
+    /**
+     * Tests checkSum() getter method.
+     */
+    @Test
+    public void testCheckSum() throws Exception {
+        lsPdu.setCheckSum(1);
+        resultInt = lsPdu.checkSum();
+        assertThat(resultInt, is(1));
+    }
+
+    /**
+     * Tests checkSum() setter method.
+     */
+    @Test
+    public void testSetCheckSum() throws Exception {
+        lsPdu.setCheckSum(1);
+        resultInt = lsPdu.checkSum();
+        assertThat(resultInt, is(1));
+    }
+
+    /**
+     * Tests partitionRepair() getter method.
+     */
+    @Test
+    public void testPartitionRepair() throws Exception {
+        lsPdu.setPartitionRepair(true);
+        resultBool = lsPdu.partitionRepair();
+        assertThat(resultBool, is(true));
+    }
+
+    /**
+     * Tests partitionRepair() setter method.
+     */
+    @Test
+    public void testSetPartitionRepair() throws Exception {
+        lsPdu.setPartitionRepair(true);
+        resultBool = lsPdu.partitionRepair();
+        assertThat(resultBool, is(true));
+    }
+
+    /**
+     * Tests attachedToOtherAreas() getter method.
+     */
+    @Test
+    public void testAttachedToOtherAreas() throws Exception {
+        lsPdu.setAttachedToOtherAreas(AttachedToOtherAreas.DEFAULTMETRIC);
+        resultObj = lsPdu.attachedToOtherAreas();
+        assertThat(resultObj, is(AttachedToOtherAreas.DEFAULTMETRIC));
+    }
+
+    /**
+     * Tests attachedToOtherAreas() setter method.
+     */
+    @Test
+    public void testSetAttachedToOtherAreas() throws Exception {
+        lsPdu.setAttachedToOtherAreas(AttachedToOtherAreas.DEFAULTMETRIC);
+        resultObj = lsPdu.attachedToOtherAreas();
+        assertThat(resultObj, is(AttachedToOtherAreas.DEFAULTMETRIC));
+    }
+
+    /**
+     * Tests intermediateSystemType() getter method.
+     */
+    @Test
+    public void testIntermediateSystemType() throws Exception {
+        lsPdu.setIntermediateSystemType((byte) 1);
+        resultByte = lsPdu.intermediateSystemType();
+        assertThat(resultByte, is((byte) 1));
+    }
+
+    /**
+     * Tests intermediateSystemType() setter method.
+     */
+    @Test
+    public void testSetIntermediateSystemType() throws Exception {
+        lsPdu.setIntermediateSystemType((byte) 1);
+        resultByte = lsPdu.intermediateSystemType();
+        assertThat(resultByte, is((byte) 1));
+    }
+
+    /**
+     * Tests lspId() getter method.
+     */
+    @Test
+    public void testLspId() throws Exception {
+        lsPdu.setLspId(lspId);
+        resultStr = lsPdu.lspId();
+        assertThat(resultStr, is(lspId));
+    }
+
+    /**
+     * Tests lspId() setter method.
+     */
+    @Test
+    public void testSetLspId() throws Exception {
+        lsPdu.setLspId(lspId);
+        resultStr = lsPdu.lspId();
+        assertThat(resultStr, is(lspId));
+    }
+
+    /**
+     * Tests pduLength() getter method.
+     */
+    @Test
+    public void testPduLength() throws Exception {
+        lsPdu.setPduLength(10);
+        resultInt = lsPdu.pduLength();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests pduLength() setter method.
+     */
+    @Test
+    public void testSetPduLength() throws Exception {
+        lsPdu.setPduLength(10);
+        resultInt = lsPdu.pduLength();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(l1Lsp);
+        lsPdu.readFrom(channelBuffer);
+        assertThat(lsPdu, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes()  method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(l1Lsp);
+        lsPdu.readFrom(channelBuffer);
+        result = lsPdu.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests l1l2IsisPduHeader()  method.
+     */
+    @Test
+    public void testL1l2IsisPduHeader() throws Exception {
+        result = lsPdu.l1l2IsisPduHeader();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests l1l2LsPduBody()  method.
+     */
+    @Test
+    public void testL1l2LsPduBody() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(l1Lsp);
+        lsPdu.readFrom(channelBuffer);
+        result = lsPdu.l1l2LsPduBody();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString()  method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(lsPdu.toString(), is(notNullValue()));
+    }
+
+    /**
+     * Tests equals()  method.
+     */
+    @Test
+    public void testEquals() throws Exception {
+        assertThat(lsPdu.equals(new LsPdu(new IsisHeader())), is(true));
+    }
+
+    /**
+     * Tests hashCode()  method.
+     */
+    @Test
+    public void testHashCode() throws Exception {
+        resultInt = lsPdu.hashCode();
+        assertThat(resultInt, is(notNullValue()));
+    }
+}
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/P2PHelloPduTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/P2PHelloPduTest.java
new file mode 100644
index 0000000..b38c0cc
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/P2PHelloPduTest.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright 2016-present 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.isis.io.isispacket.pdu;
+
+import org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.controller.IsisPduType;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * Unit test class for P2PHelloPdu.
+ */
+public class P2PHelloPduTest {
+    private final byte[] p2p = {
+            2, 51, 51, 51, 51, 51, 51, 0, 100, 5, -39, -126, 1, 4, 3,
+            73, 0, 0, -127, 1, -52, -124, 4, -64, -88, 56, 102, 8, -1,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 8, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, -1, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, -1, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 8, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 8, -81, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+    };
+    private P2PHelloPdu p2PHelloPdu;
+    private IsisHeader isisHeader;
+    private byte resultByte;
+    private ChannelBuffer channelBuffer;
+    private byte[] result;
+    private int resultInt;
+
+    @Before
+    public void setUp() throws Exception {
+        isisHeader = new IsisHeader();
+        isisHeader.setIsisPduType(IsisPduType.P2PHELLOPDU.value());
+        p2PHelloPdu = new P2PHelloPdu(isisHeader);
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+
+
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        isisHeader = null;
+        p2PHelloPdu = null;
+        channelBuffer = null;
+    }
+
+    /**
+     * Tests localCircuitId() getter method.
+     */
+    @Test
+    public void testLocalCircuitId() throws Exception {
+        p2PHelloPdu.setLocalCircuitId((byte) 1);
+        resultByte = p2PHelloPdu.localCircuitId();
+        assertThat(resultByte, is((byte) 1));
+    }
+
+    /**
+     * Tests localCircuitId() setter method.
+     */
+    @Test
+    public void testSetLocalCircuitId() throws Exception {
+        p2PHelloPdu.setLocalCircuitId((byte) 1);
+        resultByte = p2PHelloPdu.localCircuitId();
+        assertThat(resultByte, is((byte) 1));
+    }
+
+    /**
+     * Tests setVariableLengths() method.
+     */
+    @Test
+    public void testSetVariableLengths() throws Exception {
+
+
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(p2p);
+        p2PHelloPdu.readFrom(channelBuffer);
+        assertThat(p2PHelloPdu, is(notNullValue()));
+    }
+
+    /**
+     * Tests asBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(p2p);
+        p2PHelloPdu.readFrom(channelBuffer);
+        result = p2PHelloPdu.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests p2PHeader() method.
+     */
+    @Test
+    public void testP2PHeader() throws Exception {
+        result = p2PHelloPdu.p2PHeader();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests p2P2HelloPduBody() method.
+     */
+    @Test
+    public void testP2P2HelloPduBody() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(p2p);
+        p2PHelloPdu.readFrom(channelBuffer);
+        result = p2PHelloPdu.p2P2HelloPduBody();
+        assertThat(result, is(notNullValue()));
+
+    }
+
+    /**
+     * Tests toString() method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat(p2PHelloPdu.toString(), is(notNullValue()));
+    }
+
+    /**
+     * Tests equals() method.
+     */
+    @Test
+    public void testEquals() throws Exception {
+        assertThat(p2PHelloPdu.equals(new P2PHelloPdu(new IsisHeader())), is(true));
+    }
+
+    /**
+     * Tests hashCode() method.
+     */
+    @Test
+    public void testHashCode() throws Exception {
+        resultInt = p2PHelloPdu.hashCode();
+        assertThat(resultInt, is(notNullValue()));
+    }
+}
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/PsnpTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/PsnpTest.java
new file mode 100644
index 0000000..6c760cf
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/isispacket/pdu/PsnpTest.java
@@ -0,0 +1,203 @@
+/*
+ * Copyright 2016-present 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.isis.io.isispacket.pdu;
+
+import org.easymock.EasyMock;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.jboss.netty.buffer.ChannelBuffers;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.controller.IsisPduType;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+import org.onosproject.isis.io.isispacket.tlv.AdjacencyStateTlv;
+import org.onosproject.isis.io.isispacket.tlv.IsisTlv;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+/**
+ * Unit test class for Psnp.
+ */
+public class PsnpTest {
+    private final String srcId = "1111.1111.1111";
+    private final byte[] psnpPkt = {
+            0, 35, 41, 41, 41, 41, 41, 41, 0, 9, 16, 4, -81, 18, 52, 18,
+            52, 0, 18, 0, 0, 0, 0, 0, 42, -94, -29
+    };
+    private Psnp psnp;
+    private IsisHeader isisHeader;
+    private ChannelBuffer channelBuffer;
+    private IsisTlv isisTlv;
+    private TlvHeader tlvHeader;
+    private List<IsisTlv> resultList;
+    private String resultStr;
+    private int resultInt;
+    private byte[] result;
+
+    @Before
+    public void setUp() throws Exception {
+        isisHeader = new IsisHeader();
+        isisHeader.setIsisPduType(IsisPduType.L1PSNP.value());
+        psnp = new Psnp(isisHeader);
+        tlvHeader = new TlvHeader();
+        channelBuffer = EasyMock.createMock(ChannelBuffer.class);
+        isisTlv = new AdjacencyStateTlv(tlvHeader);
+
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        isisHeader = null;
+        psnp = null;
+        channelBuffer = null;
+        tlvHeader = null;
+        isisTlv = null;
+        tlvHeader = null;
+    }
+
+    /**
+     * Tests addTlv() method.
+     */
+    @Test
+    public void testAddTlv() throws Exception {
+        psnp.addTlv(isisTlv);
+        resultList = psnp.getAllTlv();
+        assertThat(resultList.size(), is(1));
+
+    }
+
+    /**
+     * Tests getAllTlv() method.
+     */
+    @Test
+    public void testGetAllTlv() throws Exception {
+        psnp.addTlv(isisTlv);
+        resultList = psnp.getAllTlv();
+        assertThat(resultList.size(), is(1));
+
+    }
+
+    /**
+     * Tests sourceId() getter method.
+     */
+    @Test
+    public void testSourceId() throws Exception {
+        psnp.setSourceId(srcId);
+        resultStr = psnp.sourceId();
+        assertThat(resultStr, is(srcId));
+    }
+
+    /**
+     * Tests sourceId() setter method.
+     */
+    @Test
+    public void testSetSourceId() throws Exception {
+        psnp.setSourceId(srcId);
+        resultStr = psnp.sourceId();
+        assertThat(resultStr, is(srcId));
+    }
+
+    /**
+     * Tests pduLength() getter method.
+     */
+    @Test
+    public void testPduLength() throws Exception {
+        psnp.setPduLength(10);
+        resultInt = psnp.pduLength();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests pduLength() setter method.
+     */
+    @Test
+    public void testSetPduLength() throws Exception {
+        psnp.setPduLength(10);
+        resultInt = psnp.pduLength();
+        assertThat(resultInt, is(10));
+    }
+
+    /**
+     * Tests readFrom() method.
+     */
+    @Test
+    public void testReadFrom() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(psnpPkt);
+        psnp.readFrom(channelBuffer);
+        assertThat(psnp, is(notNullValue()));
+    }
+
+    /**
+     * Tests lasBytes() method.
+     */
+    @Test
+    public void testAsBytes() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(psnpPkt);
+        psnp.readFrom(channelBuffer);
+        result = psnp.asBytes();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests isisPduHeader() method.
+     */
+    @Test
+    public void testIsisPduHeader() throws Exception {
+        result = psnp.isisPduHeader();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests partialSequenceNumberPduBody() method.
+     */
+    @Test
+    public void testPartialSequenceNumberPduBody() throws Exception {
+        channelBuffer = ChannelBuffers.copiedBuffer(psnpPkt);
+        psnp.readFrom(channelBuffer);
+        result = psnp.partialSequenceNumberPduBody();
+        assertThat(result, is(notNullValue()));
+    }
+
+    /**
+     * Tests toString() method.
+     */
+    @Test
+    public void testToString() throws Exception {
+        assertThat((psnp.toString()), is(notNullValue()));
+    }
+
+    /**
+     * Tests equals() method.
+     */
+    @Test
+    public void testEquals() throws Exception {
+        assertThat(psnp.equals(new Psnp(new IsisHeader())), is(true));
+    }
+
+    /**
+     * Tests hashCode() method.
+     */
+    @Test
+    public void testHashCode() throws Exception {
+        int hashCode = psnp.hashCode();
+        assertThat(hashCode, is(notNullValue()));
+    }
+}
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/util/ChecksumCalculatorTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/util/ChecksumCalculatorTest.java
new file mode 100644
index 0000000..f8d58ce
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/util/ChecksumCalculatorTest.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2016-present 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.isis.io.util;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for ChecksumCalculator.
+ */
+public class ChecksumCalculatorTest {
+
+    private final byte[] l1Lsp = {
+            -125, 27, 1, 0, 18, 1, 0, 0, 0, 86, 4, -81, 34, 34, 34,
+            34, 34, 34, 0, 0, 0, 0, 0, 9, 99, 11, 1, 1, 4, 3, 73,
+            0, 10, -127, 1, -52, -119, 2, 82, 50, -124, 4, -64, -88, 10, 1, -128,
+            24, 10, -128, -128, -128, 10, 0, 10, 0, -1, -1, -1, -4, 10, -128, -128,
+            -128, -64, -88, 10, 0, -1, -1, -1, 0, 2, 12, 0, 10, -128, -128, -128,
+            51, 51, 51, 51, 51, 51, 2
+    };
+    private ChecksumCalculator calculator;
+    private byte[] result;
+    private boolean result1;
+
+    @Before
+    public void setUp() throws Exception {
+        calculator = new ChecksumCalculator();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        calculator = null;
+    }
+
+    /**
+     * Tests validateLspCheckSum() method.
+     */
+    @Test
+    public void testValidateLspCheckSum() throws Exception {
+        result1 = calculator.validateLspCheckSum(l1Lsp, IsisConstants.CHECKSUMPOSITION,
+                                                 IsisConstants.CHECKSUMPOSITION + 1);
+
+        assertThat(result1, is(true));
+    }
+
+    /**
+     * Tests calculateLspChecksum() method.
+     */
+    @Test
+    public void testCalculateLspChecksum() throws Exception {
+        result = calculator.calculateLspChecksum(l1Lsp, IsisConstants.CHECKSUMPOSITION,
+                                                 IsisConstants.CHECKSUMPOSITION + 1);
+        assertThat(result[0],
+                   is(l1Lsp[IsisConstants.CHECKSUMPOSITION]));
+        assertThat(result[1],
+                   is(l1Lsp[IsisConstants.CHECKSUMPOSITION + 1]));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/util/IsisUtilTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/util/IsisUtilTest.java
new file mode 100644
index 0000000..b04ac14
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/util/IsisUtilTest.java
@@ -0,0 +1,267 @@
+/*
+ * Copyright 2016-present 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.isis.io.util;
+
+import com.google.common.primitives.Bytes;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onosproject.isis.controller.IsisPduType;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for IsisUtil.
+ */
+public class IsisUtilTest {
+
+    private final String systemId = "2929.2929.2929";
+    private final String lanId = "2929.2929.2929.01";
+    private final String areaAddres = "490001";
+    private final byte[] l1Lsp = {
+            -125, 27, 1, 0, 18, 1, 0, 0, 0, 86, 4, -81, 34, 34, 34,
+            34, 34, 34, 0, 0, 0, 0, 0, 9, 99, 11, 1, 1, 4, 3, 73,
+            0, 10, -127, 1, -52, -119, 2, 82, 50, -124, 4, -64, -88, 10, 1, -128,
+            24, 10, -128, -128, -128, 10, 0, 10, 0, -1, -1, -1, -4, 10, -128, -128,
+            -128, -64, -88, 10, 0, -1, -1, -1, 0, 2, 12, 0, 10, -128, -128, -128,
+            51, 51, 51, 51, 51, 51, 2
+    };
+    private final byte[] intger = {0, 0, 0, 1};
+    private Ip4Address ip4Address1 = Ip4Address.valueOf("10.10.10.10");
+    private Ip4Address ip4Address2 = Ip4Address.valueOf("10.10.10.11");
+    private Ip4Address mask = Ip4Address.valueOf("255.255.255.0");
+    private boolean result;
+    private String result1;
+    private byte[] result2;
+    private int result3;
+    private long result4;
+    private byte[] prefixBytes = {0, 0, 0, 1};
+    private String prefix = "192.16.17";
+
+    @Before
+    public void setUp() throws Exception {
+
+    }
+
+    @After
+    public void tearDown() throws Exception {
+
+    }
+
+    /**
+     * Tests sameNetwork() method.
+     */
+    @Test
+    public void testSameNetwork() throws Exception {
+        result = IsisUtil.sameNetwork(ip4Address1, ip4Address2, mask.toOctets());
+        assertThat(result, is(true));
+    }
+
+    /**
+     * Tests systemId() method.
+     */
+    @Test
+    public void testSystemId() throws Exception {
+        result1 = IsisUtil.systemId(Bytes.toArray(
+                IsisUtil.sourceAndLanIdToBytes(systemId)));
+        assertThat(result1, is(systemId));
+    }
+
+    /**
+     * Tests systemIdPlus() method.
+     */
+    @Test
+    public void testSystemIdPlus() throws Exception {
+        result1 = IsisUtil.systemIdPlus(Bytes.toArray(
+                IsisUtil.sourceAndLanIdToBytes(lanId)));
+        assertThat(result1, is(lanId));
+    }
+
+    /**
+     * Tests areaAddres() method.
+     */
+    @Test
+    public void testAreaAddres() throws Exception {
+        result1 = IsisUtil.areaAddres(Bytes.toArray(
+                IsisUtil.areaAddressToBytes(areaAddres)));
+        assertThat(result1, is(areaAddres));
+    }
+
+    /**
+     * Tests areaAddressToBytes() method.
+     */
+    @Test
+    public void testAreaAddressToBytes() throws Exception {
+        result2 = Bytes.toArray(IsisUtil.areaAddressToBytes(areaAddres));
+        assertThat(result2, is(notNullValue()));
+    }
+
+    /**
+     * Tests getPduHeaderLength() method.
+     */
+    @Test
+    public void testGetPduHeaderLength() throws Exception {
+        result3 = IsisUtil.getPduHeaderLength(IsisPduType.L1CSNP.value());
+        assertThat(result3, is(33));
+        result3 = IsisUtil.getPduHeaderLength(IsisPduType.L1PSNP.value());
+        assertThat(result3, is(17));
+        result3 = IsisUtil.getPduHeaderLength(IsisPduType.L1HELLOPDU.value());
+        assertThat(result3, is(27));
+        result3 = IsisUtil.getPduHeaderLength(IsisPduType.P2PHELLOPDU.value());
+        assertThat(result3, is(20));
+    }
+
+    /**
+     * Tests addLengthAndMarkItInReserved() method.
+     */
+    @Test
+    public void testAddLengthAndMarkItInReserved() throws Exception {
+        result2 = IsisUtil.addLengthAndMarkItInReserved(l1Lsp,
+                                                        IsisConstants.LENGTHPOSITION, IsisConstants.LENGTHPOSITION + 1,
+                                                        IsisConstants.RESERVEDPOSITION);
+        assertThat(result2, is(notNullValue()));
+    }
+
+    /**
+     * Tests addChecksum() method.
+     */
+    @Test
+    public void testAddChecksum() throws Exception {
+        result2 = IsisUtil.addChecksum(l1Lsp,
+                                       IsisConstants.CHECKSUMPOSITION, IsisConstants.CHECKSUMPOSITION + 1);
+        assertThat(result2, is(notNullValue()));
+    }
+
+    /**
+     * Tests framePacket() method.
+     */
+    @Test
+    public void testFramePacket() throws Exception {
+        result2 = IsisUtil.framePacket(l1Lsp, 2);
+        assertThat(result2, is(notNullValue()));
+    }
+
+    /**
+     * Tests sourceAndLanIdToBytes() method.
+     */
+    @Test
+    public void testSourceAndLanIdToBytes() throws Exception {
+        result2 = Bytes.toArray(IsisUtil.sourceAndLanIdToBytes(lanId));
+        assertThat(result2, is(notNullValue()));
+    }
+
+    /**
+     * Tests getPaddingTlvs() method.
+     */
+    @Test
+    public void testGetPaddingTlvs() throws Exception {
+        result2 = IsisUtil.getPaddingTlvs(250);
+        assertThat(result2, is(notNullValue()));
+    }
+
+    /**
+     * Tests convertToTwoBytes() method.
+     */
+    @Test
+    public void testConvertToTwoBytes() throws Exception {
+        result2 = IsisUtil.convertToTwoBytes(250);
+        assertThat(result2.length, is(2));
+    }
+
+    /**
+     * Tests convertToFourBytes() method.
+     */
+    @Test
+    public void testConvertToFourBytes() throws Exception {
+        result2 = IsisUtil.convertToFourBytes(250);
+        assertThat(result2.length, is(4));
+    }
+
+    /**
+     * Tests byteToInteger() method.
+     */
+    @Test
+    public void testByteToInteger() throws Exception {
+        result3 = IsisUtil.byteToInteger(intger);
+        assertThat(result3, is(1));
+    }
+
+    /**
+     * Tests byteToInteger() method.
+     */
+    @Test
+    public void testByteToLong() throws Exception {
+        result4 = IsisUtil.byteToLong(intger);
+        assertThat(result4, is(1L));
+    }
+
+    /**
+     * Tests convertToFourBytes() method.
+     */
+    @Test
+    public void testConvertToFourBytes1() throws Exception {
+        result2 = IsisUtil.convertToFourBytes(250L);
+        assertThat(result2.length, is(4));
+    }
+
+    /**
+     * Tests toFourBitBinary() method.
+     */
+    @Test
+    public void testToEightBitBinary() throws Exception {
+        result1 = IsisUtil.toEightBitBinary("01");
+        assertThat(result1.length(), is(8));
+    }
+
+    /**
+     * Tests toFourBitBinary() method.
+     */
+    @Test
+    public void testToFourBitBinary() throws Exception {
+        result1 = IsisUtil.toFourBitBinary("01");
+        assertThat(result1.length(), is(4));
+    }
+
+    /**
+     * Tests convertToThreeBytes() method.
+     */
+    @Test
+    public void testConvertToThreeBytes() throws Exception {
+        result2 = IsisUtil.convertToThreeBytes(30);
+        assertThat(result2.length, is(3));
+    }
+
+    /**
+     * Tests prefixConversion() method.
+     */
+    @Test
+    public void testPrefixConversion() throws Exception {
+        result1 = IsisUtil.prefixConversion(prefixBytes);
+        assertThat(result1, is(notNullValue()));
+    }
+
+    /**
+     * Tests prefixToBytes() method.
+     */
+    @Test
+    public void testPrefixToBytes() throws Exception {
+        result2 = IsisUtil.prefixToBytes(prefix);
+        assertThat(result2, is(notNullValue()));
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/util/LspGeneratorTest.java b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/util/LspGeneratorTest.java
new file mode 100644
index 0000000..03479d5
--- /dev/null
+++ b/protocols/isis/isisio/src/test/java/org/onosproject/isis/io/util/LspGeneratorTest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2016-present 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.isis.io.util;
+
+import org.easymock.EasyMock;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.onosproject.isis.controller.IsisInterface;
+import org.onosproject.isis.controller.IsisLsdb;
+import org.onosproject.isis.controller.IsisPduType;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+
+/**
+ * Unit test class for LspGenerator.
+ */
+public class LspGeneratorTest {
+    private LspGenerator generator;
+    private IsisHeader isisHeader;
+    private IsisInterface isisInterface;
+    private IsisLsdb isisLsdb;
+
+    @Before
+    public void setUp() throws Exception {
+        generator = new LspGenerator();
+        isisLsdb = EasyMock.createMock(IsisLsdb.class);
+        isisInterface = EasyMock.createMock(IsisInterface.class);
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        generator = null;
+    }
+
+    /**
+     * Tests getHeader() method.
+     */
+    @Test
+    public void testGetHeader() throws Exception {
+        isisHeader = generator.getHeader(IsisPduType.L1CSNP);
+        assertThat(isisHeader, is(instanceOf(IsisHeader.class)));
+    }
+}
\ No newline at end of file
