diff --git a/protocols/isis/isisio/pom.xml b/protocols/isis/isisio/pom.xml
old mode 100755
new mode 100644
index 651d393..9eda506
--- a/protocols/isis/isisio/pom.xml
+++ b/protocols/isis/isisio/pom.xml
@@ -37,7 +37,7 @@
         </dependency>
         <dependency>
             <groupId>io.netty</groupId>
-            <artifactId>netty-buffer</artifactId>
+            <artifactId>netty</artifactId>
         </dependency>
         <dependency>
             <groupId>org.easymock</groupId>
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/IsisConstantParameters.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/IsisConstantParameters.java
deleted file mode 100755
index b09e7b5..0000000
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/IsisConstantParameters.java
+++ /dev/null
@@ -1,41 +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;
-
-/**
- * Represents ISIS constant parameters.
- */
-public final class IsisConstantParameters {
-
-    public static final int IRPDISCRIMINATOR = 131;
-    public static final int PROOCOLID = 1;
-    public static final int VERSION = 1;
-    public static final int RESERVED = 0;
-    public static final int MAXAREAADDRESS = 3;
-    public static final int IDLENGTH = 6;
-    public static final int PROTOCOLSUPPORTED = 6;
-    public static final int PACKETMINIMUMLENGTH = 27;
-    public static final int PDULENGTHPOSITION = 17;
-    public static final int PDUHEADERFORREADFROM = 8;
-
-    /**
-     * Creates an instance of this class.
-     */
-    private IsisConstantParameters() {
-
-    }
-}
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/package-info.java
old mode 100755
new mode 100644
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
new file mode 100644
index 0000000..d13841c
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/AdjacencyStateTlv.java
@@ -0,0 +1,164 @@
+/*
+* 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.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of adjacency state TLV of P2P neighbor.
+ */
+public class AdjacencyStateTlv extends TlvHeader implements IsisTlv {
+
+    private byte adjacencyType;
+    private int localCircuitId;
+    private String neighborSystemId;
+    private int neighborLocalCircuitId;
+
+    /**
+     * Creates an instance of adjacency state TLV..
+     *
+     * @param tlvHeader tlvHeader
+     */
+    public AdjacencyStateTlv(TlvHeader tlvHeader) {
+        this.setTlvType(tlvHeader.tlvType());
+        this.setTlvLength(tlvHeader.tlvLength());
+    }
+
+    /**
+     * Returns local circuit ID for adjacency state TLV.
+     *
+     * @return local circuit ID
+     */
+    public int localCircuitId() {
+        return localCircuitId;
+    }
+
+    /**
+     * Sets local circuit ID for adjacency state TLV.
+     *
+     * @param localCircuitId local circuit Id
+     */
+    public void setLocalCircuitId(int localCircuitId) {
+        this.localCircuitId = localCircuitId;
+    }
+
+    /**
+     * Returns neighbor system ID for adjacency state TLV.
+     *
+     * @return neighbor system ID
+     */
+    public String neighborSystemId() {
+        return neighborSystemId;
+    }
+
+    /**
+     * Sets neighbor system ID for adjacency state TLV.
+     *
+     * @param neighborSystemId neighbor system ID
+     */
+    public void setNeighborSystemId(String neighborSystemId) {
+        this.neighborSystemId = neighborSystemId;
+    }
+
+    /**
+     * Returns neighbor local circuit ID for adjacency state TLV.
+     *
+     * @return neighbor local circuit ID
+     */
+    public int neighborLocalCircuitId() {
+        return neighborLocalCircuitId;
+    }
+
+    /**
+     * Sets neighbor local circuit ID for adjacency state TLV.
+     *
+     * @param neighborLocalCircuitId neighbor local circuit ID
+     */
+    public void setNeighborLocalCircuitId(int neighborLocalCircuitId) {
+        this.neighborLocalCircuitId = neighborLocalCircuitId;
+    }
+
+    /**
+     * Returns adjacency type of adjacency state TLV.
+     *
+     * @return adjacency type
+     */
+    public byte adjacencyType() {
+        return adjacencyType;
+    }
+
+    /**
+     * Sets adjacency type for adjacency state TLV.
+     *
+     * @param adjacencyType adjacency type
+     */
+    public void setAdjacencyType(byte adjacencyType) {
+        this.adjacencyType = adjacencyType;
+    }
+
+    @Override
+    public void readFrom(ChannelBuffer channelBuffer) {
+        this.setAdjacencyType(channelBuffer.readByte());
+        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));
+            this.setNeighborLocalCircuitId(channelBuffer.readInt());
+        }
+    }
+
+    @Override
+    public byte[] asBytes() {
+        byte[] bytes = null;
+        byte[] tlvHeader = tlvHeaderAsByteArray();
+        byte[] tlvBody = tlvBodyAsBytes();
+        tlvHeader[1] = (byte) tlvBody.length;
+        bytes = Bytes.concat(tlvHeader, tlvBody);
+        return bytes;
+    }
+
+    /**
+     * Returns adjacency type TLV body as byte array.
+     *
+     * @return byteArray TLV body of area address TLV
+     */
+    private byte[] tlvBodyAsBytes() {
+        List<Byte> bytes = new ArrayList<>();
+        bytes.add(this.adjacencyType);
+        bytes.addAll(Bytes.asList(IsisUtil.convertToFourBytes(this.localCircuitId)));
+        bytes.addAll(IsisUtil.sourceAndLanIdToBytes(this.neighborSystemId));
+        bytes.addAll(Bytes.asList(IsisUtil.convertToFourBytes(this.neighborLocalCircuitId)));
+        return Bytes.toArray(bytes);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("adjacencyType", adjacencyType)
+                .add("localCircuitId", localCircuitId)
+                .add("neighborSystemId", neighborSystemId)
+                .add("neighborLocalCircuitId", neighborLocalCircuitId)
+                .toString();
+    }
+}
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
old mode 100755
new mode 100644
index add4127..bc24910
--- 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
@@ -13,52 +13,58 @@
  * 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 io.netty.buffer.ByteBuf;
+import org.jboss.netty.buffer.ChannelBuffer;
 import org.onosproject.isis.io.util.IsisUtil;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
