diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisLsdb.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisLsdb.java
index 7ceb9f1..06e34fd 100644
--- a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisLsdb.java
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisLsdb.java
@@ -16,6 +16,7 @@
 package org.onosproject.isis.controller;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * Representation of an ISIS link state database.
@@ -93,4 +94,18 @@
      * @param lsp LSP instance
      */
     void deleteLsp(IsisMessage lsp);
-}
+
+    /**
+     * Gets the neighbor database information.
+     *
+     * @return neighbor database information
+     */
+    Map<String, LspWrapper> getL1Db();
+
+    /**
+     * Gets the neighbor database information.
+     *
+     * @return neighbor database information
+     */
+    Map<String, LspWrapper> getL2Db();
+}
\ No newline at end of file
diff --git a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisNeighbor.java b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisNeighbor.java
index f6a462b..22b0cca 100644
--- a/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisNeighbor.java
+++ b/protocols/isis/api/src/main/java/org/onosproject/isis/controller/IsisNeighbor.java
@@ -84,4 +84,18 @@
      * @param localExtendedCircuitId neighbor extended circuit ID
      */
     void setLocalExtendedCircuitId(int localExtendedCircuitId);
+
+    /**
+     * Returns Holding time of neighbor.
+     *
+     * @return Holding time of neighbor
+     */
+    int holdingTime();
+
+    /**
+     * Sets Holding time of neighbor.
+     *
+     * @param holdingTime Holding time of neighbor
+     */
+    void setHoldingTime(int holdingTime);
 }
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/exceptions/IsisErrorType.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/exceptions/IsisErrorType.java
new file mode 100644
index 0000000..5fbf691
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/exceptions/IsisErrorType.java
@@ -0,0 +1,38 @@
+/*
+ * 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.exceptions;
+
+/**
+ * Defines all error codes and error sub codes.
+ */
+public final class IsisErrorType {
+
+    //Represents an invalid ISIS message header
+    public static final byte MESSAGE_HEADER_ERROR = 1;
+    //Represents an invalid ISIS message body
+    public static final byte ISIS_MESSAGE_ERROR = 2;
+    //Message Header error sub codes
+    //Represents an invalid ISIS message length
+    public static final byte BAD_MESSAGE_LENGTH = 3;
+    //Represents an invalid ISIS message
+    public static final byte BAD_MESSAGE = 4;
+
+    /**
+     * Creates an instance of ISIS error type.
+     */
+    private IsisErrorType() {
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/exceptions/IsisParseException.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/exceptions/IsisParseException.java
new file mode 100644
index 0000000..57ad8d3
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/exceptions/IsisParseException.java
@@ -0,0 +1,102 @@
+/*
+ * 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.exceptions;
+
+import com.google.common.base.MoreObjects;
+
+/**
+ * Representation of a custom exception for ISIS.
+ */
+public class IsisParseException extends Exception {
+
+    private static final long serialVersionUID = 1L;
+    private byte errorCode;
+    private byte errorSubCode;
+
+    /**
+     * Creates a new ISIS exception.
+     */
+    public IsisParseException() {
+        super();
+    }
+
+    /**
+     * Creates a new ISIS exception based on the given arguments.
+     *
+     * @param message the detail of exception in string
+     * @param cause   underlying cause of the error
+     */
+    public IsisParseException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Creates a new ISIS exception for the given message.
+     *
+     * @param message the detail of exception in string
+     */
+    public IsisParseException(final String message) {
+        super(message);
+    }
+
+    /**
+     * Creates a new ISIS exception from throwable instance.
+     *
+     * @param cause underlying cause of the error
+     */
+    public IsisParseException(final Throwable cause) {
+        super(cause);
+    }
+
+    /**
+     * Creates a new ISIS exception from error code and error sub code.
+     *
+     * @param errorCode    error code of ISIS message
+     * @param errorSubCode error sub code of ISIS message
+     */
+    public IsisParseException(final byte errorCode, final byte errorSubCode) {
+        super();
+        this.errorCode = errorCode;
+        this.errorSubCode = errorSubCode;
+    }
+
+    /**
+     * Returns error code for this exception.
+     *
+     * @return error code for this exception
+     */
+    public byte errorCode() {
+        return this.errorCode;
+    }
+
+    /**
+     * Returns error sub code for this exception.
+     *
+     * @return error sub code for this exception
+     */
+    public byte errorSubCode() {
+        return this.errorSubCode;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("errorCode", errorCode)
+                .add("errorSubCode", errorSubCode)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/exceptions/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/exceptions/package-info.java
new file mode 100644
index 0000000..00c0d22
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/exceptions/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+/**
+ * Implementation of the ISIS protocol exceptions.
+ */
+package org.onosproject.isis.exceptions;
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/IsisHeader.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/IsisHeader.java
new file mode 100644
index 0000000..5152423
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/IsisHeader.java
@@ -0,0 +1,271 @@
+/*
+ * 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.jboss.netty.buffer.ChannelBuffer;
+import org.onlab.packet.MacAddress;
+import org.onosproject.isis.controller.IsisMessage;
+import org.onosproject.isis.controller.IsisPduType;
+
+/**
+ * Representation of ISIS message header.
+ */
+public class IsisHeader implements IsisMessage {
+
+    private MacAddress sourceMac;
+    private int interfaceIndex;
+    private MacAddress interfaceMac;
+    private int isisPduType;
+    private byte irpDiscriminator;
+    private byte pduHeaderLength;
+    private byte version2;
+    private byte idLength;
+    private byte version;
+    private byte reserved;
+    private byte maximumAreaAddresses;
+
+    /**
+     * Returns the interface index on which the message received.
+     *
+     * @return interface index on which the message received
+     */
+    public int interfaceIndex() {
+        return interfaceIndex;
+    }
+
+    /**
+     * Sets the interface index on which the message received.
+     *
+     * @param interfaceIndex interface index on which the message received
+     */
+    public void setInterfaceIndex(int interfaceIndex) {
+        this.interfaceIndex = interfaceIndex;
+    }
+
+    /**
+     * Returns the interface mac address on which the message received.
+     *
+     * @return interface mac address on which the message received
+     */
+    public MacAddress interfaceMac() {
+        return interfaceMac;
+    }
+
+    /**
+     * Returns the mac address of the message sender.
+     *
+     * @return mac address of the message sender
+     */
+    public MacAddress sourceMac() {
+        return sourceMac;
+    }
+
+    /**
+     * Sets the mac address of the message sender.
+     *
+     * @param sourceMac mac address of the message sender
+     */
+    public void setSourceMac(MacAddress sourceMac) {
+        this.sourceMac = sourceMac;
+    }
+
+    /**
+     * Sets the interface mac address on which the message received.
+     *
+     * @param interfaceMac mac address on which the message received
+     */
+    public void setInterfaceMac(MacAddress interfaceMac) {
+        this.interfaceMac = interfaceMac;
+    }
+
+    /**
+     * Returns the version of TLV header.
+     *
+     * @return version version of TLV header
+     */
+    public byte version2() {
+        return version2;
+    }
+
+    /**
+     * Sets the version of TLV header.
+     *
+     * @param version2 version of TLV header
+     */
+    public void setVersion2(byte version2) {
+        this.version2 = version2;
+    }
+
+    /**
+     * Returns maximum area address.
+     *
+     * @return maximum area address
+     */
+    public byte maximumAreaAddresses() {
+        return maximumAreaAddresses;
+    }
+
+    /**
+     * Sets maximum area address.
+     *
+     * @param maximumAreaAddresses maximum area address
+     */
+    public void setMaximumAreaAddresses(byte maximumAreaAddresses) {
+        this.maximumAreaAddresses = maximumAreaAddresses;
+    }
+
+    /**
+     * Returns reserved field value on which data received.
+     *
+     * @return reserved
+     */
+    public byte reserved() {
+        return reserved;
+    }
+
+    /**
+     * Sets reserved.
+     *
+     * @param reserved reserved
+     */
+    public void setReserved(byte reserved) {
+        this.reserved = reserved;
+    }
+
+    /**
+     * Returns version.
+     *
+     * @return version
+     */
+    public byte version() {
+        return version;
+    }
+
+    /**
+     * Returns ID length.
+     *
+     * @return ID length
+     */
+    public byte idLength() {
+        return idLength;
+    }
+
+    /**
+     * Sets ID length.
+     *
+     * @param idLength ID length
+     */
+    public void setIdLength(byte idLength) {
+        this.idLength = idLength;
+    }
+
+    /**
+     * Returns the PDU type.
+     *
+     * @return PDU type
+     */
+    public int pduType() {
+
+        return this.isisPduType;
+    }
+
+    /**
+     * Sets PDU type.
+     *
+     * @param isisPduType PDU type
+     */
+    public void setIsisPduType(int isisPduType) {
+        this.isisPduType = isisPduType;
+    }
+
+    /**
+     * Sets protocol ID.
+     *
+     * @param version protocol ID
+     */
+    public void setVersion(byte version) {
+        this.version = version;
+    }
+
+    /**
+     * Returns length indicator.
+     *
+     * @return length indicator
+     */
+    public byte pduHeaderLength() {
+        return pduHeaderLength;
+    }
+
+    /**
+     * Sets length indicator.
+     *
+     * @param pduHeaderLength length indicator
+     */
+    public void setPduHeaderLength(byte pduHeaderLength) {
+        this.pduHeaderLength = pduHeaderLength;
+    }
+
+    /**
+     * Returns IRP discriminator.
+     *
+     * @return IRP discriminator
+     */
+    public byte irpDiscriminator() {
+        return irpDiscriminator;
+    }
+
+    /**
+     * Sets IRP discriminator.
+     *
+     * @param irpDiscriminator IRP discriminator
+     */
+    public void setIrpDiscriminator(byte irpDiscriminator) {
+
+        this.irpDiscriminator = irpDiscriminator;
+    }
+
+    @Override
+    public IsisPduType isisPduType() {
+
+        return IsisPduType.get(this.isisPduType);
+    }
+
+    @Override
+    public void readFrom(ChannelBuffer channelBuffer) {
+        //implemented in the sub classes
+    }
+
+    @Override
+    public byte[] asBytes() {
+        return null;
+    }
+
+    /**
+     * Populates ISIS header.
+     *
+     * @param isisHeader ISIS header
+     */
+    public void populateHeader(IsisHeader isisHeader) {
+        this.setIrpDiscriminator(isisHeader.irpDiscriminator());
+        this.setPduHeaderLength(isisHeader.pduHeaderLength());
+        this.setVersion(isisHeader.version());
+        this.setIdLength(isisHeader.idLength());
+        this.setIsisPduType(isisHeader.pduType());
+        this.setVersion2(isisHeader.version2());
+        this.setReserved(isisHeader.reserved());
+        this.setMaximumAreaAddresses(isisHeader.maximumAreaAddresses());
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/IsisMessageReader.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/IsisMessageReader.java
new file mode 100644
index 0000000..fe149c6
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/IsisMessageReader.java
@@ -0,0 +1,122 @@
+/*
+ * 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.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.isis.controller.IsisMessage;
+import org.onosproject.isis.exceptions.IsisErrorType;
+import org.onosproject.isis.exceptions.IsisParseException;
+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.IsisConstants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Represents ISIS message reader.
+ */
+public class IsisMessageReader {
+
+    protected static final Logger log = LoggerFactory.getLogger(IsisMessageReader.class);
+
+    /**
+     * Reads from ISIS packet from buffer.
+     *
+     * @param channelBuffer buffer
+     * @return ISIS message
+     * @throws Exception exception
+     */
+    public IsisMessage readFromBuffer(ChannelBuffer channelBuffer) throws Exception {
+
+        int dataLength = channelBuffer.readableBytes();
+        log.debug("IsisMessageReader::readFromBuffer Data length {}", dataLength);
+        if (channelBuffer.readableBytes() < IsisConstants.PDU_LENGTH) {
+            log.debug("Packet should have minimum length...");
+            throw new IsisParseException(IsisErrorType.MESSAGE_HEADER_ERROR, IsisErrorType.BAD_MESSAGE_LENGTH);
+        }
+        IsisHeader isisHeader = getIsisHeader(channelBuffer);
+        int totalLength = 0;
+        IsisMessage isisMessage = null;
+        switch (isisHeader.isisPduType()) {
+            case L1HELLOPDU:
+            case L2HELLOPDU:
+                isisMessage = new L1L2HelloPdu(isisHeader);
+                totalLength = channelBuffer.getShort(IsisConstants.PDULENGTHPOSITION);
+                break;
+            case P2PHELLOPDU:
+                isisMessage = new P2PHelloPdu(isisHeader);
+                totalLength = channelBuffer.getShort(IsisConstants.PDULENGTHPOSITION);
+                break;
+            case L1LSPDU:
+            case L2LSPDU:
+                isisMessage = new LsPdu(isisHeader);
+                totalLength = channelBuffer.getShort(8);
+                break;
+            case L1CSNP:
+            case L2CSNP:
+                isisMessage = new Csnp(isisHeader);
+                totalLength = channelBuffer.getShort(8);
+                break;
+            case L1PSNP:
+            case L2PSNP:
+                isisMessage = new Psnp(isisHeader);
+                totalLength = channelBuffer.getShort(8);
+                break;
+            default:
+                log.debug("Message Reader[Decoder] - Unknown PDU type..!!!");
+                break;
+        }
+
+        if (isisMessage != null) {
+            try {
+                int bodyLength = totalLength - IsisConstants.COMMONHEADERLENGTH;
+                isisMessage.readFrom(channelBuffer.readBytes(bodyLength));
+
+            } catch (Exception e) {
+                throw new IsisParseException(IsisErrorType.ISIS_MESSAGE_ERROR,
+                                             IsisErrorType.BAD_MESSAGE);
+            }
+
+        }
+
+        return isisMessage;
+    }
+
+    /**
+     * Gets ISIS header.
+     *
+     * @param channelBuffer ISIS header
+     * @return ISIS header
+     * @throws Exception
+     */
+    private IsisHeader getIsisHeader(ChannelBuffer channelBuffer) throws Exception {
+
+        IsisHeader isisHeader = new IsisHeader();
+        isisHeader.setIrpDiscriminator(channelBuffer.readByte());
+        isisHeader.setPduHeaderLength(channelBuffer.readByte());
+        isisHeader.setVersion(channelBuffer.readByte());
+        isisHeader.setIdLength(channelBuffer.readByte());
+        isisHeader.setIsisPduType(channelBuffer.readByte());
+        isisHeader.setVersion2(channelBuffer.readByte());
+        isisHeader.setReserved(channelBuffer.readByte());
+        isisHeader.setMaximumAreaAddresses(channelBuffer.readByte());
+
+        return isisHeader;
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/AttachedToOtherAreas.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/AttachedToOtherAreas.java
new file mode 100644
index 0000000..3dfa308
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/AttachedToOtherAreas.java
@@ -0,0 +1,71 @@
+/*
+ * 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 java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Representation of attached to other areas.
+ */
+public enum AttachedToOtherAreas {
+    DEFAULTMETRIC(1),
+    DELAYMETRIC(2),
+    EXPENSEMETRIC(4),
+    ERRORMETRIC(8),
+    NONE(0);
+    // Reverse lookup table
+    private static final Map<Integer, AttachedToOtherAreas> LOOKUP = new HashMap<>();
+
+    // Populate the lookup table on loading time
+    static {
+        for (AttachedToOtherAreas attachedToOtherAreas :
+                EnumSet.allOf(AttachedToOtherAreas.class)) {
+            LOOKUP.put(attachedToOtherAreas.value(), attachedToOtherAreas);
+        }
+    }
+
+    private int value;
+
+    /**
+     * Returns the attached to other areas value.
+     *
+     * @param value attached to other areas value
+     */
+    AttachedToOtherAreas(int value) {
+        this.value = value;
+    }
+
+    /**
+     * Returns the value for attached to other areas from pdu type value.
+     *
+     * @param pduTypeValue to get attached areas value
+     * @return attachedToOtherAreas value of the enum
+     */
+    public static AttachedToOtherAreas get(int pduTypeValue) {
+        return LOOKUP.get(pduTypeValue);
+    }
+
+    /**
+     * Returns the value representing PDU type.
+     *
+     * @return value represents PDU type
+     */
+    public int value() {
+        return value;
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/Csnp.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/Csnp.java
new file mode 100644
index 0000000..80dc5b1
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/Csnp.java
@@ -0,0 +1,272 @@
+/*
+ * 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 com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+import org.onosproject.isis.io.isispacket.tlv.IsisTlv;
+import org.onosproject.isis.io.isispacket.tlv.TlvFinder;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+import org.onosproject.isis.io.isispacket.tlv.TlvType;
+import org.onosproject.isis.io.isispacket.tlv.TlvsToBytes;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of complete sequence number PDU.
+ */
+public class Csnp extends IsisHeader {
+
+    /*
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |             Intra-domain Routing Protocol  Discriminator       |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          Length Indicator                     |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                           Version/Protocol ID Extension       |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                           ID Length                           |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |     R     |     R     |    R      |       PDU Type            |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          Version                              |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          Reserved                             |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                     Maximum area address                      |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          PDU Length                           |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                         Source ID                             |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                       Start LSP ID                            |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                        End LSP ID                             |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                      Variable Lengths Fields                  |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+        CSNP Message Format
+        REFERENCE : ISO/IEC 10589
+    */
+    private int pduLength;
+    private String sourceId;
+    private String startLspId;
+    private String endLspId;
+    private List<IsisTlv> variableLengths = new ArrayList<>();
+
+    /**
+     * Creates the instance for this class.
+     *
+     * @param isisHeader ISIS header
+     */
+    public Csnp(IsisHeader isisHeader) {
+        populateHeader(isisHeader);
+    }
+
+    /**
+     * 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
+     */
+    public String sourceId() {
+        return sourceId;
+    }
+
+    /**
+     * Sets the source ID for csnp.
+     *
+     * @param sourceId source ID
+     */
+    public void setSourceId(String sourceId) {
+        this.sourceId = sourceId;
+    }
+
+    /**
+     * Returns the initial link state packet ID of csnp.
+     *
+     * @return startLspId start link state packet ID
+     */
+    public String startLspId() {
+        return startLspId;
+    }
+
+    /**
+     * Sets the initial link state packet ID for csnp.
+     *
+     * @param startLspId start link state packet ID
+     */
+    public void setStartLspId(String startLspId) {
+        this.startLspId = startLspId;
+    }
+
+    /**
+     * Returns the end link state packet ID of csnp.
+     *
+     * @return endLspId end link state packet ID of csnp.
+     */
+    public String endLspId() {
+        return endLspId;
+    }
+
+    /**
+     * Sets the end link state packet ID for csnp.
+     *
+     * @param endLspId end link state packet ID of csnp.
+     */
+    public void setEndLspId(String endLspId) {
+        this.endLspId = endLspId;
+    }
+
+    /**
+     * Returns the packet data unit length of link state packet.
+     * Entire length of this PDU, in octets
+     *
+     * @return pduLength packet date unit length
+     */
+    public int pduLength() {
+        return pduLength;
+    }
+
+    /**
+     * Sets the packet data unit length for link state packet.
+     * Entire Length of this PDU, in octets
+     *
+     * @param pduLength packet data length
+     */
+    public void setPduLength(int pduLength) {
+        this.pduLength = pduLength;
+    }
+
+    @Override
+    public void readFrom(ChannelBuffer channelBuffer) {
+        this.setPduLength(channelBuffer.readUnsignedShort());
+        //source id + 1 value
+        byte[] tempByteArray = new byte[IsisUtil.ID_PLUS_ONE_BYTE];
+        channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_PLUS_ONE_BYTE);
+        this.setSourceId(IsisUtil.systemIdPlus(tempByteArray));
+        //start lsp id + 2 value
+        tempByteArray = new byte[IsisUtil.ID_PLUS_TWO_BYTE];
+        channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_PLUS_TWO_BYTE);
+        this.setStartLspId(IsisUtil.systemIdPlus(tempByteArray));
+        //end lsp id + 2 value
+        tempByteArray = new byte[IsisUtil.ID_PLUS_TWO_BYTE];
+        channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_PLUS_TWO_BYTE);
+        this.setEndLspId(IsisUtil.systemIdPlus(tempByteArray));
+        //tlv here
+        while (channelBuffer.readableBytes() > 0) {
+            TlvHeader tlvHeader = new TlvHeader();
+            tlvHeader.setTlvType(channelBuffer.readUnsignedByte());
+            tlvHeader.setTlvLength(channelBuffer.readUnsignedByte());
+            TlvType tlvValue = TlvType.get(tlvHeader.tlvType());
+            if (tlvValue != null) {
+                IsisTlv tlv = TlvFinder.findTlv(tlvHeader, channelBuffer.readBytes(tlvHeader.tlvLength()));
+                this.variableLengths.add(tlv);
+            } else {
+                channelBuffer.readBytes(tlvHeader.tlvLength());
+            }
+        }
+    }
+
+    @Override
+    public byte[] asBytes() {
+        byte[] csnpMessage = null;
+        byte[] isisPduHeader = isisPduHeader();
+        byte[] csnpBody = completeSequenceNumberPduBody();
+        csnpMessage = Bytes.concat(isisPduHeader, csnpBody);
+        return csnpMessage;
+    }
+
+    /**
+     * Builds ISIS PDU header for complete sequence numbers PDU.
+     *
+     * @return isisPduHeader ISIS PDU header
+     */
+    public byte[] isisPduHeader() {
+        List<Byte> headerList = new ArrayList<>();
+        headerList.add(this.irpDiscriminator());
+        headerList.add((byte) IsisUtil.getPduHeaderLength(this.pduType()));
+        headerList.add(this.version());
+        headerList.add(this.idLength());
+        headerList.add((byte) this.pduType());
+        headerList.add(this.version2());
+        headerList.add(this.reserved());
+        headerList.add(this.maximumAreaAddresses());
+        return Bytes.toArray(headerList);
+    }
+
+    /**
+     * Builds complete sequence numbers PDU body.
+     *
+     * @return bodyList complete sequence numbers PDU body
+     */
+    public byte[] completeSequenceNumberPduBody() {
+        List<Byte> bodyList = new ArrayList<>();
+        bodyList.addAll(Bytes.asList(IsisUtil.convertToTwoBytes(this.pduLength())));
+        bodyList.addAll(IsisUtil.sourceAndLanIdToBytes(this.sourceId()));
+        bodyList.addAll(IsisUtil.sourceAndLanIdToBytes(this.startLspId()));
+        bodyList.addAll(IsisUtil.sourceAndLanIdToBytes(this.endLspId()));
+        for (IsisTlv isisTlv : variableLengths) {
+            bodyList.addAll(TlvsToBytes.tlvToBytes(isisTlv));
+        }
+        return Bytes.toArray(bodyList);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("pduLength", pduLength)
+                .add("sourceId", sourceId)
+                .add("startLspId", startLspId)
+                .add("endLspId", endLspId)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        Csnp that = (Csnp) o;
+        return Objects.equal(pduLength, that.pduLength) &&
+                Objects.equal(sourceId, that.sourceId) &&
+                Objects.equal(startLspId, that.startLspId) &&
+                Objects.equal(endLspId, that.endLspId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(pduLength, sourceId, startLspId, endLspId);
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/HelloPdu.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/HelloPdu.java
new file mode 100644
index 0000000..6ce37c8
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/HelloPdu.java
@@ -0,0 +1,220 @@
+/*
+ * 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 com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+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.AreaAddressTlv;
+import org.onosproject.isis.io.isispacket.tlv.IpInterfaceAddressTlv;
+import org.onosproject.isis.io.isispacket.tlv.IsisNeighborTlv;
+import org.onosproject.isis.io.isispacket.tlv.IsisTlv;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of ISIS hello PDU.
+ */
+public abstract class HelloPdu extends IsisHeader {
+
+    protected List<IsisTlv> variableLengths = new ArrayList<>();
+    private byte circuitType;
+    private String sourceId;
+    private int holdingTime;
+    private int pduLength;
+
+    public void addTlv(IsisTlv isisTlv) {
+        variableLengths.add(isisTlv);
+    }
+
+    /**
+     * Returns the variable lengths.
+     *
+     * @return variable lengths
+     */
+    public List<IsisTlv> tlvs() {
+        return variableLengths;
+    }
+
+    /**
+     * Returns the list of area addresses.
+     *
+     * @return areaAddresses area addresses
+     */
+    public List<String> areaAddress() {
+        List<String> areaAddresses = null;
+        for (IsisTlv tlv : tlvs()) {
+            if (tlv instanceof AreaAddressTlv) {
+                areaAddresses = ((AreaAddressTlv) tlv).areaAddress();
+            }
+        }
+        return areaAddresses;
+    }
+
+    /**
+     * Returns the list of interface IP addresses.
+     *
+     * @return interfaceIpAddresses list of interface IP addresses
+     */
+    public List<Ip4Address> interfaceIpAddresses() {
+        List<Ip4Address> interfaceIpAddresses = null;
+        for (IsisTlv tlv : tlvs()) {
+            if (tlv instanceof IpInterfaceAddressTlv) {
+                interfaceIpAddresses = ((IpInterfaceAddressTlv) tlv).interfaceAddress();
+            }
+        }
+        return interfaceIpAddresses;
+    }
+
+    /**
+     * Returns the list of neighbor list.
+     *
+     * @return macAddresses list of neighbor MAC address
+     */
+    public List<MacAddress> neighborList() {
+        List<MacAddress> macAddresses = null;
+        for (IsisTlv tlv : tlvs()) {
+            if (tlv instanceof IsisNeighborTlv) {
+                macAddresses = ((IsisNeighborTlv) tlv).neighbor();
+            }
+        }
+        return macAddresses;
+    }
+
+    /**
+     * Returns the adjacency state.
+     *
+     * @return interfaceState adjacency state
+     */
+    public IsisInterfaceState adjacencyState() {
+        IsisInterfaceState interfaceState = null;
+        for (IsisTlv tlv : tlvs()) {
+            if (tlv instanceof AdjacencyStateTlv) {
+                interfaceState = IsisInterfaceState.get(((AdjacencyStateTlv) tlv).adjacencyType());
+                break;
+            }
+        }
+        return interfaceState;
+    }
+
+    /**
+     * Returns the source ID.
+     *
+     * @return sourceId source ID
+     */
+    public String sourceId() {
+        return sourceId;
+    }
+
+    /**
+     * Sets source ID.
+     *
+     * @param sourceId source ID
+     */
+    public void setSourceId(String sourceId) {
+        this.sourceId = sourceId;
+    }
+
+    /**
+     * Returns the PDU length.
+     *
+     * @return pduLength PDU length
+     */
+    public int pduLength() {
+        return pduLength;
+    }
+
+    /**
+     * Sets the PDU length.
+     *
+     * @param pduLength PDU lenght
+     */
+    public void setPduLength(int pduLength) {
+        this.pduLength = pduLength;
+    }
+
+    /**
+     * Returns the holding time.
+     *
+     * @return holdingTime holding time
+     */
+    public int holdingTime() {
+        return holdingTime;
+    }
+
+    /**
+     * Sets the holding time.
+     *
+     * @param holdingTime holding time
+     */
+    public void setHoldingTime(int holdingTime) {
+        this.holdingTime = holdingTime;
+    }
+
+    /**
+     * Returns the circuit type.
+     *
+     * @return circuitType circuit type
+     */
+    public byte circuitType() {
+        return circuitType;
+    }
+
+    /**
+     * Sets the circuit type.
+     *
+     * @param circuitType circuit type
+     */
+    public void setCircuitType(byte circuitType) {
+        this.circuitType = circuitType;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("circuitType", circuitType)
+                .add("sourceId", sourceId)
+                .add("holdingTime", holdingTime)
+                .add("pduLength", pduLength)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        HelloPdu that = (HelloPdu) o;
+        return Objects.equal(circuitType, that.circuitType) &&
+                Objects.equal(sourceId, that.sourceId) &&
+                Objects.equal(holdingTime, that.holdingTime) &&
+                Objects.equal(pduLength, that.pduLength);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(circuitType, sourceId, holdingTime, pduLength);
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/L1L2HelloPdu.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/L1L2HelloPdu.java
new file mode 100644
index 0000000..9737e1a
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/L1L2HelloPdu.java
@@ -0,0 +1,228 @@
+/*
+ * 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 com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+import org.onosproject.isis.io.isispacket.tlv.IsisTlv;
+import org.onosproject.isis.io.isispacket.tlv.TlvFinder;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+import org.onosproject.isis.io.isispacket.tlv.TlvType;
+import org.onosproject.isis.io.isispacket.tlv.TlvsToBytes;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of L1L2 hello PDU.
+ */
+public class L1L2HelloPdu extends HelloPdu {
+
+    /*
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |             Intra-domain Routing Protocol  Discriminator       |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          Length Indicator                     |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                           Version/Protocol ID Extension       |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                           ID Length                           |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |     R     |     R     |    R      |       PDU Type            |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                             Version                           |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                             Reserved                          |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                     Maximum area address                      |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          Circuit Type                         |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          Source ID                            |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          Holding Time                         |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          PDU Length                           |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          PDU Length                           |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |    R     |                   Priority                         |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                             LAN ID                            |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                      Variable Lengths Fields                  |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+        Hello Message Format
+        REFERENCE : ISO/IEC 10589
+    */
+
+    private byte priority;
+    private String lanId;
+
+    /**
+     * Parametrized constructor.
+     *
+     * @param isisHeader ISIs header
+     */
+    public L1L2HelloPdu(IsisHeader isisHeader) {
+        populateHeader(isisHeader);
+    }
+
+    /**
+     * Returns the LAN ID.
+     *
+     * @return LAN ID
+     */
+
+    public String lanId() {
+        return lanId;
+    }
+
+    /**
+     * Sets the LAN ID.
+     *
+     * @param lanId LAN ID
+     */
+    public void setLanId(String lanId) {
+        this.lanId = lanId;
+    }
+
+    /**
+     * Returns the priority.
+     *
+     * @return priority
+     */
+    public byte priority() {
+        return priority;
+    }
+
+    /**
+     * Sets priority.
+     *
+     * @param priority priority
+     */
+    public void setPriority(byte priority) {
+        this.priority = priority;
+    }
+
+    @Override
+    public void readFrom(ChannelBuffer channelBuffer) {
+        this.setCircuitType(channelBuffer.readByte());
+        //sorce id
+        byte[] tempByteArray = new byte[IsisUtil.ID_SIX_BYTES];
+        channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_SIX_BYTES);
+        this.setSourceId(IsisUtil.systemId(tempByteArray));
+        this.setHoldingTime(channelBuffer.readUnsignedShort());
+        this.setPduLength(channelBuffer.readUnsignedShort());
+        this.setPriority(channelBuffer.readByte());
+        //landid  id + 1 value
+        tempByteArray = new byte[IsisUtil.ID_PLUS_ONE_BYTE];
+        channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_PLUS_ONE_BYTE);
+        this.setLanId(IsisUtil.systemIdPlus(tempByteArray));
+        //tlv here
+        while (channelBuffer.readableBytes() > 0) {
+            TlvHeader tlvHeader = new TlvHeader();
+            tlvHeader.setTlvType(channelBuffer.readUnsignedByte());
+            tlvHeader.setTlvLength(channelBuffer.readUnsignedByte());
+            TlvType tlvType = TlvType.get(tlvHeader.tlvType());
+            if (tlvType != null) {
+                IsisTlv tlv = TlvFinder.findTlv(tlvHeader, channelBuffer.readBytes(tlvHeader.tlvLength()));
+                this.variableLengths.add(tlv);
+            } else {
+                channelBuffer.readBytes(tlvHeader.tlvLength());
+            }
+        }
+    }
+
+    @Override
+    public byte[] asBytes() {
+        byte[] helloMessage = null;
+        byte[] helloHeader = l1l2IsisPduHeader();
+        byte[] helloBody = l1l2HelloPduBody();
+        helloMessage = Bytes.concat(helloHeader, helloBody);
+        return helloMessage;
+    }
+
+    /**
+     * Parse the ISIS L1L2 PDU header.
+     *
+     * @return ISIS L1L2 PDU header
+     */
+    public byte[] l1l2IsisPduHeader() {
+        List<Byte> headerLst = new ArrayList<>();
+        headerLst.add(this.irpDiscriminator());
+        headerLst.add((byte) IsisUtil.getPduHeaderLength(this.pduType()));
+        headerLst.add(this.version());
+        headerLst.add(this.idLength());
+        headerLst.add((byte) this.pduType());
+        headerLst.add(this.version2());
+        headerLst.add(this.reserved());
+        headerLst.add(this.maximumAreaAddresses());
+        return Bytes.toArray(headerLst);
+    }
+
+    /**
+     * Parse the ISIS L1L2 PDU body.
+     *
+     * @return ISIS L1L2 PDU body
+     */
+    public byte[] l1l2HelloPduBody() {
+        List<Byte> bodyLst = new ArrayList<>();
+
+        bodyLst.add(this.circuitType());
+        bodyLst.addAll(IsisUtil.sourceAndLanIdToBytes(this.sourceId()));
+        bodyLst.addAll(Bytes.asList(IsisUtil.convertToTwoBytes(this.holdingTime())));
+        bodyLst.addAll(Bytes.asList(IsisUtil.convertToTwoBytes(this.pduLength())));
+        bodyLst.add(this.priority);
+        bodyLst.addAll(IsisUtil.sourceAndLanIdToBytes(this.lanId()));
+        for (IsisTlv isisTlv : variableLengths) {
+            bodyLst.addAll(TlvsToBytes.tlvToBytes(isisTlv));
+        }
+        return Bytes.toArray(bodyLst);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("priority", priority)
+                .add("lanId", lanId)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        L1L2HelloPdu that = (L1L2HelloPdu) o;
+        return Objects.equal(priority, that.priority) &&
+                Objects.equal(lanId, that.lanId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(priority, lanId);
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/LsPdu.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/LsPdu.java
new file mode 100644
index 0000000..11de4f4
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/LsPdu.java
@@ -0,0 +1,486 @@
+/*
+ * 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 com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+import org.onosproject.isis.io.isispacket.tlv.IsisTlv;
+import org.onosproject.isis.io.isispacket.tlv.TlvFinder;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+import org.onosproject.isis.io.isispacket.tlv.TlvType;
+import org.onosproject.isis.io.isispacket.tlv.TlvsToBytes;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of an ISIS Link State packet.
+ * Each Link State packet carries a collection of TLVs
+ * Several TLVs may be included in a single packet.
+ */
+public class LsPdu extends IsisHeader {
+
+    /*
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |             Intra-domain Routing Protocol  Discriminator      |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          Length Indicator                     |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                           Version/Protocol ID Extension       |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                           ID Length                           |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |     R     |     R     |    R      |       PDU Type            |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          Version                              |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          Reserved                             |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                     Maximum area address                      |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          PDU Length                           |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                       Remaining Lifetime                      |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          LSP ID                               |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          PDU Length                           |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                        Sequence Number                        |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                        Checksum                               |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |   P     |   ATT   |     LSPDBOL         |       IS Type       |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                      Variable Lengths Fields                  |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+        LS PDU Format
+        REFERENCE : ISO/IEC 10589
+    */
+    private int pduLength;
+    private int remainingLifeTime;
+    private String lspId;
+    private int sequenceNumber;
+    private int checkSum;
+    private boolean partitionRepair;
+    private AttachedToOtherAreas attachedToOtherAreas;
+    private boolean lspDbol;
+    private byte typeBlock;
+    private byte intermediateSystemType;
+    private List<IsisTlv> variableLengths = new ArrayList<>();
+
+    /**
+     * Creates an instance of Link State packet.
+     * Parameterized constructor which populate
+     *
+     * @param isisHeader isis header details
+     */
+    public LsPdu(IsisHeader isisHeader) {
+        populateHeader(isisHeader);
+    }
+
+    /**
+     * Adds the isis tlv to the list for the link state PDU.
+     *
+     * @param isisTlv isis tlv
+     */
+    public void addTlv(IsisTlv isisTlv) {
+        variableLengths.add(isisTlv);
+    }
+
+    /**
+     * Returns the remaining time of the link state pdu.
+     * Number of seconds before LSP considered expired
+     *
+     * @return remainingTime remaining time
+     */
+    public int remainingLifeTime() {
+        return remainingLifeTime;
+    }
+
+    /**
+     * Sets the remaining time for the link state pdu.
+     *
+     * @param remainingLifeTime remaining time
+     */
+    public void setRemainingLifeTime(int remainingLifeTime) {
+        this.remainingLifeTime = remainingLifeTime;
+    }
+
+    /**
+     * Returns the link state database overload.
+     *
+     * @return lspdbol link state database overload
+     */
+    public boolean lspDbol() {
+        return lspDbol;
+    }
+
+    /**
+     * Sets the link state database overload for this pdu.
+     *
+     * @param lspDbol link state database overload
+     */
+    public void setLspDbol(boolean lspDbol) {
+        this.lspDbol = lspDbol;
+    }
+
+    /**
+     * Returns the type block.
+     *
+     * @return type block
+     */
+    public byte typeBlock() {
+        return typeBlock;
+    }
+
+    /**
+     * Sets the type block.
+     *
+     * @param typeBlock type block
+     */
+    public void setTypeBlock(byte typeBlock) {
+        this.typeBlock = typeBlock;
+    }
+
+    /**
+     * Returns the sequence number of LSP.
+     *
+     * @return sequenceNumber sequence number
+     */
+    public int sequenceNumber() {
+        return sequenceNumber;
+    }
+
+    /**
+     * Sets the sequence nubmer for LSP.
+     *
+     * @param sequenceNumber sequence number
+     */
+    public void setSequenceNumber(int sequenceNumber) {
+        this.sequenceNumber = sequenceNumber;
+    }
+
+    /**
+     * Returns the checksum of LSP from Source ID to end.
+     *
+     * @return checkSum check sum
+     */
+    public int checkSum() {
+        return checkSum;
+    }
+
+    /**
+     * Sets the checksum for LSP from Source ID to end.
+     *
+     * @param checkSum check sum
+     */
+    public void setCheckSum(int checkSum) {
+        this.checkSum = checkSum;
+    }
+
+    /**
+     * Returns the partition repair value of the intermediate system.
+     *
+     * @return partitionRepair partition repair
+     */
+    public boolean partitionRepair() {
+        return partitionRepair;
+    }
+
+    /**
+     * Sets partition repair value for the intermediate system.
+     *
+     * @param partitionRepair partition repair
+     */
+    public void setPartitionRepair(boolean partitionRepair) {
+        this.partitionRepair = partitionRepair;
+    }
+
+    /**
+     * Returns the value of intermediate system attached field.
+     * return values based on type Default Metric, Delay Metric, Expense Metric, Error Metric
+     *
+     * @return attachedToOtherAreas attached to other areas
+     */
+    public AttachedToOtherAreas attachedToOtherAreas() {
+        return attachedToOtherAreas;
+    }
+
+    /**
+     * Sets the value for intermediate system attached field.
+     * it will pass values based on type Default Metric, Delay Metric, Expense Metric, Error Metric
+     *
+     * @param attachedToOtherAreas attached to other areas
+     */
+    public void setAttachedToOtherAreas(AttachedToOtherAreas attachedToOtherAreas) {
+        this.attachedToOtherAreas = attachedToOtherAreas;
+    }
+
+    /**
+     * Returns the intermediate system type.
+     * type will be level 1 or level 2
+     *
+     * @return intermediateSystemType intermediate system type
+     */
+    public byte intermediateSystemType() {
+        return intermediateSystemType;
+    }
+
+    /**
+     * Sets the value for intermediate system.
+     * type will be level 1 or level 2
+     *
+     * @param intermediateSystemType intermediate system type
+     */
+    public void setIntermediateSystemType(byte intermediateSystemType) {
+        this.intermediateSystemType = intermediateSystemType;
+    }
+
+    /**
+     * Returns the link state ID of link state packet.
+     * System ID of the source of link state PDU
+     *
+     * @return lspId link state packet ID
+     */
+    public String lspId() {
+        return lspId;
+    }
+
+    /**
+     * Sets the link state ID for link state packet.
+     * System ID of the source of link state PDU
+     *
+     * @param lspId link state packet ID
+     */
+    public void setLspId(String lspId) {
+        this.lspId = lspId;
+    }
+
+    /**
+     * Returns the packet data unit length of link state packet.
+     * Entire length of this PDU, in octets
+     *
+     * @return pduLength packte date unit length
+     */
+    public int pduLength() {
+        return pduLength;
+    }
+
+    /**
+     * Sets the packet data unit length for link state packet.
+     * Entire Length of this PDU, in octets
+     *
+     * @param pduLength packte data length
+     */
+    public void setPduLength(int pduLength) {
+        this.pduLength = pduLength;
+    }
+
+    @Override
+    public void readFrom(ChannelBuffer channelBuffer) {
+
+        this.setPduLength(channelBuffer.readUnsignedShort());
+        this.setRemainingLifeTime(channelBuffer.readUnsignedShort());
+        //lsp id + 2 value
+        byte[] tempByteArray = new byte[IsisUtil.ID_PLUS_TWO_BYTE];
+        channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_PLUS_TWO_BYTE);
+        this.setLspId(IsisUtil.systemIdPlus(tempByteArray));
+        //sequence number 4
+        this.setSequenceNumber(channelBuffer.readInt());
+        this.setCheckSum(channelBuffer.readUnsignedShort());
+        int typeTemp = channelBuffer.readUnsignedByte();
+        byte isTypeByte = (byte) typeTemp;
+        String tempValue = String.format("%8s", Integer.toBinaryString(isTypeByte & 0xFF)).replace(' ', '0');
+        int pBit = Integer.parseInt(new Character(tempValue.charAt(0)).toString());
+        if (pBit == 1) {
+            this.setPartitionRepair(true);
+        } else {
+            this.setPartitionRepair(false);
+        }
+        int attValue = Integer.parseInt(tempValue.substring(1, 5), 2);
+        switch (AttachedToOtherAreas.get(attValue)) {
+            case DEFAULTMETRIC:
+                this.setAttachedToOtherAreas(AttachedToOtherAreas.DEFAULTMETRIC);
+                break;
+            case DELAYMETRIC:
+                this.setAttachedToOtherAreas(AttachedToOtherAreas.DELAYMETRIC);
+                break;
+            case EXPENSEMETRIC:
+                this.setAttachedToOtherAreas(AttachedToOtherAreas.EXPENSEMETRIC);
+                break;
+            case ERRORMETRIC:
+                this.setAttachedToOtherAreas(AttachedToOtherAreas.ERRORMETRIC);
+                break;
+            case NONE:
+                this.setAttachedToOtherAreas(AttachedToOtherAreas.NONE);
+                break;
+            default:
+                break;
+        }
+        int lspdbol = Integer.parseInt(new Character(tempValue.charAt(5)).toString());
+        if (lspdbol == 1) {
+            this.setLspDbol(true);
+        } else {
+            this.setLspDbol(false);
+        }
+        int isType = Integer.parseInt(tempValue.substring(6, 8), 2);
+        byte isTypeByteValue = (byte) isType;
+        this.setIntermediateSystemType(isTypeByteValue);
+        //tlv here
+        while (channelBuffer.readableBytes() > 0) {
+            TlvHeader tlvHeader = new TlvHeader();
+            tlvHeader.setTlvType(channelBuffer.readUnsignedByte());
+            tlvHeader.setTlvLength(channelBuffer.readUnsignedByte());
+            TlvType tlvValue = TlvType.get(tlvHeader.tlvType());
+            if (tlvValue != null) {
+                IsisTlv tlv = TlvFinder.findTlv(tlvHeader, channelBuffer.readBytes(tlvHeader.tlvLength()));
+                this.variableLengths.add(tlv);
+            } else {
+                channelBuffer.readBytes(tlvHeader.tlvLength());
+            }
+        }
+    }
+
+    @Override
+    public byte[] asBytes() {
+        byte[] lspMessage = null;
+        byte[] helloHeader = l1l2IsisPduHeader();
+        byte[] lspBody = l1l2LsPduBody();
+        lspMessage = Bytes.concat(helloHeader, lspBody);
+        return lspMessage;
+    }
+
+    /**
+     * Builds ISIS PDU header from ISIS message.
+     *
+     * @return headerList ISIS PDU header
+     */
+    public byte[] l1l2IsisPduHeader() {
+        List<Byte> headerList = new ArrayList<>();
+        headerList.add(this.irpDiscriminator());
+        headerList.add((byte) IsisUtil.getPduHeaderLength(this.pduType()));
+        headerList.add(this.version());
+        headerList.add(this.idLength());
+        headerList.add((byte) this.pduType());
+        headerList.add(this.version2());
+        headerList.add(this.reserved());
+        headerList.add(this.maximumAreaAddresses());
+        return Bytes.toArray(headerList);
+    }
+
+    /**
+     * Builds link state PDU body from ISIS message.
+     *
+     * @return bodyList link state PDU body
+     */
+    public byte[] l1l2LsPduBody() {
+        List<Byte> bodyList = new ArrayList<>();
+        bodyList.addAll(Bytes.asList(IsisUtil.convertToTwoBytes(this.pduLength())));
+        bodyList.addAll(Bytes.asList(IsisUtil.convertToTwoBytes(this.remainingLifeTime())));
+        bodyList.addAll(IsisUtil.sourceAndLanIdToBytes(this.lspId()));
+        bodyList.addAll(Bytes.asList(IsisUtil.convertToFourBytes(this.sequenceNumber())));
+        bodyList.addAll(Bytes.asList(IsisUtil.convertToTwoBytes(this.checkSum())));
+        String temString = "";
+        if (this.partitionRepair()) {
+            temString = "1" + temString;
+        } else {
+            temString = "0" + temString;
+        }
+        switch (this.attachedToOtherAreas()) {
+            case ERRORMETRIC:
+                temString = temString + "1000";
+                break;
+            case EXPENSEMETRIC:
+                temString = temString + "0100";
+                break;
+            case DELAYMETRIC:
+                temString = temString + "0010";
+                break;
+            case DEFAULTMETRIC:
+                temString = temString + "0001";
+                break;
+            case NONE:
+                temString = temString + "0000";
+                break;
+            default:
+                break;
+        }
+        if (this.lspDbol()) {
+            temString = temString + "1";
+        } else {
+            temString = temString + "0";
+        }
+        String isType = Integer.toBinaryString(this.intermediateSystemType());
+        if (isType.length() % 2 != 0) {
+            isType = "0" + isType;
+        }
+        temString = temString + isType;
+        bodyList.add((byte) Integer.parseInt(temString, 2));
+        for (IsisTlv isisTlv : variableLengths) {
+            bodyList.addAll(TlvsToBytes.tlvToBytes(isisTlv));
+        }
+        return Bytes.toArray(bodyList);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("pduLength", pduLength)
+                .add("remainingLifeTime", remainingLifeTime)
+                .add("lspId", lspId)
+                .add("sequenceNumber", sequenceNumber)
+                .add("checkSum", checkSum)
+                .add("partitionRepair", partitionRepair)
+                .add("lspDbol", lspDbol)
+                .add("typeBlock", typeBlock)
+                .add("intermediateSystemType", intermediateSystemType)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        LsPdu that = (LsPdu) o;
+        return Objects.equal(pduLength, that.pduLength) &&
+                Objects.equal(remainingLifeTime, that.remainingLifeTime) &&
+                Objects.equal(lspId, that.lspId) &&
+                Objects.equal(sequenceNumber, that.sequenceNumber) &&
+                Objects.equal(checkSum, that.checkSum) &&
+                Objects.equal(partitionRepair, that.partitionRepair) &&
+                Objects.equal(lspDbol, that.lspDbol) &&
+                Objects.equal(typeBlock, that.typeBlock) &&
+                Objects.equal(intermediateSystemType, that.intermediateSystemType);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(pduLength, remainingLifeTime, lspId, sequenceNumber,
+                                checkSum, partitionRepair, lspDbol, typeBlock, intermediateSystemType);
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/P2PHelloPdu.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/P2PHelloPdu.java
new file mode 100644
index 0000000..e236610
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/P2PHelloPdu.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 com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+import org.onosproject.isis.io.isispacket.tlv.IsisTlv;
+import org.onosproject.isis.io.isispacket.tlv.TlvFinder;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+import org.onosproject.isis.io.isispacket.tlv.TlvType;
+import org.onosproject.isis.io.isispacket.tlv.TlvsToBytes;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of P2P hello.
+ */
+public class P2PHelloPdu extends HelloPdu {
+    /*
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |             Intra-domain Routing Protocol  Discriminator       |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          Length Indicator                     |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                           Version/Protocol ID Extension       |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                           ID Length                           |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |     R     |     R     |    R      |       PDU Type            |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                             Version                           |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                             Reserved                          |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                     Maximum area address                      |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          Circuit Type                         |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          Source ID                            |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          Holding Time                         |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          PDU Length                           |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                        Local Circuit Id                       |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                      Variable Lengths Fields                  |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+        P2P Hello Message Format
+        REFERENCE : ISO/IEC 10589
+    */
+    private byte localCircuitId;
+
+    /**
+     * Sets the ISIS header.
+     *
+     * @param isisHeader isisHeader
+     */
+    public P2PHelloPdu(IsisHeader isisHeader) {
+        populateHeader(isisHeader);
+    }
+
+    /**
+     * Returns the local circuit ID.
+     *
+     * @return Local circuit ID
+     */
+    public byte localCircuitId() {
+        return localCircuitId;
+    }
+
+    /**
+     * Sets the local circuit ID.
+     *
+     * @param localCircuitId Local circuit ID
+     */
+    public void setLocalCircuitId(byte localCircuitId) {
+        this.localCircuitId = localCircuitId;
+    }
+
+    /**
+     * Sets the variable lengths.
+     *
+     * @param variableLengths variable lengths.
+     */
+    public void setVariableLengths(List<IsisTlv> variableLengths) {
+        this.variableLengths = variableLengths;
+    }
+
+
+    @Override
+    public void readFrom(ChannelBuffer channelBuffer) {
+        this.setCircuitType(channelBuffer.readByte());
+        //source id
+        byte[] tempByteArray = new byte[IsisUtil.ID_SIX_BYTES];
+        channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_SIX_BYTES);
+        this.setSourceId(IsisUtil.systemId(tempByteArray));
+        this.setHoldingTime(channelBuffer.readUnsignedShort());
+        this.setPduLength(channelBuffer.readUnsignedShort());
+        this.setLocalCircuitId((byte) channelBuffer.readUnsignedByte());
+        while (channelBuffer.readableBytes() > 0) {
+            TlvHeader tlvHeader = new TlvHeader();
+            tlvHeader.setTlvType(channelBuffer.readUnsignedByte());
+            tlvHeader.setTlvLength(channelBuffer.readUnsignedByte());
+            TlvType tlvType = TlvType.get(tlvHeader.tlvType());
+            if (tlvType != null) {
+                IsisTlv tlv = TlvFinder.findTlv(tlvHeader, channelBuffer.readBytes(tlvHeader.tlvLength()));
+                this.variableLengths.add(tlv);
+            } else {
+                channelBuffer.readBytes(tlvHeader.tlvLength());
+            }
+        }
+    }
+
+    @Override
+    public byte[] asBytes() {
+        byte[] helloMessage = null;
+        byte[] helloHeader = p2PHeader();
+        byte[] helloBody = p2P2HelloPduBody();
+        helloMessage = Bytes.concat(helloHeader, helloBody);
+        return helloMessage;
+    }
+
+    /**
+     * Builds the point to point header.
+     *
+     * @return headerList point to point header
+     */
+    public byte[] p2PHeader() {
+        List<Byte> headerList = new ArrayList<>();
+        headerList.add(this.irpDiscriminator());
+        headerList.add((byte) IsisUtil.getPduHeaderLength(this.pduType()));
+        headerList.add(this.version());
+        headerList.add(this.idLength());
+        headerList.add((byte) this.pduType());
+        headerList.add(this.version2());
+        headerList.add(this.reserved());
+        headerList.add(this.maximumAreaAddresses());
+        return Bytes.toArray(headerList);
+    }
+
+    /**
+     * Builds the point to point hello PDU body.
+     *
+     * @return bodyList point to point hello PDU body
+     */
+    public byte[] p2P2HelloPduBody() {
+        List<Byte> bodyList = new ArrayList<>();
+        bodyList.add(this.circuitType());
+        bodyList.addAll(IsisUtil.sourceAndLanIdToBytes(this.sourceId()));
+        bodyList.addAll(Bytes.asList(IsisUtil.convertToTwoBytes(this.holdingTime())));
+        bodyList.addAll(Bytes.asList(IsisUtil.convertToTwoBytes(this.pduLength())));
+        bodyList.add((byte) this.localCircuitId());
+        for (IsisTlv isisTlv : variableLengths) {
+            bodyList.addAll(TlvsToBytes.tlvToBytes(isisTlv));
+        }
+        return Bytes.toArray(bodyList);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("localCircuitId", localCircuitId)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        P2PHelloPdu that = (P2PHelloPdu) o;
+        return Objects.equal(localCircuitId, that.localCircuitId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(localCircuitId);
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..6ed6a4c
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/Psnp.java
@@ -0,0 +1,214 @@
+/*
+ * 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 com.google.common.base.MoreObjects;
+import com.google.common.base.Objects;
+import com.google.common.primitives.Bytes;
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+import org.onosproject.isis.io.isispacket.tlv.IsisTlv;
+import org.onosproject.isis.io.isispacket.tlv.TlvFinder;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+import org.onosproject.isis.io.isispacket.tlv.TlvType;
+import org.onosproject.isis.io.isispacket.tlv.TlvsToBytes;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of partial sequence number PDU.
+ */
+public class Psnp extends IsisHeader {
+    /*
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |             Intradomain Routing Protocol  Discriminator       |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          Length Indicator                     |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                           Version/Protocol ID Extension       |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                           ID Length                           |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |     R     |     R     |    R      |       PDU Type            |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          Version                              |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          Reserved                             |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                     Maximum area address                      |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                          PDU Length                           |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                         Source ID                             |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                       Start LSP ID                            |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                        End LSP ID                             |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+        |                      Variable Lengths Fields                  |
+        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+        Hello Message Format
+        REFERENCE : ISO/IEC 10589
+    */
+    private int pduLength;
+    private String sourceId;
+    private List<IsisTlv> variableLengths = new ArrayList<>();
+
+    /**
+     * Creates the instance for this class.
+     *
+     * @param isisHeader ISIS header
+     */
+    public Psnp(IsisHeader isisHeader) {
+        populateHeader(isisHeader);
+    }
+
+    public void addTlv(IsisTlv isisTlv) {
+        variableLengths.add(isisTlv);
+    }
+
+    /**
+     * Returns the source ID of csnp.
+     *
+     * @return sourceId source ID
+     */
+    public String sourceId() {
+        return sourceId;
+    }
+
+    /**
+     * Sets the source ID for csnp.
+     *
+     * @param sourceId source ID
+     */
+    public void setSourceId(String sourceId) {
+        this.sourceId = sourceId;
+    }
+
+    /**
+     * Returns the packet data unit length of link state packet.
+     * Entire length of this PDU, in octets
+     *
+     * @return pduLength packte date unit length
+     */
+    public int pduLength() {
+        return pduLength;
+    }
+
+    /**
+     * Sets the packet data unit length for link state packet.
+     * Entire Length of this PDU, in octets
+     *
+     * @param pduLength packte data length
+     */
+    public void setPduLength(int pduLength) {
+        this.pduLength = pduLength;
+    }
+
+    @Override
+    public void readFrom(ChannelBuffer channelBuffer) {
+        this.setPduLength(channelBuffer.readUnsignedShort());
+        //source id + 2 value
+        byte[] tempByteArray = new byte[IsisUtil.ID_PLUS_ONE_BYTE];
+        channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_PLUS_ONE_BYTE);
+        this.setSourceId(IsisUtil.systemIdPlus(tempByteArray));
+        //tlv here
+        while (channelBuffer.readableBytes() > 0) {
+            TlvHeader tlvHeader = new TlvHeader();
+            tlvHeader.setTlvType(channelBuffer.readUnsignedByte());
+            tlvHeader.setTlvLength(channelBuffer.readUnsignedByte());
+            TlvType tlvValue = TlvType.get(tlvHeader.tlvType());
+            if (tlvValue != null) {
+                IsisTlv tlv = TlvFinder.findTlv(tlvHeader, channelBuffer.readBytes(tlvHeader.tlvLength()));
+                this.variableLengths.add(tlv);
+            } else {
+                channelBuffer.readBytes(tlvHeader.tlvLength());
+            }
+        }
+    }
+
+
+    @Override
+    public byte[] asBytes() {
+        byte[] psnpMessage = null;
+        byte[] isisPduHeader = isisPduHeader();
+        byte[] psnpBody = partialSequenceNumberPduBody();
+        psnpMessage = Bytes.concat(isisPduHeader, psnpBody);
+        return psnpMessage;
+    }
+
+    /**
+     * Builds the ISIS PDU header.
+     *
+     * @return headerList ISIS PDU header
+     */
+    public byte[] isisPduHeader() {
+        List<Byte> headerList = new ArrayList<>();
+        headerList.add(this.irpDiscriminator());
+        headerList.add((byte) IsisUtil.getPduHeaderLength(this.pduType()));
+        headerList.add(this.version());
+        headerList.add(this.idLength());
+        headerList.add((byte) this.pduType());
+        headerList.add(this.version2());
+        headerList.add(this.reserved());
+        headerList.add(this.maximumAreaAddresses());
+        return Bytes.toArray(headerList);
+    }
+
+    /**
+     * Builds the partial sequence number PDU body.
+     *
+     * @return bodyList partial sequence number PDU body
+     */
+    public byte[] partialSequenceNumberPduBody() {
+        List<Byte> bodyList = new ArrayList<>();
+        bodyList.addAll(Bytes.asList(IsisUtil.convertToTwoBytes(this.pduLength())));
+        bodyList.addAll(IsisUtil.sourceAndLanIdToBytes(this.sourceId()));
+        for (IsisTlv isisTlv : variableLengths) {
+            bodyList.addAll(TlvsToBytes.tlvToBytes(isisTlv));
+        }
+        return Bytes.toArray(bodyList);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("pduLength", pduLength)
+                .add("sourceId", sourceId)
+                .toString();
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+        Psnp that = (Psnp) o;
+        return Objects.equal(pduLength, that.pduLength);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(sourceId, pduLength);
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/package-info.java
new file mode 100644
index 0000000..8493298
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/pdu/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+/**
+ * Implementation of the isis protocol.
+ */
+package org.onosproject.isis.io.isispacket.pdu;
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AdjacencyStateTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AdjacencyStateTlv.java
index d13841c..5ee07fe 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AdjacencyStateTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AdjacencyStateTlv.java
@@ -36,7 +36,7 @@
     /**
      * Creates an instance of adjacency state TLV..
      *
-     * @param tlvHeader tlvHeader
+     * @param tlvHeader TLV header
      */
     public AdjacencyStateTlv(TlvHeader tlvHeader) {
         this.setTlvType(tlvHeader.tlvType());
@@ -118,8 +118,8 @@
     @Override
     public void readFrom(ChannelBuffer channelBuffer) {
         this.setAdjacencyType(channelBuffer.readByte());
+        this.setLocalCircuitId(channelBuffer.readInt());
         if (channelBuffer.readableBytes() > 0) {
-            this.setLocalCircuitId(channelBuffer.readInt());
             byte[] tempByteArray = new byte[IsisUtil.ID_SIX_BYTES];
             channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_SIX_BYTES);
             this.setNeighborSystemId(IsisUtil.systemId(tempByteArray));
@@ -146,8 +146,10 @@
         List<Byte> bytes = new ArrayList<>();
         bytes.add(this.adjacencyType);
         bytes.addAll(Bytes.asList(IsisUtil.convertToFourBytes(this.localCircuitId)));
+        if (this.neighborSystemId != null) {
         bytes.addAll(IsisUtil.sourceAndLanIdToBytes(this.neighborSystemId));
         bytes.addAll(Bytes.asList(IsisUtil.convertToFourBytes(this.neighborLocalCircuitId)));
+        }
         return Bytes.toArray(bytes);
     }
 
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AreaAddressTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AreaAddressTlv.java
index bc24910..0f3d54d 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AreaAddressTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AreaAddressTlv.java
@@ -33,7 +33,7 @@
     /**
      * Creates an instance of area address TLV.
      *
-     * @param tlvHeader tlvHeader
+     * @param tlvHeader TLV header
      */
     public AreaAddressTlv(TlvHeader tlvHeader) {
         this.setTlvType(tlvHeader.tlvType());
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/HostNameTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/HostNameTlv.java
index 82e8099..bc0fe8f 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/HostNameTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/HostNameTlv.java
@@ -28,7 +28,7 @@
     /**
      * Creates an instance of host name TLV.
      *
-     * @param tlvHeader tlvHeader.
+     * @param tlvHeader TLV header
      */
     public HostNameTlv(TlvHeader tlvHeader) {
         this.setTlvType(tlvHeader.tlvType());
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IdrpInformationTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IdrpInformationTlv.java
index b16a54d..eeb31f3 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IdrpInformationTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IdrpInformationTlv.java
@@ -29,7 +29,7 @@
     /**
      * Creates an instance of IDRP information TLV.
      *
-     * @param tlvHeader tlvHeader
+     * @param tlvHeader TLV header
      */
     public IdrpInformationTlv(TlvHeader tlvHeader) {
         this.setTlvType(tlvHeader.tlvType());
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpExtendedReachabilityTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpExtendedReachabilityTlv.java
index 7acb9c8..14962d8 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpExtendedReachabilityTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpExtendedReachabilityTlv.java
@@ -21,6 +21,7 @@
 import org.jboss.netty.buffer.ChannelBuffer;
 import org.onosproject.isis.io.isispacket.tlv.subtlv.SubTlvFinder;
 import org.onosproject.isis.io.isispacket.tlv.subtlv.SubTlvToBytes;
+import org.onosproject.isis.io.isispacket.tlv.subtlv.SubTlvType;
 import org.onosproject.isis.io.isispacket.tlv.subtlv.TrafficEngineeringSubTlv;
 import org.onosproject.isis.io.util.IsisUtil;
 
@@ -32,15 +33,18 @@
  */
 public class IpExtendedReachabilityTlv extends TlvHeader implements IsisTlv {
 
-    private String sysIdAndPseudoNumber;
-    private int defaultMetric;
+    private boolean down;
+    private boolean subTlvPresence;
+    private int prefixLength;
+    private int metric;
     private byte subTlvLength;
+    private String prefix;
     private List<TrafficEngineeringSubTlv> trafEnginSubTlv = new ArrayList<>();
 
     /**
      * Creates an instance of IP external reachability TLV.
      *
-     * @param tlvHeader tlvHeader
+     * @param tlvHeader TLV header
      */
     public IpExtendedReachabilityTlv(TlvHeader tlvHeader) {
         this.setTlvType(tlvHeader.tlvType());
@@ -48,21 +52,75 @@
     }
 
     /**
-     * Returns the system ID and pseudo number of IP external reachability TLV.
+     * Returns the prefix of IP external reachability TLV.
      *
-     * @return sysIdAndPseudoNumber system ID and pseudo number
+     * @return prefix
      */
-    public String sysIdAndPseudoNumber() {
-        return sysIdAndPseudoNumber;
+    public String prefix() {
+        return prefix;
     }
 
     /**
-     * Sets the system ID and pseudo number for IP external reachability TLV.
+     * Sets the prefix of IP external reachability TLV.
      *
-     * @param sysIdAndPseudoNumber system ID and pseudo number
+     * @param prefix prefix
      */
-    public void setSysIdAndPseudoNumber(String sysIdAndPseudoNumber) {
-        this.sysIdAndPseudoNumber = sysIdAndPseudoNumber;
+    public void setPrefix(String prefix) {
+        this.prefix = prefix;
+    }
+
+    /**
+     * Returns if down true else false of IP external reachability TLV.
+     *
+     * @return if down true else false
+     */
+    public boolean isDown() {
+        return down;
+    }
+
+    /**
+     * Sets if down true else false of IP external reachability TLV.
+     *
+     * @param upOrDown if down true else false
+     */
+    public void setDown(boolean upOrDown) {
+        this.down = upOrDown;
+    }
+
+    /**
+     * Returns true if sub TLV present else false of IP external reachability TLV.
+     *
+     * @return true if present else false
+     */
+    public boolean isSubTlvPresence() {
+        return subTlvPresence;
+    }
+
+    /**
+     * Sets true if sub TLV present else false of IP external reachability TLV.
+     *
+     * @param subTlvPresence true if present else false
+     */
+    public void setSubTlvPresence(boolean subTlvPresence) {
+        this.subTlvPresence = subTlvPresence;
+    }
+
+    /**
+     * Sets the prefix length of IP external reachability TLV.
+     *
+     * @return prefix length
+     */
+    public int prefixLength() {
+        return prefixLength;
+    }
+
+    /**
+     * Returns the prefix length of IP external reachability TLV.
+     *
+     * @param prefixLength the prefix length of IP external reachability TLV
+     */
+    public void setPrefixLength(int prefixLength) {
+        this.prefixLength = prefixLength;
     }
 
     /**
@@ -93,39 +151,70 @@
     }
 
     /**
-     * Returns default metric of IP external reachability TLV.
+     * Returns metric of IP external reachability TLV.
      *
-     * @return default metric
+     * @return metric
      */
-    public int defaultMetric() {
-        return defaultMetric;
+    public int metric() {
+        return metric;
     }
 
     /**
      * Sets default metric for IP external reachability TLV.
      *
-     * @param defaultMetric default metric
+     * @param metric default metric
      */
-    public void setDefaultMetric(int defaultMetric) {
-        this.defaultMetric = defaultMetric;
+    public void setMetric(int metric) {
+        this.metric = metric;
     }
 
     @Override
     public void readFrom(ChannelBuffer channelBuffer) {
-        byte[] tempByteArray = new byte[IsisUtil.ID_PLUS_ONE_BYTE];
-        channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_PLUS_ONE_BYTE);
-        this.setSysIdAndPseudoNumber(IsisUtil.systemIdPlus(tempByteArray));
-        this.setDefaultMetric(channelBuffer.readUnsignedMedium());
-        this.setSubTlvLength((byte) channelBuffer.readByte());
-        while (channelBuffer.readableBytes() > 0) {
-            TlvHeader tlvHeader = new TlvHeader();
-            tlvHeader.setTlvType(channelBuffer.readByte());
-            tlvHeader.setTlvLength(channelBuffer.readByte());
-            this.addSubTlv(SubTlvFinder.findSubTlv(tlvHeader,
-                                                   channelBuffer.readBytes(tlvHeader.tlvLength())));
+        this.setMetric(channelBuffer.readInt());
+        int controlInfo = channelBuffer.readByte();
+        byte[] tempByteArray = null;
+
+        String string = IsisUtil.toEightBitBinary(Integer.toBinaryString(controlInfo));
+        if (string.charAt(0) == '0') {
+            this.setDown(false);
+        }
+        if (string.charAt(1) == '1') {
+            this.setSubTlvPresence(true);
+        }
+        this.setPrefixLength(Integer.parseInt(string.substring(2, string.length()), 2));
+        if (this.prefixLength >= 0 && this.prefixLength <= 8) {
+            channelBuffer.readByte();
+        } else if (this.prefixLength >= 8 && this.prefixLength <= 16) {
+            tempByteArray = new byte[IsisUtil.TWO_BYTES];
+            channelBuffer.readBytes(tempByteArray, 0, IsisUtil.TWO_BYTES);
+            this.setPrefix(IsisUtil.prefixConversion(tempByteArray));
+        } else if (this.prefixLength >= 17 && this.prefixLength <= 24) {
+            tempByteArray = new byte[IsisUtil.THREE_BYTES];
+            channelBuffer.readBytes(tempByteArray, 0, IsisUtil.THREE_BYTES);
+            this.setPrefix(IsisUtil.prefixConversion(tempByteArray));
+        } else if (this.prefixLength >= 24 && this.prefixLength <= 32) {
+            tempByteArray = new byte[IsisUtil.FOUR_BYTES];
+            channelBuffer.readBytes(tempByteArray, 0, IsisUtil.FOUR_BYTES);
+            this.setPrefix(IsisUtil.prefixConversion(tempByteArray));
+        }
+        if (this.isSubTlvPresence()) {
+            this.setSubTlvLength(channelBuffer.readByte());
+            while (channelBuffer.readableBytes() > 0) {
+                TlvHeader tlvHeader = new TlvHeader();
+                tlvHeader.setTlvType(channelBuffer.readByte());
+                tlvHeader.setTlvLength(channelBuffer.readByte());
+                SubTlvType tlvValue = SubTlvType.get(tlvHeader.tlvType());
+                if (tlvValue != null) {
+                    this.addSubTlv(SubTlvFinder.findSubTlv(tlvHeader,
+                                                           channelBuffer.readBytes(tlvHeader.tlvLength())));
+                } else {
+                    channelBuffer.readBytes(tlvHeader.tlvLength());
+                }
+            }
         }
     }
 
+
     @Override
     public byte[] asBytes() {
         byte[] bytes = null;
@@ -145,11 +234,26 @@
      */
     private byte[] tlvBodyAsBytes() {
         List<Byte> bodyLst = new ArrayList<>();
-        bodyLst.addAll(IsisUtil.sourceAndLanIdToBytes(this.sysIdAndPseudoNumber()));
-        bodyLst.addAll(Bytes.asList(IsisUtil.convertToThreeBytes(this.defaultMetric())));
-        bodyLst.add(this.subTlvLength());
-        for (TrafficEngineeringSubTlv trafficEngineeringSubTlv : this.trafEnginSubTlv) {
-            bodyLst.addAll(SubTlvToBytes.tlvToBytes(trafficEngineeringSubTlv));
+        bodyLst.addAll(Bytes.asList(IsisUtil.convertToFourBytes(this.metric())));
+        String controlInfo = "";
+        if (this.isDown()) {
+            controlInfo = controlInfo + "1";
+        } else {
+            controlInfo = controlInfo + "0";
+        }
+        if (this.isSubTlvPresence()) {
+            controlInfo = controlInfo + "1";
+        } else {
+            controlInfo = controlInfo + "0";
+        }
+        String prefixlength = IsisUtil.toEightBitBinary(Integer.toBinaryString(this.prefixLength()));
+        controlInfo = controlInfo + prefixlength.substring(2, prefixlength.length());
+        bodyLst.add(Byte.parseByte(controlInfo, 2));
+        if (this.isSubTlvPresence()) {
+            bodyLst.add(this.subTlvLength());
+            for (TrafficEngineeringSubTlv trafficEngineeringSubTlv : this.trafEnginSubTlv) {
+                bodyLst.addAll(SubTlvToBytes.tlvToBytes(trafficEngineeringSubTlv));
+            }
         }
         return Bytes.toArray(bodyLst);
     }
@@ -158,9 +262,12 @@
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
                 .omitNullValues()
-                .add("sysIdAndPseudoNumber", sysIdAndPseudoNumber)
-                .add("defaultMetric", defaultMetric)
+                .add("down", down)
+                .add("subTlvPresence", subTlvPresence)
+                .add("prefixLength", prefixLength)
+                .add("metric", metric)
                 .add("subTlvLength", subTlvLength)
+                .add("prefix", prefix)
                 .add("trafEnginSubTlv", trafEnginSubTlv)
                 .toString();
     }
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpExternalReachabilityTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpExternalReachabilityTlv.java
deleted file mode 100644
index e050017..0000000
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpExternalReachabilityTlv.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * 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.tlv;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.primitives.Bytes;
-import org.jboss.netty.buffer.ChannelBuffer;
-import org.onosproject.isis.io.isispacket.tlv.subtlv.SubTlvFinder;
-import org.onosproject.isis.io.isispacket.tlv.subtlv.SubTlvToBytes;
-import org.onosproject.isis.io.isispacket.tlv.subtlv.TrafficEngineeringSubTlv;
-import org.onosproject.isis.io.util.IsisUtil;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Representation of IP external reachability TLV.
- */
-public class IpExternalReachabilityTlv extends TlvHeader implements IsisTlv {
-
-    private String sysIdAndPseudoNumber;
-    private int defaultMetric;
-    private byte subTlvLength;
-    private List<TrafficEngineeringSubTlv> trafEnginSubTlv = new ArrayList<>();
-
-    /**
-     * Sets TLV type and TLV length for IP external reachability TLV.
-     *
-     * @param tlvHeader tlvHeader
-     */
-    public IpExternalReachabilityTlv(TlvHeader tlvHeader) {
-        this.setTlvType(tlvHeader.tlvType());
-        this.setTlvLength(tlvHeader.tlvLength());
-    }
-
-    /**
-     * Gets the system ID and pseudo number of IP external reachability TLV.
-     *
-     * @return sysIdAndPseudoNumber system ID and pseudo number
-     */
-    public String sysIdAndPseudoNumber() {
-        return sysIdAndPseudoNumber;
-    }
-
-    /**
-     * Gets the system ID and pseudo number for IP external reachability TLV.
-     *
-     * @param sysIdAndPseudoNumber system ID and pseudo number
-     */
-    public void setSysIdAndPseudoNumber(String sysIdAndPseudoNumber) {
-        this.sysIdAndPseudoNumber = sysIdAndPseudoNumber;
-    }
-
-    /**
-     * Adds the traffic engineering sub TLV to IP external reachability TLV.
-     *
-     * @param trafEnginSubTlv traffic engineering sub TLV
-     */
-    public void addSubTlv(TrafficEngineeringSubTlv trafEnginSubTlv) {
-        this.trafEnginSubTlv.add(trafEnginSubTlv);
-    }
-
-    /**
-     * Gets the sub TLV length of IP external reachability TLV.
-     *
-     * @return sub TLV length
-     */
-    public byte subTlvLength() {
-        return subTlvLength;
-    }
-
-    /**
-     * Sets the sub TLV length for IP external reachability TLV.
-     *
-     * @param  subTlvLength sub TLV length
-     */
-    public void setSubTlvLength(byte subTlvLength) {
-        this.subTlvLength = subTlvLength;
-    }
-
-    /**
-     * Gets default metric of IP external reachability TLV.
-     *
-     * @return default metric
-     */
-    public int defaultMetric() {
-        return defaultMetric;
-    }
-
-    /**
-     * Sets default metric for IP external reachability TLV.
-     *
-     * @param defaultMetric default metric
-     */
-    public void setDefaultMetric(int defaultMetric) {
-        this.defaultMetric = defaultMetric;
-    }
-
-    @Override
-    public void readFrom(ChannelBuffer channelBuffer) {
-        byte[] tempByteArray = new byte[IsisUtil.ID_PLUS_ONE_BYTE];
-        channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_PLUS_ONE_BYTE);
-        this.setSysIdAndPseudoNumber(IsisUtil.systemIdPlus(tempByteArray));
-        this.setDefaultMetric(channelBuffer.readUnsignedMedium());
-        this.setSubTlvLength((byte) channelBuffer.readByte());
-        while (channelBuffer.readableBytes() > 0) {
-            TlvHeader tlvHeader = new TlvHeader();
-            tlvHeader.setTlvType(channelBuffer.readByte());
-            tlvHeader.setTlvLength(channelBuffer.readByte());
-            this.addSubTlv(SubTlvFinder.findSubTlv(tlvHeader,
-                                                   channelBuffer.readBytes(tlvHeader.tlvLength())));
-        }
-    }
-
-    @Override
-    public byte[] asBytes() {
-        byte[] bytes = null;
-        byte[] tlvHeader = tlvHeaderAsByteArray();
-        byte[] tlvBody = tlvBodyAsBytes();
-        //systemID + pseudo number+length of subtlv=11l
-        tlvBody[10] = (byte) (tlvBody.length - 11);
-        tlvHeader[1] = (byte) tlvBody.length;
-        bytes = Bytes.concat(tlvHeader, tlvBody);
-        return bytes;
-    }
-
-    /**
-     * Gets TLV body of IP external reachability TLV.
-     *
-     * @return byteArray TLV body of IP external reachability TLV.
-     */
-    public byte[] tlvBodyAsBytes() {
-        List<Byte> bodyLst = new ArrayList<>();
-        bodyLst.addAll(IsisUtil.sourceAndLanIdToBytes(this.sysIdAndPseudoNumber()));
-        bodyLst.addAll(Bytes.asList(IsisUtil.convertToThreeBytes(this.defaultMetric())));
-        bodyLst.add(this.subTlvLength());
-        for (TrafficEngineeringSubTlv trafficEngineeringSubTlv : this.trafEnginSubTlv) {
-            bodyLst.addAll(SubTlvToBytes.tlvToBytes(trafficEngineeringSubTlv));
-        }
-        return Bytes.toArray(bodyLst);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .omitNullValues()
-                .add("sysIdAndPseudoNumber", sysIdAndPseudoNumber)
-                .add("defaultMetric", defaultMetric)
-                .add("subTlvLength", subTlvLength)
-                .toString();
-    }
-}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInterfaceAddressTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInterfaceAddressTlv.java
index f372a6b..fcc7be6 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInterfaceAddressTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInterfaceAddressTlv.java
@@ -34,7 +34,7 @@
     /**
      * Creates an instance of IP interface address TLV.
      *
-     * @param tlvHeader tlvHeader.
+     * @param tlvHeader TLV header
      */
     public IpInterfaceAddressTlv(TlvHeader tlvHeader) {
 
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInternalReachabilityTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInternalReachabilityTlv.java
index fd92e1c..049674f 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInternalReachabilityTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInternalReachabilityTlv.java
@@ -31,7 +31,7 @@
     /**
      * Creates an instance of IP internal reachability TLV.
      *
-     * @param tlvHeader tlvHeader.
+     * @param tlvHeader TLV header
      */
     public IpInternalReachabilityTlv(TlvHeader tlvHeader) {
         this.setTlvType(tlvHeader.tlvType());
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsReachabilityTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsReachabilityTlv.java
index f5e6d43..4dd9df4 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsReachabilityTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsReachabilityTlv.java
@@ -33,7 +33,7 @@
     /**
      * Creates an instance of IS reachability TLV.
      *
-     * @param tlvHeader tlvHeader.
+     * @param tlvHeader TLV header
      */
     public IsReachabilityTlv(TlvHeader tlvHeader) {
         this.setTlvType(tlvHeader.tlvType());
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisNeighborTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisNeighborTlv.java
index 573568d..2d7f9e0 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisNeighborTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisNeighborTlv.java
@@ -34,7 +34,7 @@
     /**
      * Creates an instance of ISIS neighbor TLV.
      *
-     * @param tlvHeader tlvHeader
+     * @param tlvHeader TLV header
      */
     public IsisNeighborTlv(TlvHeader tlvHeader) {
         this.setTlvType(tlvHeader.tlvType());
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/LspEntriesTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/LspEntriesTlv.java
index 5cccfa6..e43d4b4 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/LspEntriesTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/LspEntriesTlv.java
@@ -31,7 +31,7 @@
     /**
      * Creates an instance of LSP entries TLV.
      *
-     * @param tlvHeader tlvHeader.
+     * @param tlvHeader TLV header
      */
     public LspEntriesTlv(TlvHeader tlvHeader) {
         this.setTlvType(tlvHeader.tlvType());
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/LspEntry.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/LspEntry.java
index 184d411..d0713ac 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/LspEntry.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/LspEntry.java
@@ -46,7 +46,7 @@
     /**
      * Sets LSP sequenceNumber for LSP entry.
      *
-     * @param lspSequenceNumber lspSequenceNumber.
+     * @param lspSequenceNumber lspSequenceNumber
      */
     public void setLspSequenceNumber(int lspSequenceNumber) {
         this.lspSequenceNumber = lspSequenceNumber;
@@ -113,11 +113,11 @@
      */
     public void readFrom(ChannelBuffer channelBuffer) {
         this.setRemainingTime(channelBuffer.readUnsignedShort());
-        byte[] tempByteArray = new byte[IsisUtil.ID_PLUS_ONE_BYTE];
-        channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_PLUS_ONE_BYTE);
+        byte[] tempByteArray = new byte[IsisUtil.ID_PLUS_TWO_BYTE];
+        channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_PLUS_TWO_BYTE);
         this.setLspId(IsisUtil.systemIdPlus(tempByteArray));
         this.setLspSequenceNumber(channelBuffer.readInt());
-        this.setLspChecksum(channelBuffer.readUnsignedByte());
+        this.setLspChecksum(channelBuffer.readUnsignedShort());
     }
 
     /**
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/MetricOfInternalReachability.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/MetricOfInternalReachability.java
index d133656..179b3e6 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/MetricOfInternalReachability.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/MetricOfInternalReachability.java
@@ -226,7 +226,7 @@
     /**
      * Returns error metric of metric of internal reachability.
      *
-     * @return errorMetric error metic
+     * @return errorMetric error metric
      */
     public byte errorMetric() {
         return errorMetric;
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/MetricsOfReachability.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/MetricsOfReachability.java
index 5274424..9157532 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/MetricsOfReachability.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/MetricsOfReachability.java
@@ -217,7 +217,7 @@
     /**
      * Sets delay metric for metric of reachability.
      *
-     * @param delayMetric delay metric.
+     * @param delayMetric delay metric
      */
     public void setDelayMetric(byte delayMetric) {
         this.delayMetric = delayMetric;
@@ -235,7 +235,7 @@
     /**
      * Sets Expense metric for metric of reachability.
      *
-     * @param expenseMetric Expense metric.
+     * @param expenseMetric Expense metric
      */
     public void setExpenseMetric(byte expenseMetric) {
         this.expenseMetric = expenseMetric;
@@ -253,7 +253,7 @@
     /**
      * Sets Error metric for metric of reachability.
      *
-     * @param errorMetric Error metric.
+     * @param errorMetric Error metric
      */
     public void setErrorMetric(byte errorMetric) {
         this.errorMetric = errorMetric;
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/PaddingTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/PaddingTlv.java
index 7aff5c2..2ff97c3 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/PaddingTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/PaddingTlv.java
@@ -31,7 +31,7 @@
     /**
      * Creates an instance of padding TLV.
      *
-     * @param tlvHeader tlvHeader.
+     * @param tlvHeader TLV header
      */
     public PaddingTlv(TlvHeader tlvHeader) {
         this.setTlvType(tlvHeader.tlvType());
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/ProtocolSupportedTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/ProtocolSupportedTlv.java
index 1c41d12..e261e92 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/ProtocolSupportedTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/ProtocolSupportedTlv.java
@@ -32,7 +32,7 @@
     /**
      * Creates an instance of protocol supported TLV.
      *
-     * @param tlvHeader tlvHeader.
+     * @param tlvHeader TLV header
      */
     public ProtocolSupportedTlv(TlvHeader tlvHeader) {
 
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvFinder.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvFinder.java
index e1fcbdf..d6bb909 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvFinder.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvFinder.java
@@ -44,6 +44,11 @@
             case EXTENDEDISREACHABILITY:
                 //TODO
                 break;
+            case HOSTNAME:
+                HostNameTlv hostNameTlv = new HostNameTlv(tlvHeader);
+                hostNameTlv.readFrom(channelBuffer);
+                isisTlv = hostNameTlv;
+                break;
             case IDRPINFORMATION:
                 IdrpInformationTlv idrpInformationTlv = new IdrpInformationTlv(tlvHeader);
                 idrpInformationTlv.readFrom(channelBuffer);
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/AdministrativeGroup.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/AdministrativeGroup.java
index 8e6dfa7..27675e7 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/AdministrativeGroup.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/AdministrativeGroup.java
@@ -40,7 +40,7 @@
     }
 
     /**
-     * Gets administrative group value.
+     * Returns administrative group value.
      *
      * @return administrative group value
      */
@@ -58,7 +58,7 @@
     }
 
     /**
-     * Gets administrative group value.
+     * Returns administrative group value.
      *
      * @return administrativeGroup value
      */
@@ -93,7 +93,7 @@
     }
 
     /**
-     * Gets administrative group body as byte array.
+     * Returns administrative group body as byte array.
      *
      * @return byte array of sub tlv administrative group
      */
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumBandwidth.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumBandwidth.java
index e5cba2b..e138cb0 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumBandwidth.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumBandwidth.java
@@ -31,7 +31,7 @@
     /**
      * Creates an instance of maximum bandwidth.
      *
-     * @param header tlv header instance
+     * @param header TLV header instance
      */
     public MaximumBandwidth(TlvHeader header) {
         this.setTlvType(header.tlvType());
@@ -48,7 +48,7 @@
     }
 
     /**
-     * Gets value of maximum bandwidth.
+     * Returns value of maximum bandwidth.
      *
      * @return maximumBandwidth value of maximum bandwidth
      */
@@ -69,7 +69,7 @@
     }
 
     /**
-     * Gets byte array of maximum bandwidth sub tlv.
+     * Returns byte array of maximum bandwidth sub tlv.
      *
      * @return byte array of maximum bandwidth sub tlv
      */
@@ -83,7 +83,7 @@
     }
 
     /**
-     * Gets maximum bandwidth sub tlv byte array.
+     * Returns maximum bandwidth sub tlv byte array.
      *
      * @return byte array of maximum bandwidth sub tlv
      */
@@ -92,7 +92,7 @@
         linkSubTypeBody = IsisUtil.convertToFourBytes(Float.floatToIntBits(this.maximumBandwidth));
         return linkSubTypeBody;
     }
-
+    @Override
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
                 .add("maximumBandwidth", maximumBandwidth)
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumReservableBandwidth.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumReservableBandwidth.java
index 22d96db..bfe72d4 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumReservableBandwidth.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumReservableBandwidth.java
@@ -31,7 +31,7 @@
     /**
      * Creates an instance of maximum reservable bandwidth.
      *
-     * @param header tlv header
+     * @param header TLV header
      */
     public MaximumReservableBandwidth(TlvHeader header) {
         this.setTlvType(header.tlvType());
@@ -48,7 +48,7 @@
     }
 
     /**
-     * Gets value of maximum reversible bandwidth.
+     * Returns value of maximum reversible bandwidth.
      *
      * @return maximumBandwidth maximum reversible bandwidth
      */
@@ -84,7 +84,7 @@
     }
 
     /**
-     * Gets maximum reservable bandwidth sub tlv body as byte array.
+     * Returns maximum reservable bandwidth sub tlv body as byte array.
      *
      * @return byte of maximum reservable bandwidth sub tlv body
      */
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvType.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvType.java
index b02da25..12c1127 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvType.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvType.java
@@ -51,7 +51,7 @@
     }
 
     /**
-     * Gets the enum instance from type value - reverse lookup purpose.
+     * Returns the enum instance from type value - reverse lookup purpose.
      *
      * @param subTlvTypeValue TLV type value
      * @return ISIS  sub TLV type instance
@@ -61,7 +61,7 @@
     }
 
     /**
-     * Gets value.
+     * Returns value.
      *
      * @return value
      */
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/TrafficEngineeringMetric.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/TrafficEngineeringMetric.java
index cad36e4..b5fe8a8 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/TrafficEngineeringMetric.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/TrafficEngineeringMetric.java
@@ -47,7 +47,7 @@
     }
 
     /**
-     * Gets TE metric value.
+     * Returns TE metric value.
      *
      * @return value of traffic engineering metric
      */
@@ -67,7 +67,7 @@
     }
 
     /**
-     * Gets instance as byte array.
+     * Returns instance as byte array.
      *
      * @return instance as byte array
      */
@@ -82,7 +82,7 @@
     }
 
     /**
-     * Gets trafficEngineeringMetric as byte array .
+     * Returns trafficEngineeringMetric as byte array .
      *
      * @return byte array of trafficEngineeringMetric
      */
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/UnreservedBandwidth.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/UnreservedBandwidth.java
index 7ba34f0..94db6bb 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/UnreservedBandwidth.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/UnreservedBandwidth.java
@@ -50,7 +50,7 @@
     }
 
     /**
-     * Gets list of un reserved bandwidth .
+     * Returns list of un reserved bandwidth .
      *
      * @return List of un reserved bandwidth
      */
@@ -71,7 +71,7 @@
     }
 
     /**
-     * Gets instance as byte array.
+     * Returns instance as byte array.
      *
      * @return instance as byte array
      */
@@ -86,7 +86,7 @@
     }
 
     /**
-     * Gets unreserved bandwidth as byte array.
+     * Returns unreserved bandwidth as byte array.
      *
      * @return unreserved bandwidth as byte array
      */
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/ChecksumCalculator.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/ChecksumCalculator.java
index d6b91f9..31f75b4 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/ChecksumCalculator.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/ChecksumCalculator.java
@@ -32,6 +32,7 @@
      * @return true if valid else false
      */
     public boolean validateLspCheckSum(byte[] lspPacket, int lspChecksumPos1, int lspChecksumPos2) {
+
         byte[] checksum = calculateLspChecksum(lspPacket, lspChecksumPos1, lspChecksumPos2);
         if (lspPacket[lspChecksumPos1] == checksum[0] && lspPacket[lspChecksumPos2] == checksum[1]) {
             return true;
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisConfig.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisConfig.java
new file mode 100644
index 0000000..9b37cbd
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisConfig.java
@@ -0,0 +1,44 @@
+/*
+ * 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.fasterxml.jackson.databind.JsonNode;
+
+/**
+ * Representation of ISIS config.
+ */
+public enum IsisConfig {
+    INSTANCE;
+    private JsonNode jsonNodes = null;
+
+    /**
+     * Returns the config value.
+     *
+     * @return jsonNodes json node
+     */
+    public JsonNode config() {
+        return jsonNodes;
+    }
+
+    /**
+     * Sets the config value for jsonNode.
+     *
+     * @param jsonNodes json node
+     */
+    public void setConfig(JsonNode jsonNodes) {
+        this.jsonNodes = jsonNodes;
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisConstants.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisConstants.java
index 53ef74b..fe84218 100644
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisConstants.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisConstants.java
@@ -17,7 +17,7 @@
 package org.onosproject.isis.io.util;
 
 /**
- * Representation of ISIS constants.
+ * Representation of ISIS Constants.
  */
 public final class IsisConstants {
     public static final char PDU_LENGTH = 1497; // mtu (1500) - (3) LLC
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
index 318eb1b..44ad9e0 100644
--- 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
@@ -17,7 +17,20 @@
 
 import com.google.common.primitives.Bytes;
 import org.onlab.packet.Ip4Address;
+import org.onlab.packet.MacAddress;
+import org.onosproject.isis.controller.IsisInterface;
+import org.onosproject.isis.controller.IsisInterfaceState;
+import org.onosproject.isis.controller.IsisNeighbor;
+import org.onosproject.isis.controller.IsisPduType;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+import org.onosproject.isis.io.isispacket.pdu.L1L2HelloPdu;
+import org.onosproject.isis.io.isispacket.pdu.P2PHelloPdu;
+import org.onosproject.isis.io.isispacket.tlv.AdjacencyStateTlv;
+import org.onosproject.isis.io.isispacket.tlv.AreaAddressTlv;
+import org.onosproject.isis.io.isispacket.tlv.IpInterfaceAddressTlv;
+import org.onosproject.isis.io.isispacket.tlv.IsisNeighborTlv;
 import org.onosproject.isis.io.isispacket.tlv.PaddingTlv;
+import org.onosproject.isis.io.isispacket.tlv.ProtocolSupportedTlv;
 import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
 import org.onosproject.isis.io.isispacket.tlv.TlvType;
 import org.slf4j.Logger;
@@ -26,6 +39,7 @@
 import javax.xml.bind.DatatypeConverter;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 import java.util.StringTokenizer;
 
 /**
@@ -37,6 +51,7 @@
     public static final int ID_PLUS_ONE_BYTE = 7;
     public static final int ID_PLUS_TWO_BYTE = 8;
     public static final int THREE_BYTES = 3;
+    public static final int TWO_BYTES = 2;
     public static final int SIX_BYTES = 6;
     public static final int EIGHT_BYTES = 8;
     public static final int FOUR_BYTES = 4;
@@ -103,17 +118,23 @@
      * @return systemIdPlus system ID
      */
     public static String systemIdPlus(byte[] bytes) {
+        int count = 1;
         String systemId = "";
         for (Byte byt : bytes) {
             String hexa = Integer.toHexString(Byte.toUnsignedInt(byt));
             if (hexa.length() % 2 != 0) {
                 hexa = "0" + hexa;
             }
-            systemId = systemId + hexa;
+            if (count == 7 && bytes.length == 8) {
+                systemId = systemId + hexa + "-";
+            } else {
+                systemId = systemId + hexa;
+            }
             if (systemId.length() == 4 || systemId.length() == 9
                     || systemId.length() == 14) {
                 systemId = systemId + ".";
             }
+            count++;
         }
         return systemId;
     }
@@ -154,6 +175,38 @@
     }
 
     /**
+     * Returns PDU headaer length.
+     *
+     * @param pduType PDU type
+     * @return headerLength header length
+     */
+    public static int getPduHeaderLength(int pduType) {
+        int headerLength = 0;
+        switch (IsisPduType.get(pduType)) {
+            case L1HELLOPDU:
+            case L2HELLOPDU:
+            case L1LSPDU:
+            case L2LSPDU:
+                headerLength = IsisConstants.HELLOHEADERLENGTH;
+                break;
+            case P2PHELLOPDU:
+                headerLength = IsisConstants.P2PHELLOHEADERLENGTH;
+                break;
+            case L1PSNP:
+            case L2PSNP:
+                headerLength = IsisConstants.PSNPDUHEADERLENGTH;
+                break;
+            case L1CSNP:
+            case L2CSNP:
+                headerLength = IsisConstants.CSNPDUHEADERLENGTH;
+                break;
+            default:
+                break;
+        }
+        return headerLength;
+    }
+
+    /**
      * Adds the PDU length in packet.
      *
      * @param isisPacket      ISIS packet
@@ -186,7 +239,7 @@
      */
     public static byte[] addChecksum(byte[] isisPacket, int checksumBytePos1, int checksumBytePos2) {
         //Set the checksum for the packet
-        //Convert the lenth to two bytes as the length field is 2 bytes
+        //Convert the length to two bytes as the length field is 2 bytes
         byte[] checksumInTwoBytes = new ChecksumCalculator().calculateLspChecksum(
                 isisPacket, checksumBytePos1, checksumBytePos2);
         //isis header 3rd and 4th position represents length
@@ -296,7 +349,6 @@
      * @return numInBytes given number as bytes
      */
     public static byte[] convertToFourBytes(int numberToConvert) {
-
         byte[] numInBytes = new byte[4];
         String s1 = Integer.toHexString(numberToConvert);
         if (s1.length() % 2 != 0) {
@@ -328,6 +380,168 @@
     }
 
     /**
+     * Returns the P2P hello PDU.
+     *
+     * @param isisInterface  ISIS interface instance
+     * @param paddingEnabled padding enabled or not
+     * @return hello PDU
+     */
+    public static byte[] getP2pHelloPdu(IsisInterface isisInterface, boolean paddingEnabled) {
+        IsisHeader isisHeader = new IsisHeader();
+        isisHeader.setIrpDiscriminator((byte) IsisConstants.IRPDISCRIMINATOR);
+        isisHeader.setPduHeaderLength((byte) IsisConstants.P2PHELLOHEADERLENGTH);
+        isisHeader.setVersion((byte) IsisConstants.ISISVERSION);
+        isisHeader.setIdLength((byte) IsisConstants.IDLENGTH);
+        isisHeader.setIsisPduType(IsisPduType.P2PHELLOPDU.value());
+        isisHeader.setVersion2((byte) IsisConstants.ISISVERSION);
+        //isisHeader.setReserved((byte) IsisConstants.RESERVED);
+        isisHeader.setReserved((byte) IsisConstants.PDULENGTHPOSITION);
+        isisHeader.setMaximumAreaAddresses((byte) IsisConstants.MAXAREAADDRESS);
+        P2PHelloPdu p2pHelloPdu = new P2PHelloPdu(isisHeader);
+        p2pHelloPdu.setCircuitType((byte) isisInterface.reservedPacketCircuitType());
+        p2pHelloPdu.setSourceId(isisInterface.systemId());
+        p2pHelloPdu.setHoldingTime(isisInterface.holdingTime());
+        p2pHelloPdu.setPduLength(IsisConstants.PDU_LENGTH);
+        p2pHelloPdu.setLocalCircuitId((byte) IsisConstants.LOCALCIRCUITIDFORP2P);
+
+        TlvHeader tlvHeader = new TlvHeader();
+        tlvHeader.setTlvType(TlvType.AREAADDRESS.value());
+        tlvHeader.setTlvLength(0);
+        AreaAddressTlv areaAddressTlv = new AreaAddressTlv(tlvHeader);
+        areaAddressTlv.addAddress(isisInterface.areaAddress());
+        p2pHelloPdu.addTlv(areaAddressTlv);
+
+        tlvHeader.setTlvType(TlvType.PROTOCOLSUPPORTED.value());
+        tlvHeader.setTlvLength(0);
+        ProtocolSupportedTlv protocolSupportedTlv = new ProtocolSupportedTlv(tlvHeader);
+        protocolSupportedTlv.addProtocolSupported((byte) IsisConstants.PROTOCOLSUPPORTED);
+        p2pHelloPdu.addTlv(protocolSupportedTlv);
+
+        tlvHeader.setTlvType(TlvType.ADJACENCYSTATE.value());
+        tlvHeader.setTlvLength(0);
+        AdjacencyStateTlv adjacencyStateTlv = new AdjacencyStateTlv(tlvHeader);
+        adjacencyStateTlv.setAdjacencyType((byte) IsisInterfaceState.DOWN.value());
+        adjacencyStateTlv.setLocalCircuitId(Integer.parseInt(isisInterface.circuitId()));
+        Set<MacAddress> neighbors = isisInterface.neighbors();
+        if (neighbors.size() > 0) {
+            IsisNeighbor neighbor = isisInterface.lookup(neighbors.iterator().next());
+            adjacencyStateTlv.setAdjacencyType((byte) neighbor.interfaceState().value());
+            adjacencyStateTlv.setNeighborSystemId(neighbor.neighborSystemId());
+            adjacencyStateTlv.setNeighborLocalCircuitId(neighbor.localExtendedCircuitId());
+        }
+        p2pHelloPdu.addTlv(adjacencyStateTlv);
+
+        tlvHeader.setTlvType(TlvType.IPINTERFACEADDRESS.value());
+        tlvHeader.setTlvLength(0);
+        IpInterfaceAddressTlv ipInterfaceAddressTlv = new IpInterfaceAddressTlv(tlvHeader);
+        ipInterfaceAddressTlv.addInterfaceAddres(isisInterface.interfaceIpAddress());
+        p2pHelloPdu.addTlv(ipInterfaceAddressTlv);
+
+        byte[] beforePadding = p2pHelloPdu.asBytes();
+        byte[] helloMessage;
+        if (paddingEnabled) {
+            byte[] paddingTlvs = getPaddingTlvs(beforePadding.length);
+            helloMessage = Bytes.concat(beforePadding, paddingTlvs);
+        } else {
+            helloMessage = beforePadding;
+        }
+        return helloMessage;
+    }
+
+    /**
+     * Returns the L1 hello PDU.
+     *
+     * @param isisInterface  ISIS interface instance
+     * @param paddingEnabled padding enabled or not
+     * @return helloMessage hello PDU
+     */
+    public static byte[] getL1HelloPdu(IsisInterface isisInterface, boolean paddingEnabled) {
+        return getL1OrL2HelloPdu(isisInterface, IsisPduType.L1HELLOPDU, paddingEnabled);
+    }
+
+    /**
+     * Returns the L2 hello PDU.
+     *
+     * @param isisInterface  ISIS interface instance
+     * @param paddingEnabled padding enabled or not
+     * @return helloMessage hello PDU
+     */
+    public static byte[] getL2HelloPdu(IsisInterface isisInterface, boolean paddingEnabled) {
+        return getL1OrL2HelloPdu(isisInterface, IsisPduType.L2HELLOPDU, paddingEnabled);
+    }
+
+    /**
+     * Returns the hello PDU.
+     *
+     * @param isisInterface  ISIS interface instance
+     * @param paddingEnabled padding enabled or not
+     * @return helloMessage hello PDU
+     */
+    private static byte[] getL1OrL2HelloPdu(IsisInterface isisInterface, IsisPduType isisPduType,
+                                            boolean paddingEnabled) {
+        String lanId = "";
+        IsisHeader isisHeader = new IsisHeader();
+        isisHeader.setIrpDiscriminator((byte) IsisConstants.IRPDISCRIMINATOR);
+        isisHeader.setPduHeaderLength((byte) IsisConstants.HELLOHEADERLENGTH);
+        isisHeader.setVersion((byte) IsisConstants.ISISVERSION);
+        isisHeader.setIdLength((byte) IsisConstants.IDLENGTH);
+        if (isisPduType == IsisPduType.L1HELLOPDU) {
+            isisHeader.setIsisPduType(IsisPduType.L1HELLOPDU.value());
+            lanId = isisInterface.l1LanId();
+        } else if (isisPduType == IsisPduType.L2HELLOPDU) {
+            isisHeader.setIsisPduType(IsisPduType.L2HELLOPDU.value());
+            lanId = isisInterface.l2LanId();
+        }
+        isisHeader.setVersion2((byte) IsisConstants.ISISVERSION);
+        isisHeader.setReserved((byte) IsisConstants.PDULENGTHPOSITION);
+        isisHeader.setMaximumAreaAddresses((byte) IsisConstants.MAXAREAADDRESS);
+        L1L2HelloPdu l1L2HelloPdu = new L1L2HelloPdu(isisHeader);
+        l1L2HelloPdu.setCircuitType((byte) isisInterface.reservedPacketCircuitType());
+        l1L2HelloPdu.setSourceId(isisInterface.systemId());
+        l1L2HelloPdu.setHoldingTime(isisInterface.holdingTime());
+        l1L2HelloPdu.setPduLength(IsisConstants.PDU_LENGTH);
+        l1L2HelloPdu.setPriority((byte) isisInterface.priority());
+        l1L2HelloPdu.setLanId(lanId);
+        TlvHeader tlvHeader = new TlvHeader();
+        tlvHeader.setTlvType(TlvType.AREAADDRESS.value());
+        tlvHeader.setTlvLength(0);
+        AreaAddressTlv areaAddressTlv = new AreaAddressTlv(tlvHeader);
+        areaAddressTlv.addAddress(isisInterface.areaAddress());
+        l1L2HelloPdu.addTlv(areaAddressTlv);
+        Set<MacAddress> neighbors = isisInterface.neighbors();
+        if (neighbors.size() > 0) {
+            tlvHeader.setTlvType(TlvType.ISNEIGHBORS.value());
+            tlvHeader.setTlvLength(0);
+            IsisNeighborTlv isisNeighborTlv = new IsisNeighborTlv(tlvHeader);
+            for (MacAddress neighbor : neighbors) {
+                isisNeighborTlv.addNeighbor(neighbor);
+            }
+            l1L2HelloPdu.addTlv(isisNeighborTlv);
+        }
+        tlvHeader.setTlvType(TlvType.PROTOCOLSUPPORTED.value());
+        tlvHeader.setTlvLength(0);
+        ProtocolSupportedTlv protocolSupportedTlv = new ProtocolSupportedTlv(tlvHeader);
+        protocolSupportedTlv.addProtocolSupported((byte) IsisConstants.PROTOCOLSUPPORTED);
+        l1L2HelloPdu.addTlv(protocolSupportedTlv);
+
+        tlvHeader.setTlvType(TlvType.IPINTERFACEADDRESS.value());
+        tlvHeader.setTlvLength(0);
+        IpInterfaceAddressTlv ipInterfaceAddressTlv = new IpInterfaceAddressTlv(tlvHeader);
+        ipInterfaceAddressTlv.addInterfaceAddres(isisInterface.interfaceIpAddress());
+        l1L2HelloPdu.addTlv(ipInterfaceAddressTlv);
+
+        byte[] beforePadding = l1L2HelloPdu.asBytes();
+        byte[] helloMessage;
+        if (paddingEnabled) {
+            byte[] paddingTlvs = getPaddingTlvs(beforePadding.length);
+            helloMessage = Bytes.concat(beforePadding, paddingTlvs);
+        } else {
+            helloMessage = beforePadding;
+        }
+        return helloMessage;
+    }
+
+    /**
      * Converts a byte to integer variable.
      *
      * @param bytesToConvert bytes to convert
@@ -461,4 +675,22 @@
         }
         return numInBytes;
     }
-}
+
+    /**
+     * Converts the bytes of prefix to string type value.
+     *
+     * @param bytes array of prefix
+     * @return string value of prefix
+     */
+    public static String prefixConversion(byte[] bytes) {
+        String prefix = "";
+        for (int i = 0; i < bytes.length; i++) {
+            if (i < (bytes.length - 1)) {
+                prefix = prefix + bytes[i] + ".";
+            } else {
+                prefix = prefix + bytes[i];
+            }
+        }
+        return prefix;
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/LspGenerator.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/LspGenerator.java
new file mode 100644
index 0000000..1dfb1a4
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/LspGenerator.java
@@ -0,0 +1,159 @@
+/*
+ * 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.onlab.packet.Ip4Address;
+import org.onlab.packet.MacAddress;
+import org.onosproject.isis.controller.IsisInterface;
+import org.onosproject.isis.controller.IsisNeighbor;
+import org.onosproject.isis.controller.IsisNetworkType;
+import org.onosproject.isis.controller.IsisPduType;
+import org.onosproject.isis.io.isispacket.IsisHeader;
+import org.onosproject.isis.io.isispacket.pdu.AttachedToOtherAreas;
+import org.onosproject.isis.io.isispacket.pdu.LsPdu;
+import org.onosproject.isis.io.isispacket.tlv.AreaAddressTlv;
+import org.onosproject.isis.io.isispacket.tlv.HostNameTlv;
+import org.onosproject.isis.io.isispacket.tlv.IpInterfaceAddressTlv;
+import org.onosproject.isis.io.isispacket.tlv.IpInternalReachabilityTlv;
+import org.onosproject.isis.io.isispacket.tlv.IsReachabilityTlv;
+import org.onosproject.isis.io.isispacket.tlv.MetricOfInternalReachability;
+import org.onosproject.isis.io.isispacket.tlv.MetricsOfReachability;
+import org.onosproject.isis.io.isispacket.tlv.ProtocolSupportedTlv;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+import org.onosproject.isis.io.isispacket.tlv.TlvType;
+
+import java.util.List;
+
+/**
+ * Representation of link state PDU generator.
+ */
+public class LspGenerator {
+
+    public LsPdu getLsp(IsisInterface isisInterface, String lspId, IsisPduType isisPduType,
+                        List<Ip4Address> allConfiguredInterfaceIps) {
+        IsisHeader header = getHeader(isisPduType);
+        LsPdu lsp = new LsPdu(header);
+
+        lsp.setPduLength(0);
+        lsp.setRemainingLifeTime(IsisConstants.LSPMAXAGE);
+        lsp.setLspId(lspId);
+        lsp.setSequenceNumber(isisInterface.isisLsdb().lsSequenceNumber(isisPduType));
+        lsp.setCheckSum(0);
+        if (isisPduType == IsisPduType.L1LSPDU) {
+            lsp.setTypeBlock((byte) 1);
+            lsp.setIntermediateSystemType((byte) 1);
+        } else if (isisPduType == IsisPduType.L2LSPDU) {
+            lsp.setTypeBlock((byte) 3);
+            lsp.setIntermediateSystemType((byte) 3);
+        }
+        lsp.setAttachedToOtherAreas(AttachedToOtherAreas.NONE);
+        lsp.setPartitionRepair(false);
+        lsp.setLspDbol(false);
+
+        TlvHeader tlvHeader = new TlvHeader();
+        tlvHeader.setTlvType(TlvType.AREAADDRESS.value());
+        tlvHeader.setTlvLength(0);
+        AreaAddressTlv areaAddressTlv = new AreaAddressTlv(tlvHeader);
+        areaAddressTlv.addAddress(isisInterface.areaAddress());
+        lsp.addTlv(areaAddressTlv);
+
+        tlvHeader.setTlvType(TlvType.PROTOCOLSUPPORTED.value());
+        tlvHeader.setTlvLength(0);
+        ProtocolSupportedTlv protocolSupportedTlv = new ProtocolSupportedTlv(tlvHeader);
+        protocolSupportedTlv.addProtocolSupported((byte) IsisConstants.PROTOCOLSUPPORTED);
+        lsp.addTlv(protocolSupportedTlv);
+
+        tlvHeader.setTlvType(TlvType.IPINTERFACEADDRESS.value());
+        tlvHeader.setTlvLength(0);
+        IpInterfaceAddressTlv ipInterfaceAddressTlv = new IpInterfaceAddressTlv(tlvHeader);
+        for (Ip4Address ipaddress : allConfiguredInterfaceIps) {
+            ipInterfaceAddressTlv.addInterfaceAddres(ipaddress);
+        }
+        lsp.addTlv(ipInterfaceAddressTlv);
+
+        tlvHeader.setTlvType(TlvType.HOSTNAME.value());
+        tlvHeader.setTlvLength(0);
+        HostNameTlv hostNameTlv = new HostNameTlv(tlvHeader);
+        hostNameTlv.setHostName(isisInterface.intermediateSystemName());
+        lsp.addTlv(hostNameTlv);
+
+        tlvHeader.setTlvType(TlvType.ISREACHABILITY.value());
+        tlvHeader.setTlvLength(0);
+        IsReachabilityTlv isReachabilityTlv = new IsReachabilityTlv(tlvHeader);
+        isReachabilityTlv.setReserved(0);
+        MetricsOfReachability metricsOfReachability = new MetricsOfReachability();
+        metricsOfReachability.setDefaultMetric((byte) 10);
+        metricsOfReachability.setDefaultIsInternal(true);
+        metricsOfReachability.setDelayMetric((byte) 10);
+        metricsOfReachability.setDelayIsInternal(true);
+        metricsOfReachability.setDelayMetricSupported(true);
+        metricsOfReachability.setExpenseMetric((byte) 10);
+        metricsOfReachability.setExpenseIsInternal(true);
+        metricsOfReachability.setExpenseMetricSupported(true);
+        metricsOfReachability.setErrorMetric((byte) 10);
+        metricsOfReachability.setErrorIsInternal(true);
+        metricsOfReachability.setErrorMetricSupported(true);
+        if (isisInterface.networkType() == IsisNetworkType.BROADCAST) {
+            if (isisPduType == IsisPduType.L1LSPDU) {
+                metricsOfReachability.setNeighborId(isisInterface.l1LanId());
+            } else if (isisPduType == IsisPduType.L2LSPDU) {
+                metricsOfReachability.setNeighborId(isisInterface.l2LanId());
+            }
+        } else if (isisInterface.networkType() == IsisNetworkType.P2P) {
+            MacAddress neighborMac = isisInterface.neighbors().iterator().next();
+            IsisNeighbor neighbor = isisInterface.lookup(neighborMac);
+            metricsOfReachability.setNeighborId(neighbor.neighborSystemId());
+        }
+
+        isReachabilityTlv.addMeticsOfReachability(metricsOfReachability);
+        lsp.addTlv(isReachabilityTlv);
+
+        tlvHeader.setTlvType(TlvType.IPINTERNALREACHABILITY.value());
+        tlvHeader.setTlvLength(0);
+        IpInternalReachabilityTlv ipInterReacTlv = new IpInternalReachabilityTlv(tlvHeader);
+        MetricOfInternalReachability metricOfIntRea = new MetricOfInternalReachability();
+        metricOfIntRea.setDefaultMetric((byte) 10);
+        metricOfIntRea.setDefaultIsInternal(true);
+        metricOfIntRea.setDefaultDistributionDown(true);
+        metricOfIntRea.setDelayMetric((byte) 0);
+        metricOfIntRea.setDelayMetricSupported(false);
+        metricOfIntRea.setDelayIsInternal(true);
+        metricOfIntRea.setExpenseMetric((byte) 0);
+        metricOfIntRea.setExpenseMetricSupported(false);
+        metricOfIntRea.setExpenseIsInternal(true);
+        metricOfIntRea.setErrorMetric((byte) 0);
+        metricOfIntRea.setErrorMetricSupported(false);
+        metricOfIntRea.setExpenseIsInternal(true);
+        metricOfIntRea.setIpAddress(isisInterface.interfaceIpAddress());
+        metricOfIntRea.setSubnetAddres(Ip4Address.valueOf(isisInterface.networkMask()));
+        ipInterReacTlv.addInternalReachabilityMetric(metricOfIntRea);
+        lsp.addTlv(ipInterReacTlv);
+        return lsp;
+    }
+
+    public IsisHeader getHeader(IsisPduType pduType) {
+        IsisHeader isisHeader = new IsisHeader();
+        isisHeader.setIrpDiscriminator((byte) IsisConstants.IRPDISCRIMINATOR);
+        isisHeader.setPduHeaderLength((byte) IsisUtil.getPduHeaderLength(pduType.value()));
+        isisHeader.setVersion((byte) IsisConstants.ISISVERSION);
+        isisHeader.setIdLength((byte) IsisConstants.IDLENGTH);
+        isisHeader.setIsisPduType(pduType.value());
+        isisHeader.setVersion2((byte) IsisConstants.ISISVERSION);
+        isisHeader.setReserved((byte) IsisConstants.RESERVED);
+        isisHeader.setMaximumAreaAddresses((byte) IsisConstants.MAXAREAADDRESS);
+        return isisHeader;
+    }
+}
\ No newline at end of file