- * Represents the area address TLV.
+ * Representation of area address TLV.
  */
 public class AreaAddressTlv extends TlvHeader implements IsisTlv {
 
-    private List<String> areaAddress = new ArrayList();
+    private List<String> areaAddress = new ArrayList<>();
 
     /**
-     * Sets TLV type and TLV length of area address TLV.
+     * Creates an instance of area address TLV.
      *
-     * @param tlvHeader tlvHeader.
+     * @param tlvHeader tlvHeader
      */
     public AreaAddressTlv(TlvHeader tlvHeader) {
-
         this.setTlvType(tlvHeader.tlvType());
         this.setTlvLength(tlvHeader.tlvLength());
-
     }
 
     /**
-     * Gets the area address of area address TLV.
+     * Adds the area address to the area address TLV.
      *
-     * @return area address
+     * @param areaAddress area address
+     */
+    public void addAddress(String areaAddress) {
+        this.areaAddress.add(areaAddress);
+    }
+
+    /**
+     * Returns the area address of area address TLV.
+     *
+     * @return areaAddress area address
      */
     public List<String> areaAddress() {
         return this.areaAddress;
     }
 
     @Override
-    public void readFrom(ByteBuf byteBuf) {
-        while (byteBuf.readableBytes() > 0) {
-            int addressLength = byteBuf.readByte();
-            byte[] addressBytes = new byte[IsisUtil.THREE_BYTES];
-            byteBuf.readBytes(addressBytes, 0, IsisUtil.THREE_BYTES);
-            String areaAddress = IsisUtil.areaAddres(addressBytes);
+    public void readFrom(ChannelBuffer channelBuffer) {
+        while (channelBuffer.readableBytes() > 0) {
+            int addressLength = channelBuffer.readByte();
+            byte[] addressbytes = new byte[addressLength];
+            channelBuffer.readBytes(addressbytes, 0, addressLength);
+            String areaAddress = IsisUtil.areaAddres(addressbytes);
             this.areaAddress.add(areaAddress);
         }
     }
@@ -66,38 +72,32 @@
     @Override
     public byte[] asBytes() {
         byte[] bytes = null;
-
         byte[] tlvHeader = tlvHeaderAsByteArray();
         byte[] tlvBody = tlvBodyAsBytes();
+        tlvHeader[1] = (byte) tlvBody.length;
         bytes = Bytes.concat(tlvHeader, tlvBody);
-
         return bytes;
     }
 
     /**
-     * Gets TLV body of area address TLV.
+     * Returns TLV body of area address TLV.
      *
      * @return byteArray TLV body of area address TLV
      */
-    public byte[] tlvBodyAsBytes() {
-
-        List<Byte> bytes = new ArrayList();
+    private byte[] tlvBodyAsBytes() {
+        List<Byte> bytes = new ArrayList<>();
         for (String areaAddress : this.areaAddress) {
             bytes.add((byte) (areaAddress.length() / 2));
-            bytes.addAll(IsisUtil.areaAddresToBytes(areaAddress));
+            bytes.addAll(IsisUtil.areaAddressToBytes(areaAddress));
         }
-        byte[] byteArray = new byte[bytes.size()];
-        int i = 0;
-        for (byte byt : bytes) {
-            byteArray[i++] = byt;
-        }
-        return byteArray;
+        return Bytes.toArray(bytes);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
                 .omitNullValues()
+                .add("areaAddress", areaAddress)
                 .toString();
     }
 }
\ No newline at end of file
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
new file mode 100644
index 0000000..82e8099
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/HostNameTlv.java
@@ -0,0 +1,91 @@
+/*
+ * 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;
+
+/**
+ * Representation of host name TLV.
+ */
+public class HostNameTlv extends TlvHeader {
+    private String hostName;
+
+    /**
+     * Creates an instance of host name TLV.
+     *
+     * @param tlvHeader tlvHeader.
+     */
+    public HostNameTlv(TlvHeader tlvHeader) {
+        this.setTlvType(tlvHeader.tlvType());
+        this.setTlvLength(tlvHeader.tlvLength());
+
+    }
+
+    /**
+     * Returns host name of host name TLV.
+     *
+     * @return host name
+     */
+    public String hostName() {
+        return hostName;
+    }
+
+    /**
+     * Sets host name for host name TLV.
+     *
+     * @param hostName host name.
+     */
+    public void setHostName(String hostName) {
+        this.hostName = hostName;
+    }
+
+    @Override
+    public void readFrom(ChannelBuffer channelBuffer) {
+        byte[] addressbytes = new byte[this.tlvLength()];
+        channelBuffer.readBytes(addressbytes, 0, this.tlvLength());
+        this.hostName = new String(addressbytes);
+    }
+
+    @Override
+    public byte[] asBytes() {
+        byte[] bytes = null;
+        byte[] tlvHeader = tlvHeaderAsByteArray();
+        byte[] tlvBody = tlvBodyAsBytes();
+        tlvHeader[1] = (byte) tlvBody.length;
+        bytes = Bytes.concat(tlvHeader, tlvBody);
+        return bytes;
+    }
+
+    /**
+     * Returns TLV body of host name TLV.
+     *
+     * @return byteArray TLV body of host name TLV
+     */
+    private byte[] tlvBodyAsBytes() {
+        byte[] bytes = this.hostName.getBytes();
+        return bytes;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("hostName", hostName)
+                .toString();
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..b16a54d
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IdrpInformationTlv.java
@@ -0,0 +1,95 @@
+/*
+ * 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 org.jboss.netty.buffer.ChannelBuffer;
+
+/**
+ * Representation of IDRP information TLV.
+ */
+public class IdrpInformationTlv extends TlvHeader implements IsisTlv {
+
+    private byte irdpInformationType;
+    private int externalInformation;
+
+    /**
+     * Creates an instance of IDRP information TLV.
+     *
+     * @param tlvHeader tlvHeader
+     */
+    public IdrpInformationTlv(TlvHeader tlvHeader) {
+        this.setTlvType(tlvHeader.tlvType());
+        this.setTlvLength(tlvHeader.tlvLength());
+    }
+
+    /**
+     * Returns the external information of IDRP information TLV.
+     *
+     * @return external information
+     */
+    public int externalInformation() {
+        return externalInformation;
+    }
+
+    /**
+     * Sets the external information for IDRP information TLV.
+     *
+     * @param externalInformation external information
+     */
+    public void setExternalInformation(int externalInformation) {
+        this.externalInformation = externalInformation;
+    }
+
+    /**
+     * Returns the IDRP information of IDRP information TLV.
+     *
+     * @return IDRP information type
+     */
+    public byte irdpInformationType() {
+        return irdpInformationType;
+    }
+
+    /**
+     * Sets the IDRP information for IDRP information TLV.
+     *
+     * @param irdpInformationType IDRP information type
+     */
+    public void setIrdpInformationType(byte irdpInformationType) {
+        this.irdpInformationType = irdpInformationType;
+    }
+
+    @Override
+    public void readFrom(ChannelBuffer channelBuffer) {
+        //TODO
+    }
+
+
+    @Override
+    public byte[] asBytes() {
+        //TODO
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("externalInformation", externalInformation)
+                .add("irdpInformationType", irdpInformationType)
+                .toString();
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..7acb9c8
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpExtendedReachabilityTlv.java
@@ -0,0 +1,167 @@
+/*
+ * 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 extended reachability TLV.
+ */
+public class IpExtendedReachabilityTlv extends TlvHeader implements IsisTlv {
+
+    private String sysIdAndPseudoNumber;
+    private int defaultMetric;
+    private byte subTlvLength;
+    private List<TrafficEngineeringSubTlv> trafEnginSubTlv = new ArrayList<>();
+
+    /**
+     * Creates an instance of IP external reachability TLV.
+     *
+     * @param tlvHeader tlvHeader
+     */
+    public IpExtendedReachabilityTlv(TlvHeader tlvHeader) {
+        this.setTlvType(tlvHeader.tlvType());
+        this.setTlvLength(tlvHeader.tlvLength());
+    }
+
+    /**
+     * Returns the system ID and pseudo number of IP external reachability TLV.
+     *
+     * @return sysIdAndPseudoNumber system ID and pseudo number
+     */
+    public String sysIdAndPseudoNumber() {
+        return sysIdAndPseudoNumber;
+    }
+
+    /**
+     * Sets 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);
+    }
+
+    /**
+     * Returns 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;
+    }
+
+    /**
+     * Returns 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;
+    }
+
+    /**
+     * Returns TLV body of IP external reachability TLV.
+     *
+     * @return byteArray TLV body of IP external reachability TLV.
+     */
+    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));
+        }
+        return Bytes.toArray(bodyLst);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("sysIdAndPseudoNumber", sysIdAndPseudoNumber)
+                .add("defaultMetric", defaultMetric)
+                .add("subTlvLength", subTlvLength)
+                .add("trafEnginSubTlv", trafEnginSubTlv)
+                .toString();
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..e050017
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpExternalReachabilityTlv.java
@@ -0,0 +1,166 @@
+/*
+ * 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
old mode 100755
new mode 100644
index 57dcd32..f372a6b
--- 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
@@ -17,7 +17,7 @@
 
 import com.google.common.base.MoreObjects;
 import com.google.common.primitives.Bytes;
-import io.netty.buffer.ByteBuf;
+import org.jboss.netty.buffer.ChannelBuffer;
 import org.onlab.packet.Ip4Address;
 import org.onosproject.isis.io.util.IsisUtil;
 
@@ -25,13 +25,14 @@
 import java.util.List;
 
 /**
- * Represents IP interface address TLV.
+ * Representation of IP interface address TLV.
  */
 public class IpInterfaceAddressTlv extends TlvHeader implements IsisTlv {
-    private List<Ip4Address> interfaceAddress = new ArrayList();
+
+    private List<Ip4Address> interfaceAddress = new ArrayList<>();
 
     /**
-     * Sets TLV type and TLV length of IP interface address TLV.
+     * Creates an instance of IP interface address TLV.
      *
      * @param tlvHeader tlvHeader.
      */
@@ -43,58 +44,60 @@
     }
 
     /**
-     * Gets interface address of interface address TLV.
+     * Adds the interface address to IP interface address TLV.
      *
-     * @return interfaceAddress interface address
+     * @param interfaceAddress interface address
+     */
+    public void addInterfaceAddres(Ip4Address interfaceAddress) {
+        this.interfaceAddress.add(interfaceAddress);
+    }
+
+    /**
+     * Returns the interface address of IP interface address TLV.
+     *
+     * @return interface address
      */
     public List<Ip4Address> interfaceAddress() {
         return interfaceAddress;
     }
 
     @Override
-    public void readFrom(ByteBuf byteBuf) {
-        while (byteBuf.readableBytes() >= 4) {
+    public void readFrom(ChannelBuffer channelBuffer) {
+        while (channelBuffer.readableBytes() >= 4) {
             byte[] addressbytes = new byte[IsisUtil.FOUR_BYTES];
-            byteBuf.readBytes(addressbytes, 0, IsisUtil.FOUR_BYTES);
+            channelBuffer.readBytes(addressbytes, 0, IsisUtil.FOUR_BYTES);
             this.interfaceAddress.add(Ip4Address.valueOf(addressbytes));
         }
-
     }
 
     @Override
     public byte[] asBytes() {
         byte[] bytes = null;
-
         byte[] tlvHeader = tlvHeaderAsByteArray();
         byte[] tlvBody = tlvBodyAsBytes();
+        tlvHeader[1] = (byte) tlvBody.length;
         bytes = Bytes.concat(tlvHeader, tlvBody);
-
         return bytes;
     }
 
     /**
-     * Gets TLV body of interface address TLV.
+     * Returns TLV body of IP interface address TLV.
      *
-     * @return byteArray TLV body of interface address TLV.
+     * @return byteArray TLV body of IP interface address TLV
      */
-    public byte[] tlvBodyAsBytes() {
-
-        List<Byte> bytes = new ArrayList();
+    private byte[] tlvBodyAsBytes() {
+        List<Byte> bytes = new ArrayList<>();
         for (Ip4Address ip4Address : this.interfaceAddress) {
             bytes.addAll(Bytes.asList(ip4Address.toOctets()));
         }
-        byte[] byteArray = new byte[bytes.size()];
-        int i = 0;
-        for (byte byt : bytes) {
-            byteArray[i++] = byt;
-        }
-        return byteArray;
+        return Bytes.toArray(bytes);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
                 .omitNullValues()
+                .add("interfaceAddress", interfaceAddress)
                 .toString();
     }
 }
\ No newline at end of file
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
new file mode 100644
index 0000000..fd92e1c
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IpInternalReachabilityTlv.java
@@ -0,0 +1,90 @@
+/*
+ * 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 java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of IP internal reachability TLV.
+ */
+public class IpInternalReachabilityTlv extends TlvHeader implements IsisTlv {
+    private List<MetricOfInternalReachability> metricOfInternalReachability = new ArrayList<>();
+
+    /**
+     * Creates an instance of IP internal reachability TLV.
+     *
+     * @param tlvHeader tlvHeader.
+     */
+    public IpInternalReachabilityTlv(TlvHeader tlvHeader) {
+        this.setTlvType(tlvHeader.tlvType());
+        this.setTlvLength(tlvHeader.tlvLength());
+    }
+
+    /**
+     * Adds the metric of internal reachability to internal reachability TLV.
+     *
+     * @param metricValue metric of internal reachability
+     */
+    public void addInternalReachabilityMetric(MetricOfInternalReachability metricValue) {
+        this.metricOfInternalReachability.add(metricValue);
+    }
+
+    @Override
+    public void readFrom(ChannelBuffer channelBuffer) {
+        while (channelBuffer.readableBytes() > 0) {
+            MetricOfInternalReachability metricOfInternalReachability = new MetricOfInternalReachability();
+            metricOfInternalReachability.readFrom(channelBuffer);
+            this.metricOfInternalReachability.add(metricOfInternalReachability);
+        }
+    }
+
+    @Override
+    public byte[] asBytes() {
+        byte[] bytes = null;
+        byte[] tlvHeader = tlvHeaderAsByteArray();
+        byte[] tlvBody = tlvBodyAsBytes();
+        tlvHeader[1] = (byte) tlvBody.length;
+        bytes = Bytes.concat(tlvHeader, tlvBody);
+        return bytes;
+    }
+
+    /**
+     * Returns TLV body of internal reachability TLV.
+     *
+     * @return byteArray TLV body of area address TLV
+     */
+    private byte[] tlvBodyAsBytes() {
+        List<Byte> bytes = new ArrayList<>();
+        for (MetricOfInternalReachability metricOfInternalReachability :
+                this.metricOfInternalReachability) {
+            bytes.addAll(Bytes.asList(metricOfInternalReachability.asBytes()));
+        }
+        return Bytes.toArray(bytes);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("metricOfInternalReachability", metricOfInternalReachability)
+                .toString();
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..f5e6d43
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsReachabilityTlv.java
@@ -0,0 +1,111 @@
+/*
+ * 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 java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of IS reachability TLV.
+ */
+public class IsReachabilityTlv extends TlvHeader {
+
+    private int reserved;
+    private List<MetricsOfReachability> metricsOfReachabilities = new ArrayList<>();
+
+    /**
+     * Creates an instance of IS reachability TLV.
+     *
+     * @param tlvHeader tlvHeader.
+     */
+    public IsReachabilityTlv(TlvHeader tlvHeader) {
+        this.setTlvType(tlvHeader.tlvType());
+        this.setTlvLength(tlvHeader.tlvLength());
+    }
+
+    /**
+     * Returns the reserved value of IS reachability TLV.
+     *
+     * @return reserved
+     */
+    public int reserved() {
+        return reserved;
+    }
+
+    /**
+     * Sets the reserved value for IS reachability TLV.
+     *
+     * @param reserved reserved
+     */
+    public void setReserved(int reserved) {
+        this.reserved = reserved;
+    }
+
+    /**
+     * Adds the metric of reachability to IS reachability TLV..
+     *
+     * @param metricsOfReachability metric of reachability
+     */
+    public void addMeticsOfReachability(MetricsOfReachability metricsOfReachability) {
+        this.metricsOfReachabilities.add(metricsOfReachability);
+    }
+
+    @Override
+    public void readFrom(ChannelBuffer channelBuffer) {
+        this.setReserved(channelBuffer.readByte());
+        while (channelBuffer.readableBytes() > 0) {
+            MetricsOfReachability metricsOfReachability = new MetricsOfReachability();
+            metricsOfReachability.readFrom(channelBuffer);
+            this.metricsOfReachabilities.add(metricsOfReachability);
+        }
+    }
+
+    @Override
+    public byte[] asBytes() {
+        byte[] bytes = null;
+        byte[] tlvHeader = tlvHeaderAsByteArray();
+        byte[] tlvBody = tlvBodyAsBytes();
+        tlvHeader[1] = (byte) tlvBody.length;
+        bytes = Bytes.concat(tlvHeader, tlvBody);
+        return bytes;
+    }
+
+    /**
+     * Returns TLV body of IS reachability TLV.
+     *
+     * @return byteArray TLV body of area address TLV
+     */
+    private byte[] tlvBodyAsBytes() {
+        List<Byte> bytes = new ArrayList<>();
+        bytes.add((byte) this.reserved());
+        for (MetricsOfReachability metricsOfReachability : this.metricsOfReachabilities) {
+            bytes.addAll(Bytes.asList(metricsOfReachability.asBytes()));
+        }
+        return Bytes.toArray(bytes);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("metricsOfReachabilities", metricsOfReachabilities)
+                .toString();
+    }
+}
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
old mode 100755
new mode 100644
index 2b111d4..573568d
--- 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
@@ -17,7 +17,7 @@
 
 import com.google.common.base.MoreObjects;
 import com.google.common.primitives.Bytes;
-import io.netty.buffer.ByteBuf;
+import org.jboss.netty.buffer.ChannelBuffer;
 import org.onlab.packet.MacAddress;
 import org.onosproject.isis.io.util.IsisUtil;
 
@@ -25,78 +25,77 @@
 import java.util.List;
 
 /**
- * Represents ISIS neighbor TLV.
+ * Representation of  ISIS neighbor TLV.
  */
 public class IsisNeighborTlv extends TlvHeader implements IsisTlv {
 
-    private List<MacAddress> neighbor = new ArrayList();
+    private List<MacAddress> neighbor = new ArrayList<>();
 
     /**
-     * Sets TLV type and TLV length of ISIS neighbor TLV.
+     * Creates an instance of ISIS neighbor TLV.
      *
-     * @param tlvHeader tlvHeader.
+     * @param tlvHeader tlvHeader
      */
     public IsisNeighborTlv(TlvHeader tlvHeader) {
-
         this.setTlvType(tlvHeader.tlvType());
         this.setTlvLength(tlvHeader.tlvLength());
-
     }
 
     /**
-     * Gets the MAC address of the neighbor TLV.
+     * Adds the MAC address of the neighbor to ISIS neighbor TLV.
      *
-     * @return neighbor MAC address of the neighbor TLV
+     * @param macAddress MAC address
+     */
+    public void addNeighbor(MacAddress macAddress) {
+        neighbor.add(macAddress);
+    }
+
+    /**
+     * Returns the MAC address of the ISIS neighbor TLV.
+     *
+     * @return neighbor
      */
     public List<MacAddress> neighbor() {
         return this.neighbor;
     }
 
     @Override
-    public void readFrom(ByteBuf byteBuf) {
-        while (byteBuf.readableBytes() >= 6) {
+    public void readFrom(ChannelBuffer channelBuffer) {
+        while (channelBuffer.readableBytes() >= 6) {
             byte[] addressbytes = new byte[IsisUtil.SIX_BYTES];
-            byteBuf.readBytes(addressbytes, 0, IsisUtil.SIX_BYTES);
+            channelBuffer.readBytes(addressbytes, 0, IsisUtil.SIX_BYTES);
             this.neighbor.add(MacAddress.valueOf(addressbytes));
         }
-
     }
 
     @Override
     public byte[] asBytes() {
         byte[] bytes = null;
-
         byte[] tlvHeader = tlvHeaderAsByteArray();
         byte[] tlvBody = tlvBodyAsBytes();
+        tlvHeader[1] = (byte) tlvBody.length;
         bytes = Bytes.concat(tlvHeader, tlvBody);
-
         return bytes;
-
     }
 
     /**
-     * Gets TLV body of neighbor TLV.
+     * Returns TLV body of ISIS neighbor TLV.
      *
-     * @return byteArray TLV body of neighbor TLV
+     * @return byteArray TLV body of area address TLV
      */
-    public byte[] tlvBodyAsBytes() {
-
-        List<Byte> bytes = new ArrayList();
+    private byte[] tlvBodyAsBytes() {
+        List<Byte> bytes = new ArrayList<>();
         for (MacAddress macAddress : this.neighbor) {
             bytes.addAll(Bytes.asList(macAddress.toBytes()));
         }
-        byte[] byteArray = new byte[bytes.size()];
-        int i = 0;
-        for (byte byt : bytes) {
-            byteArray[i++] = byt;
-        }
-        return byteArray;
+        return Bytes.toArray(bytes);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
                 .omitNullValues()
+                .add("neighbor", neighbor)
                 .toString();
     }
 }
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisTlv.java
old mode 100755
new mode 100644
index fb47057..bc28735
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisTlv.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/IsisTlv.java
@@ -16,7 +16,7 @@
 package org.onosproject.isis.io.isispacket.tlv;
 
 /**
- * Represents ISIS TLV.
+ * Representation of  ISIS TLV.
  */
 public interface IsisTlv {
 }
\ No newline at end of file
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
new file mode 100644
index 0000000..5cccfa6
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/LspEntriesTlv.java
@@ -0,0 +1,98 @@
+/*
+ * 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 java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of LSP entries TLV.
+ */
+public class LspEntriesTlv extends TlvHeader implements IsisTlv {
+    private List<LspEntry> lspEntryList = new ArrayList<>();
+
+    /**
+     * Creates an instance of LSP entries TLV.
+     *
+     * @param tlvHeader tlvHeader.
+     */
+    public LspEntriesTlv(TlvHeader tlvHeader) {
+        this.setTlvType(tlvHeader.tlvType());
+        this.setTlvLength(tlvHeader.tlvLength());
+    }
+
+    /**
+     * Returns the LSP entry of LSP entries TLV.
+     *
+     * @return LSP entries
+     */
+    public List<LspEntry> lspEntry() {
+        return lspEntryList;
+    }
+
+    /**
+     * Adds the the LSP entry to LSP entries TLV.
+     *
+     * @param lspEntry LSP entry
+     */
+    public void addLspEntry(LspEntry lspEntry) {
+        this.lspEntryList.add(lspEntry);
+    }
+
+    @Override
+    public void readFrom(ChannelBuffer channelBuffer) {
+        while (channelBuffer.readableBytes() >= 16) {
+            LspEntry lspEntry = new LspEntry();
+            lspEntry.readFrom(channelBuffer.readBytes(16));
+            lspEntryList.add(lspEntry);
+        }
+    }
+
+    @Override
+    public byte[] asBytes() {
+        byte[] bytes = null;
+        byte[] tlvHeader = tlvHeaderAsByteArray();
+        byte[] tlvBody = tlvBodyAsBytes();
+        tlvHeader[1] = (byte) tlvBody.length;
+        bytes = Bytes.concat(tlvHeader, tlvBody);
+        return bytes;
+    }
+
+    /**
+     * Returns TLV body of LSP entries TLV.
+     *
+     * @return byteArray TLV body of LSP entries TLV
+     */
+    private byte[] tlvBodyAsBytes() {
+        List<Byte> bytes = new ArrayList<>();
+        for (LspEntry lspEntry : lspEntryList) {
+            bytes.addAll(Bytes.asList(lspEntry.lspEntryAsBytes()));
+        }
+        return Bytes.toArray(bytes);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("lspEntryList", lspEntryList)
+                .toString();
+    }
+}
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
new file mode 100644
index 0000000..184d411
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/LspEntry.java
@@ -0,0 +1,147 @@
+/*
+ * 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.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of LSP entry.
+ */
+public class LspEntry {
+
+    private int lspSequenceNumber;
+    private int lspChecksum;
+    private int remainingTime;
+    private String lspId;
+
+
+    /**
+     * Returns LSP sequence number of LSP entry.
+     *
+     * @return LSP sequence number
+     */
+    public int lspSequenceNumber() {
+        return lspSequenceNumber;
+    }
+
+    /**
+     * Sets LSP sequenceNumber for LSP entry.
+     *
+     * @param lspSequenceNumber lspSequenceNumber.
+     */
+    public void setLspSequenceNumber(int lspSequenceNumber) {
+        this.lspSequenceNumber = lspSequenceNumber;
+    }
+
+    /**
+     * Returns LSP checksum of LSP entry.
+     *
+     * @return LSP checksum
+     */
+    public int lspChecksum() {
+        return lspChecksum;
+    }
+
+    /**
+     * Sets LSP checksum for LSP entry.
+     *
+     * @param lspChecksum LSP checksum
+     */
+    public void setLspChecksum(int lspChecksum) {
+        this.lspChecksum = lspChecksum;
+    }
+
+    /**
+     * Returns remaining time of LSP entry.
+     *
+     * @return remaining time
+     */
+    public int remainingTime() {
+        return remainingTime;
+    }
+
+    /**
+     * Sets remaining time for LSP entry.
+     *
+     * @param remainingTime remaining time
+     */
+    public void setRemainingTime(int remainingTime) {
+        this.remainingTime = remainingTime;
+    }
+
+    /**
+     * Returns LSP ID of LSP entry.
+     *
+     * @return LSP ID
+     */
+    public String lspId() {
+        return lspId;
+    }
+
+    /**
+     * Sets LSP ID for LSp entry.
+     *
+     * @param lspId LSP ID
+     */
+    public void setLspId(String lspId) {
+        this.lspId = lspId;
+    }
+
+    /**
+     * Sets the LSP entry values for  LSP entry from byte buffer.
+     *
+     * @param channelBuffer channel Buffer instance
+     */
+    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);
+        this.setLspId(IsisUtil.systemIdPlus(tempByteArray));
+        this.setLspSequenceNumber(channelBuffer.readInt());
+        this.setLspChecksum(channelBuffer.readUnsignedByte());
+    }
+
+    /**
+     * Returns LSP entry values as bytes of LSP entry.
+     *
+     * @return byteArray LSP entry values as bytes of LSP entry
+     */
+    public byte[] lspEntryAsBytes() {
+        List<Byte> bytes = new ArrayList<>();
+        bytes.addAll(Bytes.asList(IsisUtil.convertToTwoBytes(this.remainingTime())));
+        bytes.addAll(IsisUtil.sourceAndLanIdToBytes(this.lspId()));
+        bytes.addAll(Bytes.asList(IsisUtil.convertToFourBytes(this.lspSequenceNumber())));
+        bytes.addAll(Bytes.asList(IsisUtil.convertToTwoBytes(this.lspChecksum())));
+        return Bytes.toArray(bytes);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("lspSequenceNumber", lspSequenceNumber)
+                .add("lspChecksum", lspChecksum)
+                .add("remainingTime", remainingTime)
+                .add("lspId", lspId)
+                .toString();
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..d133656
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/MetricOfInternalReachability.java
@@ -0,0 +1,455 @@
+/*
+ * 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.onlab.packet.Ip4Address;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of metric of internal reachability.
+ */
+public class MetricOfInternalReachability {
+    private Ip4Address ipAddress;
+    private Ip4Address subnetAddres;
+    private byte defaultMetric;
+    private byte delayMetric;
+    private byte expenseMetric;
+    private byte errorMetric;
+    private boolean delayMetricSupported;
+    private boolean expenseMetricSupported;
+    private boolean errorMetricSupported;
+    private boolean defaultIsInternal;
+    private boolean defaultDistributionDown;
+    private boolean delayIsInternal;
+    private boolean expenseIsInternal;
+    private boolean errorIsInternal;
+
+    /**
+     * Returns the IP address of metric of internal reachability.
+     *
+     * @return ipAddress IP address of metric of internal reachability
+     */
+    public Ip4Address getIpAddress() {
+        return ipAddress;
+    }
+
+    /**
+     * Sets the IP address for metric of internal reachability.
+     *
+     * @param ipAddress ip address
+     */
+    public void setIpAddress(Ip4Address ipAddress) {
+        this.ipAddress = ipAddress;
+    }
+
+    /**
+     * Returns the subnet address of metric of internal reachability.
+     *
+     * @return subnetAddres subnet address of metric of internal reachability
+     */
+    public Ip4Address getSubnetAddres() {
+        return subnetAddres;
+    }
+
+    /**
+     * Sets the subnet address for metric of internal reachability.
+     *
+     * @param subnetAddres subnet address
+     */
+    public void setSubnetAddres(Ip4Address subnetAddres) {
+        this.subnetAddres = subnetAddres;
+    }
+
+    /**
+     * Returns error metric is internal or not.
+     *
+     * @return true if internal else false
+     */
+    public boolean isErrorIsInternal() {
+        return errorIsInternal;
+    }
+
+    /**
+     * Sets error metric is internal or not.
+     *
+     * @param errorIsInternal true if internal else false
+     */
+    public void setErrorIsInternal(boolean errorIsInternal) {
+        this.errorIsInternal = errorIsInternal;
+    }
+
+    /**
+     * Returns expense metric is internal or not.
+     *
+     * @return true if internal else false
+     */
+    public boolean isExpenseIsInternal() {
+        return expenseIsInternal;
+    }
+
+    /**
+     * Sets expense metric is internal or not.
+     *
+     * @param expenseIsInternal true if internal else false
+     */
+    public void setExpenseIsInternal(boolean expenseIsInternal) {
+        this.expenseIsInternal = expenseIsInternal;
+    }
+
+    /**
+     * Returns delays metric is internal or not.
+     *
+     * @return true if internal else false
+     */
+    public boolean isDelayIsInternal() {
+        return delayIsInternal;
+    }
+
+    /**
+     * Sets delay metric is internal or not.
+     *
+     * @param delayIsInternal true if internal else false
+     */
+    public void setDelayIsInternal(boolean delayIsInternal) {
+        this.delayIsInternal = delayIsInternal;
+    }
+
+    /**
+     * Returns is default distribution is up or down.
+     *
+     * @return true if down else false
+     */
+    public boolean isDefaultDistributionDown() {
+        return defaultDistributionDown;
+    }
+
+    /**
+     * Sets default distribution is up or down.
+     *
+     * @param defaultDistributionDown true if down else false
+     */
+    public void setDefaultDistributionDown(boolean defaultDistributionDown) {
+        this.defaultDistributionDown = defaultDistributionDown;
+    }
+
+    /**
+     * Returns is default metric is internal or not.
+     *
+     * @return true if internal else false
+     */
+    public boolean isDefaultIsInternal() {
+        return defaultIsInternal;
+    }
+
+    /**
+     * Sets default metric is internal or not.
+     *
+     * @param defaultIsInternal true is internal else false
+     */
+    public void setDefaultIsInternal(boolean defaultIsInternal) {
+        this.defaultIsInternal = defaultIsInternal;
+    }
+
+    /**
+     * Returns error metric is supported or not.
+     *
+     * @return true if supported else false
+     */
+    public boolean isErrorMetricSupported() {
+        return errorMetricSupported;
+    }
+
+    /**
+     * Sets error metric is supported or not.
+     *
+     * @param errorMetricSupported true if supported else false
+     */
+    public void setErrorMetricSupported(boolean errorMetricSupported) {
+        this.errorMetricSupported = errorMetricSupported;
+    }
+
+    /**
+     * Returns expense metric is supported or not.
+     *
+     * @return true if supported else false
+     */
+    public boolean isExpenseMetricSupported() {
+        return expenseMetricSupported;
+    }
+
+    /**
+     * Sets expense metric is supported or not.
+     *
+     * @param expenseMetricSupported true if supported else false
+     */
+    public void setExpenseMetricSupported(boolean expenseMetricSupported) {
+        this.expenseMetricSupported = expenseMetricSupported;
+    }
+
+    /**
+     * Returns delay metric is supported or not.
+     *
+     * @return true if supported else false
+     */
+    public boolean isDelayMetricSupported() {
+        return delayMetricSupported;
+    }
+
+    /**
+     * Sets delay metric is supported or not.
+     *
+     * @param delayMetricSupported true if supported else false
+     */
+    public void setDelayMetricSupported(boolean delayMetricSupported) {
+        this.delayMetricSupported = delayMetricSupported;
+    }
+
+    /**
+     * Returns error metric of metric of internal reachability.
+     *
+     * @return errorMetric error metic
+     */
+    public byte errorMetric() {
+        return errorMetric;
+    }
+
+    /**
+     * Sets error metric for metric of internal reachability.
+     *
+     * @param errorMetric error metric
+     */
+    public void setErrorMetric(byte errorMetric) {
+        this.errorMetric = errorMetric;
+    }
+
+    /**
+     * Returns expense metric of metric of internal reachability.
+     *
+     * @return expense metric
+     */
+    public byte expenseMetric() {
+        return expenseMetric;
+    }
+
+    /**
+     * Sets expense metric for metric of internal reachability.
+     *
+     * @param expenseMetric expense metric
+     */
+    public void setExpenseMetric(byte expenseMetric) {
+        this.expenseMetric = expenseMetric;
+    }
+
+    /**
+     * Returns delay metric of metric of internal reachability.
+     *
+     * @return delay metric
+     */
+    public byte delayMetric() {
+        return delayMetric;
+    }
+
+    /**
+     * Sets delay metric for metric of internal reachability.
+     *
+     * @param delayMetric delay metric
+     */
+    public void setDelayMetric(byte delayMetric) {
+        this.delayMetric = delayMetric;
+    }
+
+    /**
+     * Returns default metric of metric of internal reachability.
+     *
+     * @return default metric
+     */
+    public byte defaultMetric() {
+        return defaultMetric;
+    }
+
+    /**
+     * Sets default metric for metric of internal reachability.
+     *
+     * @param defaultMetric default metric
+     */
+    public void setDefaultMetric(byte defaultMetric) {
+        this.defaultMetric = defaultMetric;
+    }
+
+    /**
+     * Sets the metric of internal reachability
+     * values for metric of internal reachability from byte buffer.
+     *
+     * @param channelBuffer channel Buffer instance
+     */
+    public void readFrom(ChannelBuffer channelBuffer) {
+        byte metric = channelBuffer.readByte();
+        this.setDefaultMetric(metric);
+        String metricInBinary = Integer.toBinaryString(Byte.toUnsignedInt(metric));
+        metricInBinary = IsisUtil.toEightBitBinary(metricInBinary);
+        if (metricInBinary.charAt(1) == 0) {
+            this.setDefaultIsInternal(true);
+        } else {
+            this.setDefaultIsInternal(false);
+        }
+        if (metricInBinary.charAt(0) == 0) {
+            this.setDefaultDistributionDown(true);
+        } else {
+            this.setDefaultDistributionDown(false);
+        }
+        byte delayMetric = channelBuffer.readByte();
+        metricInBinary = Integer.toBinaryString(Byte.toUnsignedInt(delayMetric));
+        metricInBinary = IsisUtil.toEightBitBinary(metricInBinary);
+        this.setDelayMetric(Byte.parseByte(metricInBinary.substring(5, metricInBinary.length()), 2));
+        if (metricInBinary.charAt(1) == 0) {
+            this.setDelayIsInternal(true);
+        } else {
+            this.setDelayIsInternal(false);
+        }
+        if (metricInBinary.charAt(0) == 0) {
+            this.setDelayMetricSupported(true);
+        } else {
+            this.setDelayMetricSupported(false);
+        }
+        byte expenseMetric = channelBuffer.readByte();
+        metricInBinary = Integer.toBinaryString(Byte.toUnsignedInt(expenseMetric));
+        metricInBinary = IsisUtil.toEightBitBinary(metricInBinary);
+        this.setExpenseMetric(Byte.parseByte(metricInBinary.substring(5, metricInBinary.length()), 2));
+        if (metricInBinary.charAt(1) == 0) {
+            this.setExpenseIsInternal(true);
+        } else {
+            this.setExpenseIsInternal(false);
+        }
+        if (metricInBinary.charAt(0) == 0) {
+            this.setExpenseMetricSupported(true);
+        } else {
+            this.setExpenseMetricSupported(false);
+        }
+        byte errorMetric = channelBuffer.readByte();
+        metricInBinary = Integer.toBinaryString(Byte.toUnsignedInt(errorMetric));
+        metricInBinary = IsisUtil.toEightBitBinary(metricInBinary);
+        this.setErrorMetric(Byte.parseByte(metricInBinary.substring(5, metricInBinary.length()), 2));
+        if (metricInBinary.charAt(1) == 0) {
+            this.setErrorIsInternal(true);
+        } else {
+            this.setErrorIsInternal(false);
+        }
+        if (metricInBinary.charAt(0) == 0) {
+            this.setErrorMetricSupported(true);
+        } else {
+            this.setErrorMetricSupported(false);
+        }
+        List<Byte> byteList = new ArrayList<>();
+        while (channelBuffer.readableBytes() > 0) {
+            byteList.add(channelBuffer.readByte());
+        }
+        byte[] tempByteArray = new byte[IsisUtil.FOUR_BYTES];
+        channelBuffer.readBytes(tempByteArray, 0, IsisUtil.FOUR_BYTES);
+        this.setIpAddress(Ip4Address.valueOf(tempByteArray));
+
+        tempByteArray = new byte[IsisUtil.FOUR_BYTES];
+        channelBuffer.readBytes(tempByteArray, 0, IsisUtil.FOUR_BYTES);
+        this.setSubnetAddres(Ip4Address.valueOf(tempByteArray));
+    }
+
+    /**
+     * Returns metric of internal reachability values as bytes of metric of internal reachability.
+     *
+     * @return byteArray metric of internal reachability values as bytes of metric of internal reachability
+     */
+    public byte[] asBytes() {
+        List<Byte> bytes = new ArrayList<>();
+        bytes.add(this.defaultMetric());
+        int temp = this.delayMetric();
+        String hsbBits = "";
+        if (this.isDelayMetricSupported()) {
+            hsbBits = "0" + hsbBits;
+        } else {
+            hsbBits = "1" + hsbBits;
+        }
+        if (this.isDelayIsInternal()) {
+            hsbBits = hsbBits + "0";
+        } else {
+            hsbBits = hsbBits + "1";
+        }
+        hsbBits = hsbBits + "00";
+        String binary = hsbBits + IsisUtil.toFourBitBinary(Integer.toBinaryString(temp));
+        bytes.add((byte) Integer.parseInt(binary, 2));
+
+        temp = this.expenseMetric();
+        hsbBits = "";
+        if (this.isExpenseMetricSupported()) {
+            hsbBits = "0" + hsbBits;
+        } else {
+            hsbBits = "1" + hsbBits;
+        }
+        if (this.isExpenseIsInternal()) {
+            hsbBits = hsbBits + "0";
+        } else {
+            hsbBits = hsbBits + "1";
+        }
+        hsbBits = hsbBits + "00";
+        binary = hsbBits + IsisUtil.toFourBitBinary(Integer.toBinaryString(temp));
+        bytes.add((byte) Integer.parseInt(binary, 2));
+
+        temp = this.errorMetric();
+        hsbBits = "";
+        if (this.isErrorMetricSupported()) {
+            hsbBits = "0" + hsbBits;
+        } else {
+            hsbBits = "1" + hsbBits;
+        }
+        if (this.isExpenseIsInternal()) {
+            hsbBits = hsbBits + "0";
+        } else {
+            hsbBits = hsbBits + "1";
+        }
+        hsbBits = hsbBits + "00";
+        binary = hsbBits + IsisUtil.toFourBitBinary(Integer.toBinaryString(temp));
+        bytes.add((byte) Integer.parseInt(binary, 2));
+
+        bytes.addAll(Bytes.asList(this.getIpAddress().toOctets()));
+        bytes.addAll(Bytes.asList(this.getSubnetAddres().toOctets()));
+        return Bytes.toArray(bytes);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("ipAddress", ipAddress)
+                .add("subnetAddres", subnetAddres)
+                .add("defaultMetric", defaultMetric)
+                .add("delayMetric", delayMetric)
+                .add("expenseMetric", expenseMetric)
+                .add("errorMetric", errorMetric)
+                .add("delayMetricSupported", delayMetricSupported)
+                .add("expenseMetricSupported", expenseMetricSupported)
+                .add("errorMetricSupported", errorMetricSupported)
+                .add("defaultIsInternal", defaultIsInternal)
+                .add("defaultDistributionDown", defaultDistributionDown)
+                .add("delayIsInternal", delayIsInternal)
+                .add("expenseIsInternal", expenseIsInternal)
+                .add("errorIsInternal", errorIsInternal)
+                .toString();
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..5274424
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/MetricsOfReachability.java
@@ -0,0 +1,358 @@
+/*
+ * 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.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of metric of reachability.
+ */
+public class MetricsOfReachability {
+    private final String value1 = "10000000";
+    private final String value2 = "00000000";
+    private String neighborId;
+    private byte defaultMetric;
+    private byte delayMetric;
+    private byte expenseMetric;
+    private byte errorMetric;
+    private boolean delayMetricSupported;
+    private boolean expenseMetricSupported;
+    private boolean errorMetricSupported;
+    private boolean defaultIsInternal;
+    private boolean delayIsInternal;
+    private boolean expenseIsInternal;
+    private boolean errorIsInternal;
+
+    /**
+     * Returns delay metric is internal or not.
+     *
+     * @return true if internal else false
+     */
+    public boolean isDelayIsInternal() {
+        return delayIsInternal;
+    }
+
+    /**
+     * Sets delay metric is internal or not.
+     *
+     * @param delayIsInternal true if internal else false
+     */
+    public void setDelayIsInternal(boolean delayIsInternal) {
+        this.delayIsInternal = delayIsInternal;
+    }
+
+    /**
+     * Returns expense metric is internal or not.
+     *
+     * @return true if internal else false
+     */
+    public boolean isExpenseIsInternal() {
+        return expenseIsInternal;
+    }
+
+    /**
+     * Sets expense metric is internal or not.
+     *
+     * @param expenseIsInternal true if internal else false
+     */
+    public void setExpenseIsInternal(boolean expenseIsInternal) {
+        this.expenseIsInternal = expenseIsInternal;
+    }
+
+    /**
+     * Returns error metric is internal or not.
+     *
+     * @return true if internal else false
+     */
+    public boolean isErrorIsInternal() {
+        return errorIsInternal;
+    }
+
+    /**
+     * Sets error metric is internal or not.
+     *
+     * @param errorIsInternal true if internal else false
+     */
+    public void setErrorIsInternal(boolean errorIsInternal) {
+        this.errorIsInternal = errorIsInternal;
+    }
+
+    /**
+     * Returns default metric is internal or not.
+     *
+     * @return true if internal else false
+     */
+    public boolean isDefaultIsInternal() {
+        return defaultIsInternal;
+    }
+
+    /**
+     * Sets default metric is internal or not.
+     *
+     * @param defaultIsInternal true if internal else false
+     */
+    public void setDefaultIsInternal(boolean defaultIsInternal) {
+        this.defaultIsInternal = defaultIsInternal;
+    }
+
+    /**
+     * Returns delay metric is supported or not.
+     *
+     * @return true if supported else false
+     */
+    public boolean isDelayMetricSupported() {
+        return delayMetricSupported;
+    }
+
+    /**
+     * Sets delay metric is supported or not.
+     *
+     * @param delayMetricSupported true if supported else false
+     */
+    public void setDelayMetricSupported(boolean delayMetricSupported) {
+        this.delayMetricSupported = delayMetricSupported;
+    }
+
+    /**
+     * Returns expense metric is supported or not.
+     *
+     * @return true if supported else false
+     */
+    public boolean isExpenseMetricSupported() {
+        return expenseMetricSupported;
+    }
+
+    /**
+     * Sets expense metric is supported or not.
+     *
+     * @param expenseMetricSupported true if supported else false
+     */
+    public void setExpenseMetricSupported(boolean expenseMetricSupported) {
+        this.expenseMetricSupported = expenseMetricSupported;
+    }
+
+    /**
+     * Returns error metric is supported or not.
+     *
+     * @return true if supported else false
+     */
+    public boolean isErrorMetricSupported() {
+        return errorMetricSupported;
+    }
+
+    /**
+     * Sets error metric is supported or not.
+     *
+     * @param errorMetricSupported true if supported else false
+     */
+    public void setErrorMetricSupported(boolean errorMetricSupported) {
+        this.errorMetricSupported = errorMetricSupported;
+    }
+
+    /**
+     * Returns neighbor ID of metric of reachability.
+     *
+     * @return neighbor ID
+     */
+    public String neighborId() {
+        return neighborId;
+    }
+
+    /**
+     * Sets neighbor ID for metric of reachability.
+     *
+     * @param neighborId neighbor ID
+     */
+    public void setNeighborId(String neighborId) {
+        this.neighborId = neighborId;
+    }
+
+
+    /**
+     * Returns default metric of metric of reachability.
+     *
+     * @return default metric
+     */
+    public byte defaultMetric() {
+        return defaultMetric;
+    }
+
+    /**
+     * Sets default metric for  of reachability.
+     *
+     * @param defaultMetric default metric
+     */
+    public void setDefaultMetric(byte defaultMetric) {
+        this.defaultMetric = defaultMetric;
+    }
+
+    /**
+     * Returns delay metric of metric of reachability.
+     *
+     * @return delay metric
+     */
+    public byte delayMetric() {
+        return delayMetric;
+    }
+
+    /**
+     * Sets delay metric for metric of reachability.
+     *
+     * @param delayMetric delay metric.
+     */
+    public void setDelayMetric(byte delayMetric) {
+        this.delayMetric = delayMetric;
+    }
+
+    /**
+     * Returns Expense metric of metric of reachability.
+     *
+     * @return Expense metric
+     */
+    public byte expenseMetric() {
+        return expenseMetric;
+    }
+
+    /**
+     * Sets Expense metric for metric of reachability.
+     *
+     * @param expenseMetric Expense metric.
+     */
+    public void setExpenseMetric(byte expenseMetric) {
+        this.expenseMetric = expenseMetric;
+    }
+
+    /**
+     * Returns Error metric of metric of reachability.
+     *
+     * @return Error metric
+     */
+    public byte errorMetric() {
+        return errorMetric;
+    }
+
+    /**
+     * Sets Error metric for metric of reachability.
+     *
+     * @param errorMetric Error metric.
+     */
+    public void setErrorMetric(byte errorMetric) {
+        this.errorMetric = errorMetric;
+    }
+
+    /**
+     * Sets the metric of reachability values for metric of reachability from byte buffer.
+     *
+     * @param channelBuffer channel Buffer instance
+     */
+    public void readFrom(ChannelBuffer channelBuffer) {
+        byte metric = channelBuffer.readByte();
+        String metricInBinary = Integer.toBinaryString(Byte.toUnsignedInt(metric));
+        metricInBinary = IsisUtil.toEightBitBinary(metricInBinary);
+        this.setDefaultMetric(metric);
+        this.setDelayMetric(metric);
+        this.setExpenseMetric(metric);
+        this.setErrorMetric(metric);
+        this.setDelayMetric(metric);
+        if (metricInBinary.charAt(0) == 0) {
+            this.setDefaultIsInternal(true);
+        } else {
+            this.setDefaultIsInternal(false);
+        }
+        if (metricInBinary.charAt(0) == 0) {
+            this.setDelayMetricSupported(true);
+            this.setExpenseMetricSupported(true);
+            this.setErrorMetricSupported(true);
+        } else {
+            this.setDelayMetricSupported(false);
+            this.setExpenseMetricSupported(false);
+            this.setErrorMetricSupported(false);
+        }
+        byte temp = channelBuffer.readByte();
+        String internalBit = Integer.toBinaryString(Byte.toUnsignedInt(temp));
+        internalBit = IsisUtil.toEightBitBinary(internalBit);
+        if (internalBit.charAt(1) == 0) {
+            this.setDelayIsInternal(true);
+        }
+        temp = channelBuffer.readByte();
+        internalBit = Integer.toBinaryString(Byte.toUnsignedInt(temp));
+        internalBit = IsisUtil.toEightBitBinary(internalBit);
+        if (internalBit.charAt(1) == 0) {
+            this.setExpenseIsInternal(true);
+        }
+        temp = channelBuffer.readByte();
+        internalBit = Integer.toBinaryString(Byte.toUnsignedInt(temp));
+        internalBit = IsisUtil.toEightBitBinary(internalBit);
+        if (internalBit.charAt(1) == 0) {
+            this.setErrorIsInternal(true);
+        }
+        byte[] tempByteArray = new byte[IsisUtil.ID_PLUS_ONE_BYTE];
+        channelBuffer.readBytes(tempByteArray, 0, IsisUtil.ID_PLUS_ONE_BYTE);
+        this.setNeighborId(IsisUtil.systemIdPlus(tempByteArray));
+    }
+
+    /**
+     * Returns metric of reachability values as bytes of metric of reachability.
+     *
+     * @return byteArray metric of reachability values as bytes of metric of reachability
+     */
+    public byte[] asBytes() {
+        List<Byte> bytes = new ArrayList<>();
+        bytes.add((byte) this.defaultMetric());
+        if (this.isDelayIsInternal()) {
+            bytes.add((byte) Integer.parseInt(value1));
+        } else {
+            bytes.add((byte) Integer.parseInt(value2));
+        }
+        if (this.isExpenseIsInternal()) {
+            bytes.add((byte) Integer.parseInt(value1));
+        } else {
+            bytes.add((byte) Integer.parseInt(value2));
+        }
+        if (this.isErrorIsInternal()) {
+            bytes.add((byte) Integer.parseInt(value1));
+        } else {
+            bytes.add((byte) Integer.parseInt(value2));
+        }
+        bytes.addAll(IsisUtil.sourceAndLanIdToBytes(this.neighborId()));
+        return Bytes.toArray(bytes);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("neighborId", neighborId)
+                .add("defaultMetric", defaultMetric)
+                .add("delayMetric", delayMetric)
+                .add("expenseMetric", expenseMetric)
+                .add("errorMetric", errorMetric)
+                .add("delayMetricSupported", delayMetricSupported)
+                .add("expenseMetricSupported", expenseMetricSupported)
+                .add("errorMetricSupported", errorMetricSupported)
+                .add("defaultIsInternal", defaultIsInternal)
+                .add("delayIsInternal", delayIsInternal)
+                .add("expenseIsInternal", expenseIsInternal)
+                .add("errorIsInternal", errorIsInternal)
+                .toString();
+    }
+}
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
old mode 100755
new mode 100644
index e684dff..7aff5c2
--- 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
@@ -17,19 +17,19 @@
 
 import com.google.common.base.MoreObjects;
 import com.google.common.primitives.Bytes;
-import io.netty.buffer.ByteBuf;
+import org.jboss.netty.buffer.ChannelBuffer;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
- * Represents padding TLV.
+ * Representation of padding TLV.
  */
 public class PaddingTlv extends TlvHeader implements IsisTlv {
-    private List<Byte> paddings = new ArrayList();
+    private List<Byte> paddings = new ArrayList<>();
 
     /**
-     * Sets TLV type and TLV length of padding TLV.
+     * Creates an instance of padding TLV.
      *
      * @param tlvHeader tlvHeader.
      */
@@ -39,9 +39,9 @@
     }
 
     @Override
-    public void readFrom(ByteBuf byteBuf) {
-        while (byteBuf.readableBytes() > 0) {
-            this.paddings.add(byteBuf.readByte());
+    public void readFrom(ChannelBuffer channelBuffer) {
+        while (channelBuffer.readableBytes() > 0) {
+            this.paddings.add(channelBuffer.readByte());
         }
     }
 
@@ -51,17 +51,18 @@
 
         byte[] tlvHeader = tlvHeaderAsByteArray();
         byte[] tlvBody = tlvBodyAsBytes();
+        tlvHeader[1] = (byte) tlvBody.length;
         bytes = Bytes.concat(tlvHeader, tlvBody);
 
         return bytes;
     }
 
     /**
-     * Gets TLV body padding TLV.
+     * Returns TLV body of padding TLV.
      *
-     * @return areaArea TLV body padding TLV\\
+     * @return byteArray TLV body of padding TLV
      */
-    public byte[] tlvBodyAsBytes() {
+    private byte[] tlvBodyAsBytes() {
         byte[] areaArea = new byte[this.tlvLength()];
         return areaArea;
     }
@@ -70,6 +71,7 @@
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
                 .omitNullValues()
+                .add("paddings", paddings)
                 .toString();
     }
 }
\ No newline at end of file
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
old mode 100755
new mode 100644
index abc2bee..1c41d12
--- 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
@@ -15,21 +15,22 @@
  */
 package org.onosproject.isis.io.isispacket.tlv;
 
+import com.google.common.base.MoreObjects;
 import com.google.common.primitives.Bytes;
-import io.netty.buffer.ByteBuf;
+import org.jboss.netty.buffer.ChannelBuffer;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
- * Represents Protocol supported TLV.
+ * Representation of  protocol supported TLV.
  */
 public class ProtocolSupportedTlv extends TlvHeader implements IsisTlv {
 
-    private List<Byte> protocolSupported = new ArrayList();
+    private List<Byte> protocolSupported = new ArrayList<>();
 
     /**
-     * Sets TLV type and TLV length of protocol supported TLV.
+     * Creates an instance of protocol supported TLV.
      *
      * @param tlvHeader tlvHeader.
      */
@@ -41,21 +42,27 @@
     }
 
     /**
-     * Gets the Protocol Supported by the TLV.
+     * Adds the protocol supported to protocol supported TLV.
      *
-     * @return Protocol Supported
+     * @param protocolValue protocol supported
+     */
+    public void addProtocolSupported(byte protocolValue) {
+        protocolSupported.add(protocolValue);
+    }
+
+    /**
+     * Returns protocols supported of protocol supported TLV.
+     *
+     * @return protocol supported
      */
     public List<Byte> protocolSupported() {
-
         return this.protocolSupported;
-
     }
 
     @Override
-    public void readFrom(ByteBuf byteBuf) {
-
-        while (byteBuf.readableBytes() > 0) {
-            this.protocolSupported.add(byteBuf.readByte());
+    public void readFrom(ChannelBuffer channelBuffer) {
+        while (channelBuffer.readableBytes() > 0) {
+            this.protocolSupported.add(channelBuffer.readByte());
         }
     }
 
@@ -65,8 +72,8 @@
 
         byte[] tlvHeader = tlvHeaderAsByteArray();
         byte[] tlvBody = tlvBodyAsBytes();
+        tlvHeader[1] = (byte) tlvBody.length;
         bytes = Bytes.concat(tlvHeader, tlvBody);
-
         return bytes;
     }
 
@@ -75,9 +82,8 @@
      *
      * @return byteArray TLV body of protocol supported TLV
      */
-    public byte[] tlvBodyAsBytes() {
-
-        List<Byte> bytes = new ArrayList();
+    private byte[] tlvBodyAsBytes() {
+        List<Byte> bytes = new ArrayList<>();
         for (byte byt : this.protocolSupported) {
             bytes.add(byt);
         }
@@ -88,4 +94,12 @@
         }
         return byteArray;
     }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("protocolSupported", protocolSupported)
+                .toString();
+    }
 }
\ No newline at end of file
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
old mode 100755
new mode 100644
index b721cdf..e1fcbdf
--- 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
@@ -15,55 +15,90 @@
  */
 package org.onosproject.isis.io.isispacket.tlv;
 
-import io.netty.buffer.ByteBuf;
-import org.onosproject.isis.io.util.IsisUtil;
+import org.jboss.netty.buffer.ChannelBuffer;
 
 /**
- * Represents TLV finder.
+ * Representation of TLV Finder.
  */
 public class TlvFinder extends TlvHeader {
 
     /**
-     * Sets the value for TLV header and the body of the TLV.
+     * Sets the value for TLV header.
      *
-     * @param tlvHeader tlvHeader
-     * @param byteBuf   byteBuf
-     * @return isisTlv ISIS TLV
+     * @param tlvHeader     tlvHeader
+     * @param channelBuffer byteBuf
+     * @return isisTlv
      */
-    public static IsisTlv findTlv(TlvHeader tlvHeader, ByteBuf byteBuf) {
+    public static IsisTlv findTlv(TlvHeader tlvHeader, ChannelBuffer channelBuffer) {
 
         IsisTlv isisTlv = null;
-
-        switch (tlvHeader.tlvType()) {
-            case IsisUtil.AREAADDRESS:
+        switch (TlvType.get(tlvHeader.tlvType())) {
+            case AREAADDRESS:
                 AreaAddressTlv areaAddressTlv = new AreaAddressTlv(tlvHeader);
-                areaAddressTlv.readFrom(byteBuf);
+                areaAddressTlv.readFrom(channelBuffer);
                 isisTlv = areaAddressTlv;
                 break;
-            case IsisUtil.IPINTERFACEADDRESS:
+            case AUTHENTICATION:
+                //TODO
+                break;
+            case EXTENDEDISREACHABILITY:
+                //TODO
+                break;
+            case IDRPINFORMATION:
+                IdrpInformationTlv idrpInformationTlv = new IdrpInformationTlv(tlvHeader);
+                idrpInformationTlv.readFrom(channelBuffer);
+                isisTlv = idrpInformationTlv;
+                break;
+            case IPEXTENDEDREACHABILITY:
+                IpExtendedReachabilityTlv iperTlv = new IpExtendedReachabilityTlv(tlvHeader);
+                iperTlv.readFrom(channelBuffer);
+                isisTlv = iperTlv;
+                break;
+            case IPINTERFACEADDRESS:
                 IpInterfaceAddressTlv ipTlv = new IpInterfaceAddressTlv(tlvHeader);
-                ipTlv.readFrom(byteBuf);
+                ipTlv.readFrom(channelBuffer);
                 isisTlv = ipTlv;
                 break;
-            case IsisUtil.PROTOCOLSUPPORTED:
+            case IPINTERNALREACHABILITY:
+                IpInternalReachabilityTlv iprTlv = new IpInternalReachabilityTlv(tlvHeader);
+                iprTlv.readFrom(channelBuffer);
+                isisTlv = iprTlv;
+                break;
+            case ISALIAS:
+                break;
+            case PROTOCOLSUPPORTED:
                 ProtocolSupportedTlv psTlv = new ProtocolSupportedTlv(tlvHeader);
-                psTlv.readFrom(byteBuf);
+                psTlv.readFrom(channelBuffer);
                 isisTlv = psTlv;
                 break;
-            case IsisUtil.ISNEIGHBORS:
+            case ISREACHABILITY:
+                IsReachabilityTlv isrTlv = new IsReachabilityTlv(tlvHeader);
+                isrTlv.readFrom(channelBuffer);
+                isisTlv = isrTlv;
+                break;
+            case ISNEIGHBORS:
                 IsisNeighborTlv isisNeighborTlv = new IsisNeighborTlv(tlvHeader);
-                isisNeighborTlv.readFrom(byteBuf);
+                isisNeighborTlv.readFrom(channelBuffer);
                 isisTlv = isisNeighborTlv;
                 break;
-            case IsisUtil.PADDING:
+            case LSPENTRY:
+                LspEntriesTlv lspEntriesTlv = new LspEntriesTlv(tlvHeader);
+                lspEntriesTlv.readFrom(channelBuffer);
+                isisTlv = lspEntriesTlv;
+                break;
+            case PADDING:
                 PaddingTlv paddingTlv = new PaddingTlv(tlvHeader);
-                paddingTlv.readFrom(byteBuf);
+                paddingTlv.readFrom(channelBuffer);
                 isisTlv = paddingTlv;
                 break;
+            case ADJACENCYSTATE:
+                AdjacencyStateTlv adjacencyStateTlv = new AdjacencyStateTlv(tlvHeader);
+                adjacencyStateTlv.readFrom(channelBuffer);
+                isisTlv = adjacencyStateTlv;
+                break;
             default:
                 break;
         }
-
         return isisTlv;
     }
 }
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvHeader.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvHeader.java
old mode 100755
new mode 100644
index a645892..9b15cbf
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvHeader.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvHeader.java
@@ -17,29 +17,29 @@
 
 import com.google.common.base.MoreObjects;
 import com.google.common.primitives.Bytes;
-import io.netty.buffer.ByteBuf;
+import org.jboss.netty.buffer.ChannelBuffer;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
- * Represents TLV header.
+ * Representation of TLV header.
  */
 public class TlvHeader implements IsisTlv {
     private int tlvType;
     private int tlvLength;
 
     /**
-     * Gets the TLV length of the TLV.
+     * Returns TLV length of TLV.
      *
-     * @return tlvLength TLV length
+     * @return TLV length
      */
     public int tlvLength() {
         return tlvLength;
     }
 
     /**
-     * Sets the TLV length for the mTLV.
+     * Sets TLV length for TLV.
      *
      * @param tlvLength TLV length
      */
@@ -48,16 +48,16 @@
     }
 
     /**
-     * Gets the TLV type of the TLV.
+     * Returns TLV type of TLV.
      *
-     * @return tlvType TLV type
+     * @return TLV type
      */
     public int tlvType() {
         return tlvType;
     }
 
     /**
-     * Sets TLV type for the TLV.
+     * Sets TLV type for TLV.
      *
      * @param tlvType TLV type
      */
@@ -66,32 +66,31 @@
     }
 
     /**
-     * Sets the TLV values of TLV from b yte buffer.
+     * Sets TLV values from channel buffer.
      *
-     * @param byteBuf byteBuf.
+     * @param channelBuffer channel Buffer instance
      */
-    public void readFrom(ByteBuf byteBuf) {
+    public void readFrom(ChannelBuffer channelBuffer) {
         //implemented in sub classes
     }
 
 
     /**
-     * Gets the TLV of the TLV as bytes.
+     * Returns TLV as byte array.
      *
-     * @return null
+     * @return byteArray TLV body of area address TLV
      */
     public byte[] asBytes() {
-        //implemented the subclasses
         return null;
     }
 
     /**
-     * Gets the TLV header of the TLV.
+     * Returns TLV header of TLV as bytes.
      *
-     * @return headerLst TLV of the TLV
+     * @return TLV header as bytes
      */
     public byte[] tlvHeaderAsByteArray() {
-        List<Byte> headerLst = new ArrayList();
+        List<Byte> headerLst = new ArrayList<>();
         headerLst.add((byte) this.tlvType);
         headerLst.add((byte) this.tlvLength);
         return Bytes.toArray(headerLst);
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvType.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvType.java
old mode 100755
new mode 100644
index 5ec9d46..151885a
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvType.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvType.java
@@ -15,8 +15,12 @@
  */
 package org.onosproject.isis.io.isispacket.tlv;
 
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
- * Represents various values for TLV types.
+ * Representation of various values for TLV types.
  */
 public enum TlvType {
     AREAADDRESS(1),
@@ -25,19 +29,32 @@
     PADDING(8),
     LSPENTRY(9),
     AUTHENTICATION(10),
-    CHECKSUM(12),
+    HOSTNAME(137),
     EXTENDEDISREACHABILITY(22),
     ISALIAS(24),
     IPINTERNALREACHABILITY(128),
     PROTOCOLSUPPORTED(129),
     IPEXTERNALREACHABILITY(130),
+    IPEXTENDEDREACHABILITY(135),
     IDRPINFORMATION(131),
-    IPINTERFACEADDRESS(132);
+    IPINTERFACEADDRESS(132),
+    ADJACENCYSTATE(240);
+
+    // Reverse lookup table
+    private static final Map<Integer, TlvType> LOOKUP = new HashMap<>();
+
+    // Populate the lookup table on loading time
+    static {
+        for (TlvType isisTlvType : EnumSet.allOf(TlvType.class)) {
+            LOOKUP.put(isisTlvType.value(), isisTlvType);
+        }
+    }
 
     private int value;
 
     /**
      * Sets the TLV type value.
+     *
      * @param value value.
      */
     TlvType(int value) {
@@ -45,10 +62,21 @@
     }
 
     /**
+     * Gets the enum instance from type value - reverse lookup purpose.
+     *
+     * @param tlvTypeValue TLV type value
+     * @return ISIS TLV type instance
+     */
+    public static TlvType get(int tlvTypeValue) {
+        return LOOKUP.get(tlvTypeValue);
+    }
+
+    /**
      * Gets value.
+     *
      * @return value
      */
     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/tlv/TlvsToBytes.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvsToBytes.java
old mode 100755
new mode 100644
index f9a9bb8..e3eba57
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvsToBytes.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/TlvsToBytes.java
@@ -16,23 +16,33 @@
 package org.onosproject.isis.io.isispacket.tlv;
 
 import com.google.common.primitives.Bytes;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
 import java.util.List;
 
 /**
- * Represents conversion of TLV's to bytes.
+ * Representation of conversion of TLV's to bytes.
  */
 public final class TlvsToBytes {
+
+    protected static final Logger log = LoggerFactory.getLogger(TlvsToBytes.class);
+
+    /**
+     * Creates an instance.
+     */
+    private TlvsToBytes() {
+    }
+
     /**
      * Sets the ISIS TLV and returns in the form of bytes.
      *
-     * @param isisTlv isisTlv
-     * @return tlvBytes TLV bytes
+     * @param isisTlv isisTlv.
+     * @return tlvBytes
      */
     public static List<Byte> tlvToBytes(IsisTlv isisTlv) {
-
-        List<Byte> tlvBytes = new ArrayList();
+        List<Byte> tlvBytes = new ArrayList<>();
         if (isisTlv instanceof AreaAddressTlv) {
             AreaAddressTlv areaAddressTlv = (AreaAddressTlv) isisTlv;
             tlvBytes.addAll(Bytes.asList(areaAddressTlv.asBytes()));
@@ -48,16 +58,33 @@
         } else if (isisTlv instanceof IsisNeighborTlv) {
             IsisNeighborTlv isisNeighborTlv = (IsisNeighborTlv) isisTlv;
             tlvBytes.addAll(Bytes.asList(isisNeighborTlv.asBytes()));
+        } else if (isisTlv instanceof AdjacencyStateTlv) {
+            AdjacencyStateTlv isisAdjacencyState
+                    = (AdjacencyStateTlv) isisTlv;
+            tlvBytes.addAll(Bytes.asList(isisAdjacencyState.asBytes()));
+        } else if (isisTlv instanceof HostNameTlv) {
+            HostNameTlv hostNameTlv
+                    = (HostNameTlv) isisTlv;
+            tlvBytes.addAll(Bytes.asList(hostNameTlv.asBytes()));
+        } else if (isisTlv instanceof IpExtendedReachabilityTlv) {
+            IpExtendedReachabilityTlv ipExtendedReachabilityTlv
+                    = (IpExtendedReachabilityTlv) isisTlv;
+            tlvBytes.addAll(Bytes.asList(ipExtendedReachabilityTlv.asBytes()));
+        } else if (isisTlv instanceof IpInternalReachabilityTlv) {
+            IpInternalReachabilityTlv ipInternalReachabilityTlv
+                    = (IpInternalReachabilityTlv) isisTlv;
+            tlvBytes.addAll(Bytes.asList(ipInternalReachabilityTlv.asBytes()));
+        } else if (isisTlv instanceof IsReachabilityTlv) {
+            IsReachabilityTlv isReachabilityTlv
+                    = (IsReachabilityTlv) isisTlv;
+            tlvBytes.addAll(Bytes.asList(isReachabilityTlv.asBytes()));
+        } else if (isisTlv instanceof LspEntriesTlv) {
+            LspEntriesTlv lspEntriesTlv
+                    = (LspEntriesTlv) isisTlv;
+            tlvBytes.addAll(Bytes.asList(lspEntriesTlv.asBytes()));
         } else {
-            System.out.println("UNKNOWN TLV TYPE ::TlvsToBytes ");
+            log.debug("TlvsToBytes::UNKNOWN TLV TYPE ::TlvsToBytes ");
         }
-
         return tlvBytes;
     }
-    /**
-     * Creates an instance.
-     */
-    private TlvsToBytes() {
-        //private constructor
-    }
 }
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/package-info.java
old mode 100755
new mode 100644
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
new file mode 100644
index 0000000..8e6dfa7
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/AdministrativeGroup.java
@@ -0,0 +1,114 @@
+/*
+ * 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.subtlv;
+
+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.TlvHeader;
+import org.onosproject.isis.io.util.IsisUtil;
+
+
+/**
+ * Representation of an administrative group.
+ */
+public class AdministrativeGroup extends TlvHeader implements TrafficEngineeringSubTlv {
+
+    private int administrativeGroup;
+
+    /**
+     * Creates an administrative group instance.
+     *
+     * @param header Tlv Header instance
+     */
+    public AdministrativeGroup(TlvHeader header) {
+        this.setTlvType(header.tlvType());
+        this.setTlvLength(header.tlvLength());
+    }
+
+    /**
+     * Gets administrative group value.
+     *
+     * @return administrative group value
+     */
+    public int administrativeGroup() {
+        return administrativeGroup;
+    }
+
+    /**
+     * Sets administrative group value.
+     *
+     * @param administrativeGroup value
+     */
+    public void setAdministrativeGroup(int administrativeGroup) {
+        this.administrativeGroup = administrativeGroup;
+    }
+
+    /**
+     * Gets administrative group value.
+     *
+     * @return administrativeGroup value
+     */
+    public int getAdministrativeGroupValue() {
+        return this.administrativeGroup;
+    }
+
+    /**
+     * Reads bytes from channel buffer.
+     *
+     * @param channelBuffer Channel buffer instance
+     */
+    public void readFrom(ChannelBuffer channelBuffer) {
+        byte[] tempByteArray = new byte[tlvLength()];
+        channelBuffer.readBytes(tempByteArray, 0, tlvLength());
+        this.setAdministrativeGroup(IsisUtil.byteToInteger(tempByteArray));
+    }
+
+    /**
+     * Returns administrative group as byte array.
+     *
+     * @return administrative group instance as byte array
+     */
+    public byte[] asBytes() {
+        byte[] linkSubType = null;
+
+        byte[] linkSubTlvHeader = tlvHeaderAsByteArray();
+        byte[] linkSubTlvBody = tlvBodyAsBytes();
+        linkSubType = Bytes.concat(linkSubTlvHeader, linkSubTlvBody);
+
+        return linkSubType;
+    }
+
+    /**
+     * Gets administrative group body as byte array.
+     *
+     * @return byte array of sub tlv administrative group
+     */
+    public byte[] tlvBodyAsBytes() {
+
+        byte[] linkSubTypeBody;
+        linkSubTypeBody = IsisUtil.convertToFourBytes(this.administrativeGroup);
+
+        return linkSubTypeBody;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("administrativeGroup", administrativeGroup)
+                .toString();
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..e5cba2b
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumBandwidth.java
@@ -0,0 +1,101 @@
+/*
+ * 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.subtlv;
+
+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.TlvHeader;
+import org.onosproject.isis.io.util.IsisUtil;
+
+
+/**
+ * Representation of maximum bandwidth TE value.
+ */
+public class MaximumBandwidth extends TlvHeader implements TrafficEngineeringSubTlv {
+    private float maximumBandwidth;
+
+    /**
+     * Creates an instance of maximum bandwidth.
+     *
+     * @param header tlv header instance
+     */
+    public MaximumBandwidth(TlvHeader header) {
+        this.setTlvType(header.tlvType());
+        this.setTlvLength(header.tlvLength());
+    }
+
+    /**
+     * Sets value of maximum bandwidth.
+     *
+     * @param maximumBandwidth value of maximum bandwidth
+     */
+    public void setMaximumBandwidth(float maximumBandwidth) {
+        this.maximumBandwidth = maximumBandwidth;
+    }
+
+    /**
+     * Gets value of maximum bandwidth.
+     *
+     * @return maximumBandwidth value of maximum bandwidth
+     */
+    public float getMaximumBandwidthValue() {
+        return this.maximumBandwidth;
+    }
+
+    /**
+     * Reads bytes from channel buffer.
+     *
+     * @param channelBuffer channel buffer instance
+     */
+    public void readFrom(ChannelBuffer channelBuffer) {
+        byte[] tempByteArray = new byte[tlvLength()];
+        channelBuffer.readBytes(tempByteArray, 0, tlvLength());
+        int maxBandwidth = (IsisUtil.byteToInteger(tempByteArray));
+        this.setMaximumBandwidth(Float.intBitsToFloat(maxBandwidth));
+    }
+
+    /**
+     * Gets byte array of maximum bandwidth sub tlv.
+     *
+     * @return byte array of maximum bandwidth sub tlv
+     */
+    public byte[] asBytes() {
+        byte[] linkSubType = null;
+        byte[] linkSubTlvHeader = tlvHeaderAsByteArray();
+        byte[] linkSubTlvBody = tlvBodyAsBytes();
+        linkSubType = Bytes.concat(linkSubTlvHeader, linkSubTlvBody);
+
+        return linkSubType;
+    }
+
+    /**
+     * Gets maximum bandwidth sub tlv byte array.
+     *
+     * @return byte array of maximum bandwidth sub tlv
+     */
+    public byte[] tlvBodyAsBytes() {
+        byte[] linkSubTypeBody;
+        linkSubTypeBody = IsisUtil.convertToFourBytes(Float.floatToIntBits(this.maximumBandwidth));
+        return linkSubTypeBody;
+    }
+
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("maximumBandwidth", maximumBandwidth)
+                .toString();
+    }
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..22d96db
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/MaximumReservableBandwidth.java
@@ -0,0 +1,104 @@
+/*
+ * 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.subtlv;
+
+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.TlvHeader;
+import org.onosproject.isis.io.util.IsisUtil;
+
+
+/**
+ * Representation of maximum reservable bandwidth TE value.
+ */
+public class MaximumReservableBandwidth extends TlvHeader implements TrafficEngineeringSubTlv {
+    private float maximumReservableBandwidth;
+
+    /**
+     * Creates an instance of maximum reservable bandwidth.
+     *
+     * @param header tlv header
+     */
+    public MaximumReservableBandwidth(TlvHeader header) {
+        this.setTlvType(header.tlvType());
+        this.setTlvLength(header.tlvLength());
+    }
+
+    /**
+     * Sets value of maximum reversible bandwidth.
+     *
+     * @param maximumBandwidth maximum reversible bandwidth
+     */
+    public void setMaximumBandwidth(float maximumBandwidth) {
+        this.maximumReservableBandwidth = maximumBandwidth;
+    }
+
+    /**
+     * Gets value of maximum reversible bandwidth.
+     *
+     * @return maximumBandwidth maximum reversible bandwidth
+     */
+    public float getMaximumBandwidthValue() {
+        return this.maximumReservableBandwidth;
+    }
+
+    /**
+     * Reads bytes from channel buffer.
+     *
+     * @param channelBuffer channel buffer instance
+     */
+    public void readFrom(ChannelBuffer channelBuffer) {
+        byte[] tempByteArray = new byte[tlvLength()];
+        channelBuffer.readBytes(tempByteArray, 0, tlvLength());
+        int maxBandwidth = (IsisUtil.byteToInteger(tempByteArray));
+        this.setMaximumBandwidth(Float.intBitsToFloat(maxBandwidth));
+    }
+
+    /**
+     * Returns byte array of maximum reservable bandwidth.
+     *
+     * @return byte array of maximum reservable bandwidth
+     */
+    public byte[] asBytes() {
+        byte[] linkSubType = null;
+
+        byte[] linkSubTlvHeader = tlvHeaderAsByteArray();
+        byte[] linkSubTlvBody = tlvBodyAsBytes();
+        linkSubType = Bytes.concat(linkSubTlvHeader, linkSubTlvBody);
+        return linkSubType;
+
+    }
+
+    /**
+     * Gets maximum reservable bandwidth sub tlv body as byte array.
+     *
+     * @return byte of maximum reservable bandwidth sub tlv body
+     */
+    public byte[] tlvBodyAsBytes() {
+        byte[] linkSubTypeBody;
+        linkSubTypeBody = IsisUtil.convertToFourBytes(Float.floatToIntBits(this.maximumReservableBandwidth));
+
+        return linkSubTypeBody;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .add("maximumReservableBandwidth", maximumReservableBandwidth)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvFinder.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvFinder.java
new file mode 100644
index 0000000..7958f53
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvFinder.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.isis.io.isispacket.tlv.subtlv;
+
+import org.jboss.netty.buffer.ChannelBuffer;
+import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+
+/**
+ * Representation of sub tlv finder.
+ */
+public final class SubTlvFinder {
+    /**
+     * Creates an instance.
+     */
+    private SubTlvFinder() {
+
+    }
+
+    /**
+     * Sets the value for TLV header and to find sub TLV and populate.
+     *
+     * @param tlvHeader     tlvHeader
+     * @param channelBuffer byteBuf
+     * @return subTlv  traffic engineering sub tlv
+     */
+    public static TrafficEngineeringSubTlv findSubTlv(TlvHeader tlvHeader, ChannelBuffer channelBuffer) {
+
+        TrafficEngineeringSubTlv subTlv = null;
+
+        switch (SubTlvType.get(tlvHeader.tlvType())) {
+            case ADMINISTRATIVEGROUP:
+                AdministrativeGroup administrativeGroup = new AdministrativeGroup(tlvHeader);
+                administrativeGroup.readFrom(channelBuffer);
+                subTlv = administrativeGroup;
+                break;
+            case MAXIMUMBANDWIDTH:
+                MaximumBandwidth maximumBandwidth = new MaximumBandwidth(tlvHeader);
+                maximumBandwidth.readFrom(channelBuffer);
+                subTlv = maximumBandwidth;
+                break;
+            case MAXIMUMRESERVABLEBANDWIDTH:
+                MaximumReservableBandwidth maxResBandwidth = new MaximumReservableBandwidth(tlvHeader);
+                maxResBandwidth.readFrom(channelBuffer);
+                subTlv = maxResBandwidth;
+                break;
+            case TRAFFICENGINEERINGMETRIC:
+                TrafficEngineeringMetric teMetric = new TrafficEngineeringMetric(tlvHeader);
+                teMetric.readFrom(channelBuffer);
+                subTlv = teMetric;
+                break;
+            case UNRESERVEDBANDWIDTH:
+                UnreservedBandwidth unreservedBandwidth = new UnreservedBandwidth(tlvHeader);
+                unreservedBandwidth.readFrom(channelBuffer);
+                subTlv = unreservedBandwidth;
+                break;
+            default:
+                //TODO
+                break;
+        }
+        return subTlv;
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvToBytes.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvToBytes.java
new file mode 100644
index 0000000..8774c04
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvToBytes.java
@@ -0,0 +1,69 @@
+/*
+ * 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.subtlv;
+
+import com.google.common.primitives.Bytes;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of conversion of TLV's to bytes.
+ */
+public final class SubTlvToBytes {
+
+    protected static final Logger log = LoggerFactory.getLogger(SubTlvToBytes.class);
+
+    /**
+     * Creates an instance.
+     */
+    private SubTlvToBytes() {
+        //private constructor
+    }
+
+    /**
+     * Sets the ISIS sub TLV and returns in the form of bytes.
+     *
+     * @param subTlv isisTlv.
+     * @return subTlvBytes
+     */
+    public static List<Byte> tlvToBytes(TrafficEngineeringSubTlv subTlv) {
+
+        List<Byte> subTlvBytes = new ArrayList<>();
+        if (subTlv instanceof AdministrativeGroup) {
+            AdministrativeGroup administrativeGroup = (AdministrativeGroup) subTlv;
+            subTlvBytes.addAll(Bytes.asList(administrativeGroup.asBytes()));
+        } else if (subTlv instanceof MaximumBandwidth) {
+            MaximumBandwidth maximumBandwidth = (MaximumBandwidth) subTlv;
+            subTlvBytes.addAll(Bytes.asList(maximumBandwidth.asBytes()));
+        } else if (subTlv instanceof MaximumReservableBandwidth) {
+            MaximumReservableBandwidth maximumReservableBandwidth = (MaximumReservableBandwidth) subTlv;
+            subTlvBytes.addAll(Bytes.asList(maximumReservableBandwidth.asBytes()));
+        } else if (subTlv instanceof TrafficEngineeringMetric) {
+            TrafficEngineeringMetric trafficEngineeringMetric = (TrafficEngineeringMetric) subTlv;
+            subTlvBytes.addAll(Bytes.asList(trafficEngineeringMetric.asBytes()));
+        } else if (subTlv instanceof UnreservedBandwidth) {
+            UnreservedBandwidth unreservedBandwidth = (UnreservedBandwidth) subTlv;
+            subTlvBytes.addAll(Bytes.asList(unreservedBandwidth.asBytes()));
+        } else {
+            log.debug("TlvsToBytes::UNKNOWN TLV TYPE ::TlvsToBytes ");
+        }
+
+        return subTlvBytes;
+    }
+}
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
new file mode 100644
index 0000000..b02da25
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/SubTlvType.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.tlv.subtlv;
+
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Representation of sub tlv type.
+ */
+public enum SubTlvType {
+    ADMINISTRATIVEGROUP(9),
+    MAXIMUMBANDWIDTH(6),
+    MAXIMUMRESERVABLEBANDWIDTH(7),
+    TRAFFICENGINEERINGMETRIC(5),
+    UNRESERVEDBANDWIDTH(8);
+
+    // Reverse lookup table
+    private static final Map<Integer, SubTlvType> LOOKUP = new HashMap<>();
+
+    // Populate the lookup table on loading time
+    static {
+        for (SubTlvType subTlvType : EnumSet.allOf(SubTlvType.class)) {
+            LOOKUP.put(subTlvType.value(), subTlvType);
+        }
+    }
+
+    private int value;
+
+    /**
+     * Sets the  sub TLV type value.
+     *
+     * @param value value.
+     */
+    SubTlvType(int value) {
+        this.value = value;
+    }
+
+    /**
+     * Gets the enum instance from type value - reverse lookup purpose.
+     *
+     * @param subTlvTypeValue TLV type value
+     * @return ISIS  sub TLV type instance
+     */
+    public static SubTlvType get(int subTlvTypeValue) {
+        return LOOKUP.get(subTlvTypeValue);
+    }
+
+    /**
+     * Gets value.
+     *
+     * @return value
+     */
+    public int 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
new file mode 100644
index 0000000..cad36e4
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/TrafficEngineeringMetric.java
@@ -0,0 +1,104 @@
+/*
+ * 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.subtlv;
+
+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.TlvHeader;
+import org.onosproject.isis.io.util.IsisUtil;
+
+/**
+ * Representation of traffic engineering metric TE value.
+ */
+public class TrafficEngineeringMetric extends TlvHeader implements TrafficEngineeringSubTlv {
+    private long trafficEngineeringMetric;
+
+    /**
+     * Creates an instance of traffic engineering metric .
+     *
+     * @param header tlv header instance
+     */
+    public TrafficEngineeringMetric(TlvHeader header) {
+        this.setTlvType(header.tlvType());
+        this.setTlvLength(header.tlvLength());
+    }
+
+    /**
+     * Sets TE metric value.
+     *
+     * @param trafficEngineeringMetric value of trafficEngineeringMetric
+     */
+    public void setTrafficEngineeringMetric(long trafficEngineeringMetric) {
+        this.trafficEngineeringMetric = trafficEngineeringMetric;
+    }
+
+    /**
+     * Gets TE metric value.
+     *
+     * @return value of traffic engineering metric
+     */
+    public long getTrafficEngineeringMetricValue() {
+        return this.trafficEngineeringMetric;
+    }
+
+    /**
+     * Reads bytes from channel buffer .
+     *
+     * @param channelBuffer channel buffer instance
+     */
+    public void readFrom(ChannelBuffer channelBuffer) {
+        byte[] tempByteArray = new byte[tlvLength()];
+        channelBuffer.readBytes(tempByteArray, 0, tlvLength());
+        this.setTrafficEngineeringMetric(IsisUtil.byteToLong(tempByteArray));
+    }
+
+    /**
+     * Gets instance as byte array.
+     *
+     * @return instance as byte array
+     */
+    public byte[] asBytes() {
+        byte[] linkSubType = null;
+
+        byte[] linkSubTlvHeader = tlvHeaderAsByteArray();
+        byte[] linkSubTlvBody = tlvBodyAsBytes();
+        linkSubType = Bytes.concat(linkSubTlvHeader, linkSubTlvBody);
+
+        return linkSubType;
+    }
+
+    /**
+     * Gets trafficEngineeringMetric as byte array .
+     *
+     * @return byte array of trafficEngineeringMetric
+     */
+    public byte[] tlvBodyAsBytes() {
+
+        byte[] linkSubTypeBody;
+        linkSubTypeBody = IsisUtil.convertToFourBytes(this.trafficEngineeringMetric);
+
+        return linkSubTypeBody;
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("trafficEngineeringMetric", trafficEngineeringMetric)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/TrafficEngineeringSubTlv.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/TrafficEngineeringSubTlv.java
new file mode 100644
index 0000000..022cf9c
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/TrafficEngineeringSubTlv.java
@@ -0,0 +1,23 @@
+/*
+ * 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.subtlv;
+
+/**
+ * Representation of traffic engineering sub tlv.
+ */
+public interface TrafficEngineeringSubTlv {
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..7ba34f0
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/UnreservedBandwidth.java
@@ -0,0 +1,116 @@
+/*
+ * 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.subtlv;
+
+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.TlvHeader;
+import org.onosproject.isis.io.util.IsisUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Representation of an unreserved band width TE value.
+ */
+public class UnreservedBandwidth extends TlvHeader implements TrafficEngineeringSubTlv {
+    private List<Float> unReservedBandwidth = new ArrayList<>();
+
+    /**
+     * Creates an instance of unreserved band width.
+     *
+     * @param header tlv header instance
+     */
+    public UnreservedBandwidth(TlvHeader header) {
+        this.setTlvType(header.tlvType());
+        this.setTlvLength(header.tlvLength());
+    }
+
+    /**
+     * Adds value of un reserved bandwidth .
+     *
+     * @param unreservedBandwidth value of un reserved bandwidth
+     */
+    public void addUnReservedBandwidth(float unreservedBandwidth) {
+        this.unReservedBandwidth.add(unreservedBandwidth);
+    }
+
+    /**
+     * Gets list of un reserved bandwidth .
+     *
+     * @return List of un reserved bandwidth
+     */
+    public List<Float> getUnReservedBandwidthValue() {
+        return this.unReservedBandwidth;
+    }
+
+    /**
+     * Reads bytes from channel buffer .
+     *
+     * @param channelBuffer channel buffer instance
+     */
+    public void readFrom(ChannelBuffer channelBuffer) {
+        while (channelBuffer.readableBytes() >= IsisUtil.FOUR_BYTES) {
+            int maxReversibleBandwidth = channelBuffer.readInt();
+            this.addUnReservedBandwidth(Float.intBitsToFloat(maxReversibleBandwidth));
+        }
+    }
+
+    /**
+     * Gets instance as byte array.
+     *
+     * @return instance as byte array
+     */
+    public byte[] asBytes() {
+        byte[] linkSubType = null;
+
+        byte[] linkSubTlvHeader = tlvHeaderAsByteArray();
+        byte[] linkSubTlvBody = tlvBodyAsBytes();
+        linkSubType = Bytes.concat(linkSubTlvHeader, linkSubTlvBody);
+
+        return linkSubType;
+    }
+
+    /**
+     * Gets unreserved bandwidth as byte array.
+     *
+     * @return unreserved bandwidth as byte array
+     */
+    public byte[] tlvBodyAsBytes() {
+        List<Byte> linkSubTypeBody = new ArrayList<>();
+        if (this.unReservedBandwidth.size() < 8) {
+            int size = IsisUtil.EIGHT_BYTES - this.unReservedBandwidth.size();
+            for (int i = 0; i < size; i++) {
+                linkSubTypeBody.addAll(Bytes.asList(IsisUtil.convertToFourBytes(IsisUtil.INITIAL_BANDWIDTH)));
+            }
+        }
+        for (Float unreservedBandwidth : this.unReservedBandwidth) {
+            int unresBandwidth = Float.floatToIntBits(unreservedBandwidth);
+            linkSubTypeBody.addAll(Bytes.asList(IsisUtil.convertToFourBytes(unresBandwidth)));
+        }
+
+        return Bytes.toArray(linkSubTypeBody);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(getClass())
+                .omitNullValues()
+                .add("unReservedBandwidth", unReservedBandwidth)
+                .toString();
+    }
+}
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/package-info.java
new file mode 100644
index 0000000..699b513
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/isispacket/tlv/subtlv/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.tlv.subtlv;
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/package-info.java
old mode 100755
new mode 100644
index d1601a4..4d5ac06
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/package-info.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/package-info.java
@@ -15,6 +15,6 @@
  */
 
 /**
- * Implementation of the ISIS protocol.
+ * Implementation of the ISIS protocol IO.
  */
 package org.onosproject.isis.io;
\ No newline at end of file
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
new file mode 100644
index 0000000..d6b91f9
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/ChecksumCalculator.java
@@ -0,0 +1,81 @@
+/*
+ * 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 java.util.Arrays;
+
+/**
+ * Calculates checksum for ISIS LSP packets.
+ */
+public class ChecksumCalculator {
+
+    /**
+     * Verifies the checksum is valid in given LSP packet bytes.
+     *
+     * @param lspPacket       lsp as byte array
+     * @param lspChecksumPos1 position of checksum bit in packet
+     * @param lspChecksumPos2 position of checksum bit in packet
+     * @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;
+        }
+        return false;
+    }
+
+
+    /**
+     * Calculates the LSP checksum.
+     *
+     * @param lspBytes        as byte array
+     * @param lspChecksumPos1 position of checksum bit in packet
+     * @param lspChecksumPos2 position of checksum bit in packet
+     * @return checksum bytes
+     */
+    public byte[] calculateLspChecksum(byte[] lspBytes, int lspChecksumPos1, int lspChecksumPos2) {
+
+        byte[] tempLsaByte = Arrays.copyOf(lspBytes, lspBytes.length);
+
+        int[] checksumOut = {0, 0};
+        tempLsaByte[lspChecksumPos1] = 0;
+        tempLsaByte[lspChecksumPos2] = 0;
+        byte[] byteCheckSum = {0, 0};
+        if (lspBytes != null) {
+            for (int i = 12; i < tempLsaByte.length; i++) {
+                checksumOut[0] = checksumOut[0] + ((int) tempLsaByte[i] & 0xFF);
+                checksumOut[1] = checksumOut[1] + checksumOut[0];
+            }
+            checksumOut[0] = checksumOut[0] % 255;
+            checksumOut[1] = checksumOut[1] % 255;
+        }
+        int byte1 = (int) ((tempLsaByte.length - lspChecksumPos1 - 1) * checksumOut[0] - checksumOut[1]) % 255;
+        if (byte1 <= 0) {
+            byte1 += 255;
+        }
+        int byte2 = 510 - checksumOut[0] - byte1;
+        if (byte2 > 255) {
+            byte2 -= 255;
+        }
+
+        byteCheckSum[0] = (byte) byte1;
+        byteCheckSum[1] = (byte) byte2;
+
+        return byteCheckSum;
+    }
+}
\ 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
new file mode 100644
index 0000000..53ef74b
--- /dev/null
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisConstants.java
@@ -0,0 +1,57 @@
+/*
+ * 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;
+
+/**
+ * Representation of ISIS constants.
+ */
+public final class IsisConstants {
+    public static final char PDU_LENGTH = 1497; // mtu (1500) - (3) LLC
+    public static final int MINIMUM_FRAME_LEN = 1521;
+    public static final int METADATA_LEN = 7;
+    public static final String SHOST = "127.0.0.1";
+    public static final int SPORT = 3000;
+    public static final byte L2 = 1;
+    public static final int IRPDISCRIMINATOR = 131;
+    public static final int ISISVERSION = 1;
+    public static final int RESERVED = 0;
+    public static final int MAXAREAADDRESS = 0;
+    public static final int IDLENGTH = 0;
+    public static final int PROTOCOLSUPPORTED = 204;
+    public static final int LOCALCIRCUITIDFORP2P = 130;
+    public static final int P2PHELLOHEADERLENGTH = 20;
+    public static final int HELLOHEADERLENGTH = 27;
+    public static final int CSNPDUHEADERLENGTH = 33;
+    public static final int PSNPDUHEADERLENGTH = 17;
+    public static final int PDULENGTHPOSITION = 17;
+    public static final int COMMONHEADERLENGTH = 8;
+    public static final int LSPMAXAGE = 1200;
+    public static final int LSPREFRESH = 900;
+    public static final int MAXSEQUENCENUMBER = Integer.MAX_VALUE;
+    public static final int STARTLSSEQUENCENUM = 1;
+    public static final int LENGTHPOSITION = 8;
+    public static final int RESERVEDPOSITION = 6;
+    public static final int CHECKSUMPOSITION = 24;
+    public static final String REFRESHLSP = "refreshLsp";
+    public static final String MAXAGELSP = "maxAgeLsp";
+
+    /**
+     * Non parameterized constructor.
+     */
+    private IsisConstants() {
+    }
+}
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisUtil.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/IsisUtil.java
old mode 100755
new mode 100644
index e929f8b..318eb1b
--- 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
@@ -15,11 +15,13 @@
  */
 package org.onosproject.isis.io.util;
 
-
-import com.google.common.base.MoreObjects;
 import com.google.common.primitives.Bytes;
+import org.onlab.packet.Ip4Address;
 import org.onosproject.isis.io.isispacket.tlv.PaddingTlv;
 import org.onosproject.isis.io.isispacket.tlv.TlvHeader;
+import org.onosproject.isis.io.isispacket.tlv.TlvType;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import javax.xml.bind.DatatypeConverter;
 import java.util.ArrayList;
@@ -27,56 +29,57 @@
 import java.util.StringTokenizer;
 
 /**
- * Represents ISIS utils.
+ * Representation of ISIS utils.
  */
 public final class IsisUtil {
-    public static final int AREAADDRESS = 1;
-    public static final int ISREACHABILITY = 2;
-    public static final int ISNEIGHBORS = 6;
-    public static final int PADDING = 8;
-    public static final int LSPENTRY = 9;
-    public static final int AUTHENTICATION = 10;
-    public static final int CHECKSUM = 12;
-    public static final int EXTENDEDISREACHABILITY = 22;
-    public static final int ISALIAS = 24;
-    public static final int IPINTERNALREACHABILITY = 128;
-    public static final int PROTOCOLSUPPORTED = 129;
-    public static final int IPEXTERNALREACHABILITY = 130;
-    public static final int IDRPINFORMATION = 131;
-    public static final int IPINTERFACEADDRESS = 132;
-    public static final int L1HELLOPDU = 1;
-    public static final int L2HELLOPDU = 2;
-    public static final int P2PHELLOPDU = 3;
-    public static final int L1LSPDU = 18;
-    public static final int L2LSPDU = 20;
-    public static final int L1CSNP = 24;
-    public static final int L2CSNP = 25;
-    public static final int L1PSNP = 26;
-    public static final int L2PSNP = 27;
-    public static final int L1L2_LS_PDUHEADERLENGTH = 27;
-    public static final int P2PPDUHEADERLENGTH = 20;
-    public static final int PSNPPDUHEADERLENGTH = 17;
-    public static final char ETHER_FRAME_LEN = 1514;
+    public static final int ETHER_HEADER_LEN = 17;
     public static final int ID_SIX_BYTES = 6;
     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 SIX_BYTES = 6;
+    public static final int EIGHT_BYTES = 8;
     public static final int FOUR_BYTES = 4;
     public static final int PADDING_FIXED_LENGTH = 255;
+    public static final int TLVHEADERLENGTH = 2;
+    public static final int INITIAL_BANDWIDTH = 12500000;
+    private static final Logger log = LoggerFactory.getLogger(IsisUtil.class);
 
     /**
-     * Creates an instance of this class.
+     * Creates an instance.
      */
     private IsisUtil() {
 
     }
 
     /**
+     * Checks given IPs are in same network or not.
+     *
+     * @param ip1  IP address
+     * @param ip2  IP address
+     * @param mask network mask
+     * @return true if both are in same network else false
+     */
+    public static boolean sameNetwork(Ip4Address ip1, Ip4Address ip2, byte[] mask) {
+        try {
+            byte[] a1 = ip1.toOctets();
+            byte[] a2 = ip2.toOctets();
+            for (int i = 0; i < a1.length; i++) {
+                if ((a1[i] & mask[i]) != (a2[i] & mask[i])) {
+                    return false;
+                }
+            }
+        } catch (Exception e) {
+            log.debug("Exception::IsisUtil::sameNetwork:: {}", e.getMessage());
+        }
+        return true;
+    }
+
+    /**
      * Parse byte array to string system ID.
      *
      * @param bytes system ID
-     * @return systemId system ID.
+     * @return systemId system ID
      */
     public static String systemId(byte[] bytes) {
         String systemId = "";
@@ -97,7 +100,7 @@
      * Parse byte array to LAN ID.
      *
      * @param bytes LAN ID
-     * @return systemId system ID.
+     * @return systemIdPlus system ID
      */
     public static String systemIdPlus(byte[] bytes) {
         String systemId = "";
@@ -119,23 +122,18 @@
      * Parse byte array to area address.
      *
      * @param bytes area address
-     * @return areaAddress area address
+     * @return areaAddres area address
      */
     public static String areaAddres(byte[] bytes) {
-        int count = 0;
-        String areaAddress = "";
+        String areaAddres = "";
         for (Byte byt : bytes) {
             String hexa = Integer.toHexString(Byte.toUnsignedInt(byt));
             if (hexa.length() % 2 != 0) {
                 hexa = "0" + hexa;
             }
-            if (count == 0) {
-                hexa = hexa + ".";
-            }
-            areaAddress = areaAddress + hexa;
-            count++;
+            areaAddres = areaAddres + hexa;
         }
-        return areaAddress;
+        return areaAddres;
     }
 
     /**
@@ -144,76 +142,98 @@
      * @param address area address
      * @return areaAddress area address
      */
-    public static List<Byte> areaAddresToBytes(String address) {
-        List<Byte> idLst = new ArrayList();
-        StringTokenizer tokenizer = new StringTokenizer(address, ".");
-        int count = 0;
-        while (tokenizer.hasMoreElements()) {
-            String str = tokenizer.nextToken();
-            if (str.length() % 2 != 0) {
-                str = "0" + str;
-            }
-            if (count > 0) {
-
-                for (int i = 0; i < str.length(); i = i + 2) {
-                    idLst.add((byte) Integer.parseInt(str.substring(i, i + 2), 16));
-                }
-            } else {
-                idLst.add((byte) Integer.parseInt(str, 16));
-            }
-            count++;
+    public static List<Byte> areaAddressToBytes(String address) {
+        List<Byte> idList = new ArrayList<>();
+        for (int i = 0; i < address.length(); i = i + 2) {
+            Character c1 = address.charAt(i);
+            Character c2 = address.charAt(i + 1);
+            String str = c1.toString() + c2.toString();
+            idList.add((byte) Integer.parseInt(str, 16));
         }
-        return idLst;
+        return idList;
     }
 
     /**
-     * Gets PDU header length.
+     * Adds the PDU length in packet.
      *
-     * @param pduType PDU type
-     * @return headerLength header length
+     * @param isisPacket      ISIS packet
+     * @param lengthBytePos1  length byte position
+     * @param lengthBytePos2  length byte position
+     * @param reservedBytePos reserved byte position
+     * @return byte array with PDU length
      */
-    public static int getPduHeaderLength(int pduType) {
-        int headerLength = 0;
-        switch (pduType) {
-            case L1HELLOPDU:
-            case L2HELLOPDU:
-            case L1LSPDU:
-            case L2LSPDU:
-                headerLength = L1L2_LS_PDUHEADERLENGTH;
-                break;
-            case P2PHELLOPDU:
-                headerLength = P2PPDUHEADERLENGTH;
-                break;
-            case L1PSNP:
-            case L2PSNP:
-                headerLength = PSNPPDUHEADERLENGTH;
-                break;
-            default:
-                break;
+    public static byte[] addLengthAndMarkItInReserved(byte[] isisPacket, int lengthBytePos1,
+                                                      int lengthBytePos2, int reservedBytePos) {
+        //Set the length of the packet
+        //Get the total length of the packet
+        int length = isisPacket.length;
+        //Convert the lenth to two bytes as the length field is 2 bytes
+        byte[] lenthInTwoBytes = IsisUtil.convertToTwoBytes(length);
+        //isis header 3rd and 4th position represents length
+        isisPacket[lengthBytePos1] = lenthInTwoBytes[0]; //assign 1st byte in lengthBytePos1
+        isisPacket[lengthBytePos2] = lenthInTwoBytes[1]; //assign 2st byte in lengthBytePos2
+        isisPacket[reservedBytePos] = (byte) lengthBytePos1;
+        return isisPacket;
+    }
+
+    /**
+     * Adds the checksum in packet.
+     *
+     * @param isisPacket       ISIS packet
+     * @param checksumBytePos1 checksum byte position
+     * @param checksumBytePos2 checksum byte position
+     * @return byte array with PDU length
+     */
+    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
+        byte[] checksumInTwoBytes = new ChecksumCalculator().calculateLspChecksum(
+                isisPacket, checksumBytePos1, checksumBytePos2);
+        //isis header 3rd and 4th position represents length
+        isisPacket[checksumBytePos1] = checksumInTwoBytes[0];
+        isisPacket[checksumBytePos2] = checksumInTwoBytes[1];
+        return isisPacket;
+    }
+
+    /**
+     * Adds frame a packet of 1498 of size.
+     *
+     * @param isisPacket     ISIS packet
+     * @param interfaceIndex interface index
+     * @return byte array with 1498 is the length
+     */
+    public static byte[] framePacket(byte[] isisPacket, int interfaceIndex) {
+        //Set the length of the packet
+        //Get the total length of the packet
+        int length = isisPacket.length;
+        //PDU_LENGTH + 1 byte for interface index
+        if (length < IsisConstants.PDU_LENGTH + 1) {
+            byte[] bytes = new byte[IsisConstants.PDU_LENGTH + 1];
+            System.arraycopy(isisPacket, 0, bytes, 0, length);
+            bytes[IsisConstants.PDU_LENGTH] = (byte) interfaceIndex;
+            return bytes;
         }
-        return headerLength;
+        return isisPacket;
     }
 
     /**
      * Parse source and LAN ID.
      *
      * @param id source and LAN ID
-     * @return sourceAndLanIdToBytes source and LAN ID
+     * @return source and LAN ID
      */
     public static List<Byte> sourceAndLanIdToBytes(String id) {
-        List<Byte> idLst = new ArrayList();
-
-        StringTokenizer tokenizer = new StringTokenizer(id, ".");
+        List<Byte> idList = new ArrayList<>();
+        StringTokenizer tokenizer = new StringTokenizer(id, "." + "-");
         while (tokenizer.hasMoreElements()) {
             int i = 0;
             String str = tokenizer.nextToken();
-            idLst.add((byte) Integer.parseInt(str.substring(0, i + 2), 16));
+            idList.add((byte) Integer.parseInt(str.substring(0, i + 2), 16));
             if (str.length() > 2) {
-                idLst.add((byte) Integer.parseInt(str.substring(i + 2, str.length()), 16));
+                idList.add((byte) Integer.parseInt(str.substring(i + 2, str.length()), 16));
             }
-
         }
-        return idLst;
+        return idList;
     }
 
     /**
@@ -222,20 +242,20 @@
      * @param currentLength current length
      * @return byteArray padding array
      */
-    public static byte[] paddingForPdu(int currentLength) {
+    public static byte[] getPaddingTlvs(int currentLength) {
         List<Byte> bytes = new ArrayList<>();
-        while (ETHER_FRAME_LEN > currentLength) {
-            int length = ETHER_FRAME_LEN - currentLength;
+        while (IsisConstants.PDU_LENGTH > currentLength) {
+            int length = IsisConstants.PDU_LENGTH - currentLength;
             TlvHeader tlvHeader = new TlvHeader();
-            tlvHeader.setTlvType(PADDING);
+            tlvHeader.setTlvType(TlvType.PADDING.value());
             if (length >= PADDING_FIXED_LENGTH) {
                 tlvHeader.setTlvLength(PADDING_FIXED_LENGTH);
             } else {
-                tlvHeader.setTlvLength(ETHER_FRAME_LEN - currentLength);
+                tlvHeader.setTlvLength(IsisConstants.PDU_LENGTH - (currentLength + TLVHEADERLENGTH));
             }
             PaddingTlv tlv = new PaddingTlv(tlvHeader);
             bytes.addAll(Bytes.asList(tlv.asBytes()));
-            currentLength = currentLength + tlv.tlvLength();
+            currentLength = currentLength + tlv.tlvLength() + TLVHEADERLENGTH;
         }
         byte[] byteArray = new byte[bytes.size()];
         int i = 0;
@@ -243,7 +263,6 @@
             byteArray[i++] = byt;
         }
         return byteArray;
-
     }
 
     /**
@@ -308,10 +327,138 @@
         return numInBytes;
     }
 
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .omitNullValues()
-                .toString();
+    /**
+     * Converts a byte to integer variable.
+     *
+     * @param bytesToConvert bytes to convert
+     * @return integer representation of bytes
+     */
+    public static int byteToInteger(byte[] bytesToConvert) {
+        final StringBuilder builder = new StringBuilder();
+        for (byte eachByte : bytesToConvert) {
+            builder.append(String.format("%02x", eachByte));
+        }
+        int number = Integer.parseInt(builder.toString(), 16);
+        return number;
     }
-}
\ No newline at end of file
+
+    /**
+     * Converts a byte to long variable.
+     *
+     * @param bytesToConvert bytes to convert
+     * @return long representation of bytes
+     */
+    public static long byteToLong(byte[] bytesToConvert) {
+        final StringBuilder builder = new StringBuilder();
+        for (byte eachByte : bytesToConvert) {
+            builder.append(String.format("%02x", eachByte));
+        }
+        long number = Long.parseLong(builder.toString(), 16);
+        return number;
+    }
+
+    /**
+     * Converts a number to four bytes.
+     *
+     * @param numberToConvert number to convert
+     * @return numInBytes given number as bytes
+     */
+    public static byte[] convertToFourBytes(long numberToConvert) {
+        byte[] numInBytes = new byte[4];
+        String s1 = Long.toHexString(numberToConvert);
+        if (s1.length() % 2 != 0) {
+            s1 = "0" + s1;
+        }
+        if (s1.length() == 16) {
+            s1 = s1.substring(8, s1.length());
+        }
+        byte[] hexas = DatatypeConverter.parseHexBinary(s1);
+        if (hexas.length == 1) {
+            numInBytes[0] = 0;
+            numInBytes[1] = 0;
+            numInBytes[2] = 0;
+            numInBytes[3] = hexas[0];
+        } else if (hexas.length == 2) {
+            numInBytes[0] = 0;
+            numInBytes[1] = 0;
+            numInBytes[2] = hexas[0];
+            numInBytes[3] = hexas[1];
+        } else if (hexas.length == 3) {
+            numInBytes[0] = 0;
+            numInBytes[1] = hexas[0];
+            numInBytes[2] = hexas[1];
+            numInBytes[3] = hexas[2];
+        } else {
+            numInBytes[0] = hexas[0];
+            numInBytes[1] = hexas[1];
+            numInBytes[2] = hexas[2];
+            numInBytes[3] = hexas[3];
+        }
+        return numInBytes;
+    }
+
+    /**
+     * Converts a number to eight bit binary.
+     *
+     * @param binaryString string to binary
+     * @return numInBytes given number as bytes
+     */
+    public static String toEightBitBinary(String binaryString) {
+        String eightBit = binaryString;
+        if (eightBit.length() % 8 != 0) {
+            int numOfZero = 8 - eightBit.length();
+            while (numOfZero > 0) {
+                eightBit = "0" + eightBit;
+                numOfZero--;
+            }
+        }
+        return eightBit;
+    }
+
+    /**
+     * Converts a number to four bit binary.
+     *
+     * @param binaryString string to binary
+     * @return numInBytes given number as bytes
+     */
+    public static String toFourBitBinary(String binaryString) {
+        String fourBit = binaryString;
+        if (fourBit.length() % 4 != 0) {
+            int numOfZero = 4 - fourBit.length();
+            while (numOfZero > 0) {
+                fourBit = "0" + fourBit;
+                numOfZero--;
+            }
+        }
+        return fourBit;
+    }
+
+    /**
+     * Converts a number to three bytes.
+     *
+     * @param numberToConvert number to convert
+     * @return given number as bytes
+     */
+    public static byte[] convertToThreeBytes(int numberToConvert) {
+        byte[] numInBytes = new byte[4];
+        String s1 = Integer.toHexString(numberToConvert);
+        if (s1.length() % 2 != 0) {
+            s1 = "0" + s1;
+        }
+        byte[] hexas = DatatypeConverter.parseHexBinary(s1);
+        if (hexas.length == 1) {
+            numInBytes[0] = 0;
+            numInBytes[1] = 0;
+            numInBytes[2] = hexas[0];
+        } else if (hexas.length == 2) {
+            numInBytes[0] = 0;
+            numInBytes[1] = hexas[0];
+            numInBytes[2] = hexas[1];
+        } else {
+            numInBytes[0] = hexas[0];
+            numInBytes[1] = hexas[1];
+            numInBytes[2] = hexas[2];
+        }
+        return numInBytes;
+    }
+}
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/package-info.java
old mode 100755
new mode 100644
index 0fca245..9156248
--- a/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/package-info.java
+++ b/protocols/isis/isisio/src/main/java/org/onosproject/isis/io/util/package-info.java
@@ -15,6 +15,6 @@
  */
 
 /**
- * Implementation of the ISIS protocol.
+ * Implementation of the ISIS protocol util.
  */
 package org.onosproject.isis.io.util;
\ No newline at end of file
diff --git a/protocols/isis/isisio/src/main/java/org/onosproject/isis/package-info.java b/protocols/isis/isisio/src/main/java/org/onosproject/isis/package-info.java
old mode 100755
new mode 100644
